解析嵌套塊結構我有這個程序使用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