1

私は解析しようとします:

return 3 + 4;

私の解析コード (以下を参照) はstatement statements program、最初のルールではなく、2 番目のルール ( ) として解析します。2 番目のルールをコメントアウトすると、パーサーはそれを 3 番目のルール ( functions statement program) として解釈します。

これまでに機能した私の「修正」は、次のようにすることです。

master : program EOF ;

これで問題が解決するのはなぜですか?

関連する解析コード:

program
    : statement { 
        System.out.println("STATEMENT PROGRAM");
      }     
    | statement statements program {
        System.out.println("MULTI STATEMENT PROGRAM");
      }
    | functions statement program {
        System.out.println("FUNCTION PROGRAM");
      };

statement :
   RETURN expr SEMICOLON {
        System.out.println("STATEMENT");
   };

注: 'statements' と 'functions' は null 許容にすることができます

また、正しいと仮定しexprます:)(null可能にすることはできません)

明確化:

statements : statement* ;

を実行すると、が適切に解析されるはずです (その後にparser.program()が続き、解析ルールによって捕捉されません)。ただし、ステートメントとしてではなく、.return 3 + 4;EOFreturn 'return 3 + 4;'statement statements program

そのルールをコメントアウトすると、私のパーサーはまだreturn 3 + 4;としてではstatementなく として解析しfunctions statement programます。

return ステートメントは次のように解析されると思います

statement='return 3 + 4;' EOF

そしてそうではない

statement='return 3 + 4;' statements='' program=?

また、そうではありません

functions='' statement='return 3 + 4;' program=?

私の質問は、ANTLR がそれを 2 番目と 3 番目のルールとして解析しようとするのはなぜですか?

4

0 に答える 0