为什么未使用的词汇规则会影响语法的功能? [英] ANTLR - Why do unused lexical rules have an influence on the function of the grammar?

查看:16
本文介绍了为什么未使用的词汇规则会影响语法的功能?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

    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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆