我尝试解析:
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 试图将其解析为第二条和第三条规则?