考慮語法這樣的規則的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