使用ANTLR解析嵌套块结构

使用ANTLR解析嵌套块结构,antlr,Antlr,我有这个节目 { run_and_branch(Test1) then { } else { } { run_and_branch(Test2) then { } else { run(Test3); run(Test4); run(Test5); } } run_and_branch(

我有这个节目

{
    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中看到的,Test1和Test2之间没有作为依赖项的链接。我想让AST显示这些信息,这样我就可以遍历AST并获得测试依赖性结构


我希望AST看起来像这样

ANTLR不能以这种方式工作。ANTLR生成一棵树,而不是一个图,因此无法在语法级别表示所需的输出。此外,如果您试图以这种方式将尾部递归规则写入链接控制流,您将很快遇到堆栈溢出异常,因为ANTLR生成递归下降解析器


您需要获取ANTLR生成的AST,并对其执行单独的控制流分析,以获得控制流图。

“Test2”不在“Test1”的
然后
else
块中,因此我不确定“Test1和Test2之间没有链接”是什么意思。你能贴一张你想要的AST的图片吗?我还是不明白。在您的第二幅图像中,流程对我来说似乎没问题:“Test1”然后是“Test2”,然后是“Test6”(在图像1中已经是这样)。您的意思是说您缺少“Test5”和“Test6”之间的链接吗。意识到你现在发布的不是AST,而是一个图表。而且,“Test7”也不见了。突然…当我手动绘制第二张图片时,我忘记了Test7,它应该在那里。正如您在第二张图片中看到的,Test2是Test1的子级,而在第一张图片中,它们是兄弟。我想要像第二张图片这样的东西,这样我可以做一个DFS并确定按顺序进行的测试。测试1,然后测试2,然后测试3等等。在我拥有的原始AST中很难做到这一点。是的,我最终似乎意识到了我的错误。我试图做一些使用AST:)无法完成的事情。你有什么想法或链接,我可以用来将AST转换成我需要的CFG。