如何消除算符优先文法的优先级冲突?附示例冲突分析
结论
完全可以通过等价文法改写消除这类算符优先关系冲突,改写全程保持文法生成的终结符串集合不变。
原冲突的来源
原文法中a与a的优先关系冲突来自两个独立的判定场景:
- 相等优先关系(a = a):来自产生式
X → aa,右部是两个相邻的终结符a,按照算符优先规则直接形成相等关系 - 低于优先关系(a < a):来自产生式
S → aSbXc,右部首个a是直接写入的终结符,后面紧跟非终结符S,而S的所有产生式都以a作为首终结符,按照规则前一个a的优先级低于S的首a,形成a <a的关系。两种关系同时落在同一个终结符对(a,a)上,就产生了冲突。
具体改写逻辑
冲突的核心是“直接写入的终结符a紧跟着非终结符S”的结构触发了多余的a <a关系。只要把这个结构里的直接a替换为只生成a的独立非终结符,就能从根源上消除这个冲突:替换后这个位置就不再是直接写入的终结符a,自然不会触发针对a的优先关系判定。
改写后的等价文法为:
S → A S b X c | A b X c A → a X → aa
改写效果
由于A的唯一产生式是A→a,改写后的文法和原文法生成的语言完全一致。重新计算算符优先关系后:
- (a,a)对仅保留来自
X→aa的相等优先关系,原来的冲突性a <a关系完全消失 - 所有终结符对之间最多只有一种优先关系,满足算符优先文法的判定要求
内容的提问来源于stack exchange,提问作者user9985127
相关产品推荐
相关产品推荐

