考虑语法这样的规则的LR-家庭解析生成器(例如YACC,野牛等):负前瞻分析算法
Nonterminal : [ lookahead not in {Terminal1, ..., TerminalN} ] Rule ;
这是一个普通的规则,不同之处在于它有一个限制:用此规则生成的短语不能以Terminal1, ..., TerminalN
开头。 (当然,这个规则可以用一套通常的规则来代替,但它会导致更大的语法)。这对解决冲突很有用。
问题是,LR表构造算法是否存在对这种限制的修改?在我看来,这样的修改是可能的(如优先关系)。
当然,它可以在运行时进行检查,但我的意思是编译时检查(这是在构建分析表,如%prec
进行检查%left
,%right
和%nonassoc
指令在YACC-compartible发电机。)
感谢您的回答!是的,我记住了一个例子,它是ECMA-262语法(http://www.ecma-international.org/ecma-262/5.1,例如第12.4节)。由于这个语法使用'Expression'生产,无论有无限制,我们都必须加倍描述'Experssion'的语法部分。在我的LALR(1)解析器生成器中,它导致更多的状态(350与470)。保持350个州和满足限制将是非常好的。 – skvadrik 2013-04-21 06:26:05