【问题标题】:ANTLR4 - Syntax error on '#' (alternative rule label)ANTLR4 - '#' 上的语法错误(替代规则标签)
【发布时间】:2015-04-16 12:17:43
【问题描述】:

我已经制作了一个将与 ANTLR4 一起使用的语法,其表达式定义如下:

// Expressions
Expr : Integer               # Expr_Integer
    | Float                  # Expr_Float
    | Double                 # Expr_Double
    | String                 # Expr_String
    | Variable               # Expr_Variable
    | FuncCall               # Expr_FuncCall
    | Expr Op_Infix Expr     # Expr_Infix
    | Op_Prefix Expr         # Expr_Prefix
    | Expr Op_Postfix        # Expr_Postfix
    | Expr 'is' Id           # Expr_Is
    | 'this'                 # Expr_This
    | Expr '?' Expr ':' Expr # Expr_Ternary
    | '(' Expr ')'           # Expr_Bracketed
    ;

我添加了标签,以便在分析生成的语法树时可以轻松区分不同的表达式类型。但是,ANTLR4 对上述每一行(不包括带有注释的行)都会抛出以下错误:

error(50): Ash.g4:88:19: syntax error: '#' came as a complete surprise to me while looking for lexer rule element

第 88 行是最终规则替代 ('(' Expr ')')

我查看了documentation 和各种在线示例,我的语法似乎是正确的。

什么可能导致错误被抛出?

【问题讨论】:

    标签: parsing antlr antlr4


    【解决方案1】:

    在 Antlr 中,以大写字母开头的规则是词法规则,以小写字母开头的规则是解析器规则。 Antlr 大量使用这些定义来定义你能做什么和不能做什么。通常,词法分析器的处理速度更快,但功能不如解析器。

    在你的情况下,Expr 绝对应该是一个解析器规则,基本上你在那里引用的所有其他规则。将其更改为 expr 应该符合预期的行为。

    根据经验,词法分析器规则仅在没有上下文时使用,生成的标记旁边的内容无关紧要。诸如数字常量、字符串常量、标识符之类的东西。

    【讨论】:

    • 谢谢!这个小“功能”有点烦人,但我想我们必须忍受设计师的选择。毕竟这是一款不错的软件。
    猜你喜欢
    • 2015-09-08
    • 2021-10-22
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多