ANTLR4 - “#”语法错误(替代规则标签)
ANTLR4 - Syntax error on '#' (alternative rule label)
我已经制作了一个语法,将与 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 和各种在线示例,我的语法似乎是正确的。
什么可能导致抛出错误?
在Antlr中,以大写字母开头的规则是词法规则,以小写字母开头的规则是解析器规则。 Antlr 大量使用这些定义来定义你能做什么和不能做什么。通常,词法分析器处理速度更快,但不如解析器强大。
在您的情况下,Expr
绝对应该是解析器规则,基本上您在那里引用的所有其他规则也是如此。将其更改为 expr
应该符合预期的行为。
根据经验,仅当没有上下文时才使用词法分析器规则,生成的标记旁边的内容无关紧要。诸如数字常量、字符串常量、标识符等。
我已经制作了一个语法,将与 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 和各种在线示例,我的语法似乎是正确的。
什么可能导致抛出错误?
在Antlr中,以大写字母开头的规则是词法规则,以小写字母开头的规则是解析器规则。 Antlr 大量使用这些定义来定义你能做什么和不能做什么。通常,词法分析器处理速度更快,但不如解析器强大。
在您的情况下,Expr
绝对应该是解析器规则,基本上您在那里引用的所有其他规则也是如此。将其更改为 expr
应该符合预期的行为。
根据经验,仅当没有上下文时才使用词法分析器规则,生成的标记旁边的内容无关紧要。诸如数字常量、字符串常量、标识符等。