如何消除二义性 编译原理

如题

  1、需要在语法设计时就要考虑了,即使是C/C++也存在二义性、不确定性的语法,对于这种情况,各编译器考虑的不同的方案,主要还是看你如何进行文法分析,可以选一种方便分析的一种去做。
  2、要判断二义性的存在,可以尝试使用不同的优先顺序解释
  假如解释出现歧义,那么一定存在二义性的语法(如经典的++运算)
  3、要消除二义性,最简单可行的就是定义优先级,不过不一定适合所有情况。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-01-12
二义性文法
【定义】
若文法中存在这样的句型,它具有两棵不同的语法树,则称该文法是二义性文法。
二义性文法会引起歧义,应尽量避免之!
e
e
e
+
e
e
*
e
i
e
*
e
e
+
e
i
i
i
i
i
都可以表示i+i*i
所以g(e):e
->
e+e
|
e*e
|
(e)
|
i
;文法具有二义性。
文法二义性的消除:
【方法1】不改变文法的原有规则,加进一些非形式规定。
加进运算符的优先顺序和结合规则对g(e),规定*优于+,*和+服从左结合
【方法2】构造一个等价的无二义性文法,将排除
二义性的规则合并到文法中
g(e)
->
g´(e)
:
e
->
e+t
|
t
t
->
t*f
|
f
f
->
(e)
|
i
;
相似回答