书上写这个文法是有二义性的 但是没说为什么
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不要管它 不小心打出来的
我如果去掉if语句这个文法也不是二义把
(去掉if保留if...else)
是的。
只保留 if ... else ...,方法不是二义的。