我尝试解析:
return 3 + 4;
我的解析代码(见下文)将其解析为第二条规则(statement statements program)而不是第一条规则。如果我注释掉第二条规则,那么解析器会将其解释为第三条规则 ( 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");
};
注意:“语句”和“函数”可以为空
另外,假设expr是正确的:)(它不能为空)
一些澄清:
statements : statement* ;
当我运行时parser.program(),我希望它return 3 + 4;应该正确解析(然后EOF它不会被任何解析规则捕获);但是,return 'return 3 + 4;'不被视为语句,而是statement statements program.
注释掉该规则后,我的解析器仍然不会解析return 3 + 4;为 astatement而是解析为functions statement program.
我认为 return 语句被解析为
statement='return 3 + 4;' EOF
并不是
statement='return 3 + 4;' statements='' program=?
而且也不是
functions='' statement='return 3 + 4;' program=?
我的问题是,为什么 ANTLR 试图将其解析为第二条和第三条规则?