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

标签 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。此代码中有哪些新内容?请给我一个快速解决方案。

最佳答案

您的 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]+
    ;

关于c# - 错误 - 词法分析器规则 'xxxx' 中的操作必须是单个最外层 alt 的最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18456455/

相关文章:

c# - 了解 C# 和 Java 上传统迭代和增强迭代的实现

c# - 是否可以将应用程序配置中的更改序列化到应用程序的 app.config 文件中?

java - 在 Antlr 3 中生成自定义 JavaDoc

java - 如何在 ANTLR3 TreeParser 中获取行号

c# - 在.cs设计表单中c#中的datagridview中添加固定行数

c# - 如何在 C# 中将其更改为 String.Format

javascript - 使用 ANTLR 解析 JavaDoc 注释

java.lang.NoSuchMethodError : antlr. collections.AST.getLine()我只使用hibernate

antlr - 如何删除 ANTLR3 警告 'multiple alternatives'

java - ANTLR 解析器匹配标记而不是标识符