解析嵌套块结构我有这个程序使用ANTLR
{
run_and_branch(Test1)
then
{
}
else
{
}
{
run_and_branch(Test2)
then
{
}
else
{
run(Test3);
run(Test4);
run(Test5);
}
}
run_and_branch(Test6)
then
{
}
else
{
}
run(Test7);
{
run(Test8);
run(Test9);
run(Test_10);
}
}
下面是我ANLTR语法文件
prog
: block EOF;
block
: START_BLOCK END_BLOCK -> BLOCK|
START_BLOCK block* END_BLOCK -> block*|
test=run_statement b=block* -> ^($test $b*)|
test2=run_branch_statement THEN pass=block ELSE fail=block -> ^($test2 ^(PASS $pass) ^(FAIL $fail))
;
run_branch_statement
: RUN_AND_BRANCH OPEN_BRACKET ID CLOSE_BRACKET -> ID;
run_statement
: RUN OPEN_BRACKET ID CLOSE_BRACKET SEMICOLON -> ID;
THEN : 'then';
ELSE : 'else';
RUN_AND_BRANCH : 'run_and_branch';
RUN : 'run';
START_BLOCK
: '{' ;
END_BLOCK
: '}' ;
OPEN_BRACKET
: '(';
CLOSE_BRACKET
: ')';
SEMICOLON
: ';'
;
ID : ('a'..'z'|'A'..'Z'|'_'|'0'..'9') (':'|'%'|'='|'\''|'a'..'z'|'A'..'Z'|'0'..'9'|'_'|'-'|'.'|'+'|'*'|'/'|'\\')*
;
WS : (' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
使用ANTLWorks我碰到下面的AST:
正如你在AST中看到的那样,Test1和Test2之间没有任何联系。我想有AST显示此信息,以便我可以遍历AST并获得测试depedency结构
我期待的AST是这个样子
“Test2”不在“Test1”的'then'或'else'块中,所以我不确定你的意思是“Test1和Test2之间没有链接”。你可以发布你想获得的AST图像吗? – 2013-03-19 09:38:13
我还是不明白。在你的第二张图片中,流程对我来说似乎没有问题:“Test1”,然后是“Test2”,然后是“Test6”(图像1中已经是这样)。你的意思是你错过了“Test5”和“Test6”之间的链接。意识到你现在发布的内容不是AST,而是图表。另外,“Test7”消失了。突然间... – 2013-03-19 10:22:57
我忘了Test7,当我手动绘制第二张照片时,它应该在那里。正如你在第二张照片中看到的那样,Test2是Test1的孩子,而在第一张照片中他们是兄弟姐妹。我想要第二张图片这样的东西,以便我可以做一个DFS并确定按顺序完成的测试。 Test1然后Test2然后Test3等等。在原始AST中做这件事非常困难,我有 – tabiul 2013-03-19 10:30:54