我的antlr语法分析器中出现了一个左递归错误



我得到错误

    [fatal] rule statement has non-LL(*) decision due to recursive rule invocations reachable from alts 6,7. Resolve by left-factoring or using syntactic predicates or using backtrack=true option.  

我不知道我语法的哪一部分出现了这个错误。和其他1个相同的alt 3,4 错误

    parser grammar syn1;
    options {
      tokenVocab = lex1;
      buildAST=true;
    }

    program : 
         statements
         ;
    statements :
            statement ( SEMICOLON^ statement )*
        ;
    statement :
            variable ASSIGN^ exp
        |   SKIP
        |   IF^ boolexp THEN statement ELSE statement
        |   WHILE^ boolexp DO statement
        |   READ^ OPENPAREN! variable CLOSEPAREN! 
        |   WRITE^ OPENPAREN! exp CLOSEPAREN!
        |   WRITE^ OPENPAREN! boolexp CLOSEPAREN!
        |   WRITE^ OPENPAREN! STRING CLOSEPAREN!
        |   WRITELN
        |   OPENPAREN! statements CLOSEPAREN!
        ;
    boolexp : 
            boolterm ( AND^ boolterm )* 
        ;
    boolterm :
            NOT^ bool
        |   bool
        ;
    bool :
            TRUE
        |   FALSE
        |   exp EQUALS^ exp
        |   exp LESSEQUALS^ exp
        |   OPENPAREN! boolexp CLOSEPAREN!
        ;
    exp : 
            term (( ADD | SUBTRACT )^ term )*
        ;
    term :
            factor ( MULTIPLY^ factor ) *
        ;
    factor : 
            variable
        |   INTNUM
        |   OPENPAREN exp CLOSEPAREN
        ;
    variable :
            IDENTIFIERS
        ;

我不知道哪一部分需要重新排列才能删除左递归,如果有人能指出,我将不胜感激。

问题似乎是这两种选择:

    |   WRITE^ OPENPAREN! exp CLOSEPAREN!
    |   WRITE^ OPENPAREN! boolexp CLOSEPAREN!

导致递归的示例输入(即,我可以随心所欲地重复最后一部分,它仍然是这两个规则的有效前缀):

  • WRITE (((((((((((...
  • WRITE ( myVar + myVar + ...

在这两种情况下,在看到+-*ANDNOT) 之前,您都不知道要选择哪种替代方案

相关内容

  • 没有找到相关文章

最新更新