[英]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.