0

私はこのプログラムを持っています

{
    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 を取得します。

ANTLRWorks の AST

AST でわかるように、Test1 と Test2 の間に依存関係としてのリンクはありません。AST にこの情報を表示させて、AST をトラバースして Test depedency Structure を取得できるようにしたい

私はASTがこのように見えることを期待しています予想AST

4

1 に答える 1

2

ANTLR はこのようには機能しません。ANTLR はグラフではなくツリーを生成するため、文法レベルで目的の出力を表す方法はありません。さらに、このように末尾再帰ルールを記述して制御フローをリンクしようとすると、ANTLR が再帰降下パーサーを生成するため、すぐにスタック オーバーフロー例外が発生します。

制御フロー グラフを取得するには、ANTLR によって生成された AST を取得し、個別に制御フロー分析を実行する必要があります。

于 2013-03-19T13:14:37.510 に答える