我尝试用谷歌搜索一下,但找不到明确的答案。
我对名称含义的直觉以及一些观察告诉我,BEGIN 只是启动一个新状态并销毁整个处于保留状态的状态堆栈,而 yy_push_state 将一个新状态推送到状态堆栈中,以便稍后我们可以使用yy_pop_state 获取调用者状态。
我的直觉正确吗?如果是这样,我想知道什么时候应该选择 BEGIN 而不是 yy_push_start?当我们碰巧想要消除堆栈时使用它吗?
事实证明,该行为在here有详细记录,我在搜索时以某种方式忽略了它。
我的假设有一半是正确的,但一半是错误的。
我是正确的,yy_push_state(int new_state) 将当前激活的状态推入堆栈并激活 new_state。 yy_pop_state() 将状态弹出堆栈顶部,然后激活它。请参阅下面的玩具 GDB 测试:
(gdb) p yy_push_state(0)
$30 = void
(gdb) p yy_push_state(1)
$31 = void
(gdb) p yy_push_state(2)
$32 = void
(gdb) p yy_push_state(3)
$33 = void
(gdb) p yy_top_state()
$34 = 2
(gdb) p yy_pop_state()
$36 = void
(gdb) p yy_top_state()
$37 = 1
我错了,BEGIN 与堆栈无关,它只是激活它的参数。