Antlr4 为什么我的antlr语法会给我一个错误?
我有下面的小语法<代码>节点是开始生产的节点。当我的输入是Antlr4 为什么我的antlr语法会给我一个错误?,antlr4,Antlr4,我有下面的小语法节点是开始生产的节点。当我的输入是(a:b)时,我得到一个错误:行1:1外部输入'a'应为{':',INAME} 为什么会这样 编辑-我忘记了lexer和parser作为单独的阶段运行。当解析器运行时,lexer已经完成。当lexer运行时,它不知道解析器规则。它已经根据@bart下面的推理做出了类型/INAME选择类型的决定 grammar g1; TYPE: [A-Za-z_]; INAME: [A-Za-z_]; node: '(' namesAndTypes ')';
(a:b)
时,我得到一个错误:行1:1外部输入'a'应为{':',INAME}
为什么会这样
编辑-我忘记了lexer和parser作为单独的阶段运行。当解析器运行时,lexer已经完成。当lexer运行时,它不知道解析器规则。它已经根据@bart下面的推理做出了类型/INAME选择类型的决定
grammar g1;
TYPE: [A-Za-z_];
INAME: [A-Za-z_];
node: '(' namesAndTypes ')';
namesAndTypes:
INAME ':' TYPE
| ':' TYPE
| INAME
;
这是因为lexer永远不会生成
INAME
令牌。lexer在以下方面的工作是:
“a”
和“b”
都与类型
和INAME
规则匹配,所以类型
规则获胜,因为它是先定义的。无论解析器是否试图匹配INAME规则,lexer都不会生成它。词法分析器不“听”语法分析器
您可以创建某种类型的ID
规则,然后定义type
和iname
解析器规则:
ID: [A-Za-z_];
node
: '(' namesAndTypes ')'
;
namesAndTypes
: iname ':' type
| ':' type
| iname
;
type
: ID
;
iname
: ID
;