我尝试解析:
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;
解析为statement
,而是解析为functions statement program
。
我认为return语句被解析为
statement='return 3 + 4;' EOF
而不是
statement='return 3 + 4;' statements='' program=?
也不是
functions='' statement='return 3 + 4;' program=?
我的问题是,为什么ANTLR试图将其解析为第二和第三条规则?