私は解析しようとします:
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;
EOF
return '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 番目のルールとして解析しようとするのはなぜですか?