2013-03-19 56 views
0

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

正如你在AST中看到的那樣,Test1和Test2之間沒有任何聯繫。我想有AST顯示此信息,以便我可以遍歷AST並獲得測試depedency結構

我期待的AST是這個樣子Expected AST

+1

「Test2」不在「Test1」的'then'或'else'塊中,所以我不確定你的意思是「Test1和Test2之間沒有鏈接」。你可以發佈你想獲得的AST圖像嗎? – 2013-03-19 09:38:13

+0

我還是不明白。在你的第二張圖片中,流程對我來說似乎沒有問題:「Test1」,然後是「Test2」,然後是「Test6」(圖像1中已經是這樣)。你的意思是你錯過了「Test5」和「Test6」之間的鏈接。意識到你現在發佈的內容不是AST,而是圖表。另外,「Test7」消失了。突然間... – 2013-03-19 10:22:57

+0

我忘了Test7,當我手動繪製第二張照片時,它應該在那裏。正如你在第二張照片中看到的那樣,Test2是Test1的孩子,而在第一張照片中他們是兄弟姐妹。我想要第二張圖片這樣的東西,以便我可以做一個DFS並確定按順序完成的測試。 Test1然後Test2然後Test3等等。在原始AST中做這件事非常困難,我有 – tabiul 2013-03-19 10:30:54

回答

2

ANTLR不以這種方式工作。 ANTLR生成一棵樹,而不是一個圖,所以在語法層面上無法表示所需的輸出。另外,如果您嘗試編寫尾遞歸規則以這種方式鏈接控制流,您將很快遇到堆棧溢出異常,因爲ANTLR會生成遞歸下降解析器。

您需要採用ANTLR生成的AST,並對其執行單獨的控制流分析以獲得控制流圖。

+0

是的,我終於明白了我的錯誤。我正在嘗試使用AST無法完成的事情:)。你有什麼想法或鏈接可以用來將AST轉換成我需要的CFG。 – tabiul 2013-03-19 14:36:57