为什么我的antlr语法给我一个错误?



我有下面的小语法。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令牌。词法分析器在下列情况下工作:

  1. 尝试匹配尽可能多的字符
  2. 当两个或多个词法分析器规则匹配相同的字符时,让先定义的那个"win">

因为输入的"a""b"都匹配TYPEINAME规则,所以TYPE规则胜出,因为它首先定义。解析器是否试图匹配INAME规则并不重要,词法分析器不会生成它。词法分析器不"听"。解析器。

您可以创建某种ID规则,然后定义typeiname解析器规则:

ID: [A-Za-z_];
node
: '(' namesAndTypes ')'
;
namesAndTypes
: iname ':' type
| ':' type
| iname
;
type
: ID
;
iname
: ID
;

相关内容

最新更新