YYSETSTATE如何知道YYFILL的标识符?
YYSETSTATE how to know the identifier of YYFILL?
说明书上写的很清楚:
YYSETSTATE (s)
[...]
The parameter to YYSETSTATE is a signed integer that uniquely identifies
the specific instance of YYFILL (n) that is about to be called.
[...]
问题是,我正在从 bison 解析器调用我的 YYSETSTATE 定义的宏。我如何在不知道 integer
UI 的情况下开始状态?换句话说,如何获得我想要开始的状态的标识符。
在词法分析器上:
<MY_STATE>{NAME} {
return FN_NAME;
}
在解析器上:
expr: { push_state( ? ) } /* what's the identifier of MY_STATE? */
'(' FN_NAME VALUE VALUE ')' { compile_expr(, , ); }
;
我认为您不应该调用 YYSETSTATE
宏。它用作 re2c
控制反转机制的一部分,通过 -f
命令行标志启用,将扫描器变成 "push" 扫描器。这是一个方便的功能,但它与启动条件无关,很难想象您可以突破抽象直接设置状态的情况。
re2c
确实有一个类似于 flex
的开始条件的功能,它是通过 -c
命令行标志启用的。要设置当前条件,您可以使用 YYSETCONDITION
,它从开始条件的枚举中获取一个值。如果您还提供 -t
命令行标志,re2c
将使用此枚举创建一个头文件,以便您可以从其他翻译单元执行 YYSETCONDITION
。
说明书上写的很清楚:
YYSETSTATE (s)
[...]
The parameter to YYSETSTATE is a signed integer that uniquely identifies
the specific instance of YYFILL (n) that is about to be called.
[...]
问题是,我正在从 bison 解析器调用我的 YYSETSTATE 定义的宏。我如何在不知道 integer
UI 的情况下开始状态?换句话说,如何获得我想要开始的状态的标识符。
在词法分析器上:
<MY_STATE>{NAME} {
return FN_NAME;
}
在解析器上:
expr: { push_state( ? ) } /* what's the identifier of MY_STATE? */
'(' FN_NAME VALUE VALUE ')' { compile_expr(, , ); }
;
我认为您不应该调用 YYSETSTATE
宏。它用作 re2c
控制反转机制的一部分,通过 -f
命令行标志启用,将扫描器变成 "push" 扫描器。这是一个方便的功能,但它与启动条件无关,很难想象您可以突破抽象直接设置状态的情况。
re2c
确实有一个类似于 flex
的开始条件的功能,它是通过 -c
命令行标志启用的。要设置当前条件,您可以使用 YYSETCONDITION
,它从开始条件的枚举中获取一个值。如果您还提供 -t
命令行标志,re2c
将使用此枚举创建一个头文件,以便您可以从其他翻译单元执行 YYSETCONDITION
。