2013-03-19 59 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