1

我尝试解析:

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

4

0 回答 0