编译原理 例2.7的二义性问题

书上写这个文法是有二义性的 但是没说为什么
stmt -> id = expression;
| if(expression) stmt
| if(expression) stmt else stmt
| while(expression) stmt
| do stmt while (expression);
| {stmts}

stmts -> stmts stmt
| ∅

expression、stmt、stmts是非终结符(这里expression没有给出定义)
这个文法的二义性是不是比如说这样的
if(expression)
if(expression) stmt
else stmt

可以把它解释成
中间一行的if(expression) stmt是stmt(标记成A)
然后
if(expression) A else stmt是stmt
或者最后两行的是stmt, 然后第一行的if(expression) 后两行是stmt?

如果把stmt的产生式中 | if(expression) stmt else stmt删去它还有二义性吗

else stmt
最后那个else stmt不要管它 不小心打出来的

你的理解没错。
产生二义性的原因,就是既有无else的IF,又有带else的IF,造成你举的例子中后面else的组合关系不唯一。

去掉带else的IF语句,这个文法就不是二义的了。追问

我如果去掉if语句这个文法也不是二义把
(去掉if保留if...else)

追答

是的。
只保留 if ... else ...,方法不是二义的。

温馨提示:答案为网友推荐,仅供参考
相似回答