我有下面的小语法。node
表示开始生产。当我的输入是(a:b)
时,我得到一个错误:line 1:1 extraneous input 'a' expecting {':', INAME}
为什么会这样?
EDIT -我忘记了词法分析器和解析器作为单独的阶段运行。到解析器运行时,词法分析器已经完成。当词法分析器运行时,它不知道解析器规则。它已经根据@bart的推理做出了TYPE/INAME决定。
grammar g1;
TYPE: [A-Za-z_];
INAME: [A-Za-z_];
node: '(' namesAndTypes ')';
namesAndTypes:
INAME ':' TYPE
| ':' TYPE
| INAME
;
这是因为词法分析器永远不会生成INAME
令牌。词法分析器在下列情况下工作:
- 尝试匹配尽可能多的字符
- 当两个或多个词法分析器规则匹配相同的字符时,让先定义的那个"win">
因为输入的"a"
和"b"
都匹配TYPE
和INAME
规则,所以TYPE
规则胜出,因为它首先定义。解析器是否试图匹配INAME
规则并不重要,词法分析器不会生成它。词法分析器不"听"。解析器。
您可以创建某种ID
规则,然后定义type
和iname
解析器规则:
ID: [A-Za-z_];
node
: '(' namesAndTypes ')'
;
namesAndTypes
: iname ':' type
| ':' type
| iname
;
type
: ID
;
iname
: ID
;