ANTLR4 - '#'上的语法错误(替代规则标签)

时间:2015-04-16 12:17:43

标签: parsing antlr antlr4

我已经制作了一个将与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和各种在线示例,我的语法似乎是正确的。

可能导致错误的原因是什么?

1 个答案:

答案 0 :(得分:3)

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

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

根据经验,只有在没有上下文的情况下才会使用词法分析器规则,生成的令牌旁边的内容并不重要。像数字常量,字符串常量,标识符等等。