Flex中BEGIN与yy_push_state的区别是什么?
Flex中BEGIN与yy_push_state的行为验证
你的直觉完全正确,二者的核心差异就在于对状态栈的处理逻辑:
BEGIN(new_state):直接切换到指定的新状态,会彻底清空当前的状态栈,之前留存的所有状态都会被销毁,没有办法恢复到切换前的状态。yy_push_state(new_state):先将当前的活动状态压入状态栈,再切换到新状态。后续调用yy_pop_state()时,会弹出栈顶保存的状态并恢复为当前活动状态,状态栈中其他留存的状态也会被保留。
举个简单的场景示例:
假设当前处于INITIAL状态,调用yy_push_state(IN_STRING)后,状态栈为[INITIAL],活动状态变为IN_STRING;调用yy_pop_state()后,活动状态回到INITIAL,状态栈被清空。但如果是调用BEGIN(IN_STRING),状态栈会直接被清空,活动状态变为IN_STRING,若想回到INITIAL只能主动调用BEGIN(INITIAL),而非通过栈恢复。
内容的提问来源于stack exchange,提问作者PkDrew
相关产品推荐
相关产品推荐

