ANTLR-为什么未使用的词汇规则会对语法功能产生影响?

时间:2019-06-24 22:17:24

标签: antlr antlr4

所以我正在尝试解析以下文本文件:

    555 5555 

使用这种语法:

grammar PEntry;

entry               : Tab Number Nl;

Tab : '\t';
Nl : '\n';

Number          : Num RSp Num RSp;
//Name       : (RWord RSp)+;

fragment RWord      : (~[\p{Z}])+;
fragment Num        : [0-9]+;
fragment RSp        : [\p{Z}]+;

通过命令行如下:

grun PEntry entry test.txt -gui

让我烦恼的是,如果将“名称”规则保留为注释,它会很好地进行解析,但是如果未对“名称”规则进行注释,则会发生以下错误:

line 1:0 mismatched input '\t555 5555 ' expecting '   '

为什么在目标规则(条目)中甚至未引用名称时,为什么会发生这种情况?在无上下文语法中,任何未由开始变量引用的未使用规则都根本不在语言中,那么什么使antlr与众不同?

更新:(〜[\ p {Z}])+应该是[〜\ p {Z}] +,但是这条规则对语法仍然没有影响吗?我想知道antlr是否可以通过某种方式解析规则使其不同于CFG。

1 个答案:

答案 0 :(得分:0)

词法分析器独立于解析器工作,它不知道解析器使用哪些词法分析器规则,哪些不使用。词法分析器的工作方式是查看您定义的所有词法分析器规则 1 ,然后选择在当前输入上产生最长匹配项的规则(如果是平局,则选择定义的规则)第一)。因此,添加新的词法分析器规则(尤其是产生长匹配项的规则)可以更改结果的原因。

整个解析器分两个步骤工作:词法分析器和实际的解析器。词法分析器将源(字符序列)转换为令牌序列,然后解析器通过根据解析器规则进行解析,将令牌序列转换为解析树。解析器规则 do 充当CFG,但词法分析器规则不属于该CFG。相反,令牌是CFG的终端,令牌规则仅影响生成所述令牌的过程-该过程独立于解析器规则。


1 除非您使用模式,否则在这种情况下,它将仅查看当前模式下的模式。