本文主要是介绍if-else空悬问题解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
可以省略的if冲突(空悬else问题)
空悬else问题:内侧的if语句的else部分是否省略(如下图),如果内侧的if语句的else部分没有省略,则else部分属于内侧的if部分,如果省略的话则属于外侧的if语句。
空悬else最直观的判断方法是“else属于最内侧的if”,引测试着使用LOOKHEAD来进行判断。
首先未使用LOOKHEAD进行判断的规则描述如下:
if_stmt():{}
{<IF> "(" expr() ")" stmt() [<ELSE> stmt()]
}
使用LOOKHEAD来避免这种冲突的规则如下所示:
if_stmt():{}
{<IF> "(" expr() ")" stmt() [LOOKHEAD(1) <ELSE> stmt()]
}
判断的方法很简单,通过添加LOOKHEAD(1),指定读取1个token字后,如果该token符合规则(即如果是< ELSE >)则不省略< ELSE > stmt()。 这样就可以明确else始终属于离它最近的if语句,空悬else问题就解决了。
如果如下修改if_stmt,if 和else大括号就不可省略了,但同时也不会发生else空悬问题。
if_stmt():{}
{<IF> "(" expr() ")" "{" stmts() "}" [<ELSE> "{" stmts() "}"]
}
【参考文献】
[1] [日]青木峰郎/译 严圣逸 绝云/译 《自制编译器》 第五章 第六章 2016.6
这篇关于if-else空悬问题解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!