为什么未使用的词汇规则会影响语法的功能? [英] ANTLR - Why do unused lexical rules have an influence on the function of the grammar?
本文介绍了为什么未使用的词汇规则会影响语法的功能?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
所以我尝试解析以下文本文件:
555 5555
使用此语法:
grammar PEntry;
entry : Tab Number Nl;
Tab : ' ';
Nl : '
';
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 ' 555 5555 ' expecting ' '
当目标规则(条目)中甚至没有引用名称时,为什么会发生这种情况?在上下文无关的语法中,任何未被Start变量引用的未使用的规则根本不在语言中,那么antlr有什么不同呢?
更新:(~[p{Z}])+应该是[~p{Z}]+,但这个规则不应该仍然对语法没有影响吗?我想知道antlr是否有某种方式解析规则,使其不同于cfg。
推荐答案
词法分析器独立于解析器工作,它不知道解析器使用哪些词法分析器规则,哪些不使用。词法分析器的工作原理是,它查看您定义的所有词法分析器规则,然后选择在当前输入上产生最长匹配的规则(如果是平局,它选择最先定义的规则)。这就是为什么添加新的词法分析器规则--尤其是生成长匹配的规则--可以改变结果的原因。
整个解析器分两步工作:词法分析器,然后是实际的解析器。词法分析器将源字符序列转换为标记序列,然后解析器根据解析规则对标记序列进行解析,从而将标记序列转换为解析树。解析器规则确实充当CFG,但词法分析器规则不是CFG的一部分。相反,令牌是CFG的终端,而令牌规则仅影响生成所述令牌的过程--该过程独立于解析器规则。1除非您正在使用模式,在这种情况下,它将只查看处于当前模式的模式。
这篇关于为什么未使用的词汇规则会影响语法的功能?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文