ANTLR解析 - 匹配错误但修复是EOF?

时间:2013-09-23 05:40:07

标签: java antlr antlr4

我尝试解析:

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

0 个答案:

没有答案