繁体   English   中英

LR解析算法中的负超前

[英]Negative lookahead in LR parsing algorithm

对于LR系列解析生成器(例如YACC,BISON等),请考虑以下语法规则:

Nonterminal : [ lookahead not in {Terminal1, ..., TerminalN} ] Rule ;

这是一条普通规则,但有一个限制:用此规则产生的短语不能以Terminal1, ..., TerminalN开头。 (当然,可以用一组常规规则来代替此规则,但是它将导致更大的语法)。 这对于解决冲突很有用。

问题是,是否有接受这种限制的LR表构造算法的修改? 在我看来,这样的修改是可能的(例如优先关系)。

当然,可以在运行时检查它,但是我的意思是编译时检查(在构建解析表时执行的检查,例如yacc兼容生成器中的%prec%left%right%nonassoc指令。)

我不知道为什么不应该这样做,但是我也看不出任何明显的原因为什么有用。 你有一个例子吗?

最简单的方法是对您在括号中提到的语法进行转换。 这将产生更大的语法,但不会人为地增加LR状态的数量。

基本的转换,只需要一点挥手即可:

对于有终端限制的任何生产:

  • 如果生产以不可为空的非终端开始,则用终端限制版本替换非终端。

  • 如果生产以终端限制列表中的终端开始,则删除生产

  • 如果生产从不在终端限制列表中的终端开始,则无需更改。

如果生产以可为空的非终结符开头,则必须创建两个版本的可为空的非终结符,一个版本始终为null,另一个为不可为空。 然后创建两个版本的产品,其中一个版本从每个新的非终端开始。 然后应用上面的转换,但是将“开始于”解释为“在任何始终为null的非终结符之后开始”。

实际上,您不需要修改语法,因为至少在LR(0)和LALR(1)构造中,可以在基础SLR机器的构造过程中即时完成上述转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM