错误 - 词法分析器'xxxx'中的操作必须是单个最外层alt的最后一个元素

时间:2013-08-27 03:29:53

标签: c# antlr antlr3 antlr4

当我从Antlr 3升级到Antlr 4时,我删除了语法中的所有语法谓词。但是当我改变它时,我收到标题中提到的错误。

这是更改后的代码

NUMBER 
    :(
      '0'..'9' ('.' '0'..'9'+)?
    | '.' '0'..'9'+
    )
    (
        E
        (
              M     { $type = EMS;          }
            | X     { $type = EXS;          }
        )
    |   P
        (
              X     
            | T
            | C
        )
                    { $type = LENGTH;       }   
    |   C M         { $type = LENGTH;       }
    |   M
        (
              M     { $type = LENGTH;       }

            | S     { $type = TIME;         }
        )
    |   I N         { $type = LENGTH;       }

    |   D E G       { $type = ANGLE;        }
    |   R A D       { $type = ANGLE;        }

    |   S           { $type = TIME;         }

    |   K? H    Z   { $type = FREQ;         }

    | IDENT         { $type = DIMENSION;    }

    | '%'           { $type = PERCENTAGE;   }

    | // Just a number
    )
;

这是我得到的错误。 enter image description here

我看到了这个问题的答案here。但我无法理解它的含义。请给我一些指导。

编辑:

语法中出现相同的错误。

    fragment    INVALID :;
     STRING          : '\'' ( ~('\n'|'\r'|'\f'|'\'') )* 
                    (

                            '\''
                            | { $type = INVALID;   }
                    )

                | '"' ( ~('\n'|'\r'|'\f'|'"') )*
                    (
                         '"'
                        | { $type = INVALID;   }
                    )
                ;

我无法将其更改为ANTLR 4.此代码中的新功能是什么?请给我一个快速解决方法。

1 个答案:

答案 0 :(得分:2)

您的NUMBER规则已被大量手动左分解。实际上,它是单个词法分析器规则,可生成9种不同类型的令牌。由于ANTLR 3词法分析器使用递归下降解析器进行预测的方式,可能会执行左因子分解。 ANTLR 4使用基于DFA的完全不同的词法分析器算法。您看到的错误是此更改的结果 - 因为ANTLR 4词法分析器不再是递归下降解析器,它们不再能够在任意点执行操作代码。

在ANTLR 4中编写上述规则的最有效方法是使用ANTLR 3中的“低效”语法。在ANTLR 4中,它不会很慢。

EMS
    : NUMBER E M
    ;
EXS
    : NUMBER E X
    ;
LENGTH
    : NUMBER P X
    | NUMBER P T
    | NUMBER P C
    | NUMBER C M
    | NUMBER M M
    | NUMBER I N
    ;
TIME
    : NUMBER M S
    | NUMBER S
    ;
ANGLE
    : NUMBER D E G
    | NUMBER R A D
    ;
FREQ
    : NUMBER K? H Z
    ;
DIMENSION
    : NUMBER IDENT
    ;
PERCENTAGE
    : NUMBER '%'
    ;
NUMBER
    : [0-9] ('.' [0-9]+)?
    | '.' [0-9]+
    ;