Parsing ANTLR4-在'#';(替代规则标签)

Parsing ANTLR4-在'#';(替代规则标签),parsing,antlr,antlr4,Parsing,Antlr,Antlr4,我制作了一个语法,它将与ANTLR4一起使用,表达式的定义如下: // Expressions Expr : Integer # Expr_Integer | Float # Expr_Float | Double # Expr_Double | String # Expr_String | Variable #

我制作了一个语法,它将与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对上述每一行(不包括带注释的行)都抛出以下错误:

第88行是最后一个规则选项(
“('Expr')”

我已经浏览了所有和各种在线示例,我的语法似乎是正确的


什么可能导致抛出错误?

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

在您的例子中,
Expr
肯定应该是一个解析器规则,基本上就像您在这里引用的所有其他规则一样。将其更改为
expr
应符合预期行为

根据经验,lexer规则仅在没有上下文的情况下使用,与生成的令牌旁边的内容无关。数字常量、字符串常量、标识符等。

谢谢!这个小“功能”有点烦人,但我想我们必须忍受设计师的选择。毕竟,这是一个很好的软件。
error(50): Ash.g4:88:19: syntax error: '#' came as a complete surprise to me while looking for lexer rule element