Bison YYSETSTATE如何知道YYFILL的标识符?

Bison YYSETSTATE如何知道YYFILL的标识符?,bison,re2c,Bison,Re2c,手册明确指出: 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定义的宏。如何在不知道整数UI的情况下开始状态?换句话说,我如何获得我想要开始的状态的标识符

手册明确指出:

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定义的宏。如何在不知道
整数
UI的情况下开始状态?换句话说,我如何获得我想要开始的状态的标识符

关于lexer:

<MY_STATE>{NAME} {
    return FN_NAME;
}

我认为您不应该调用
YYSETSTATE
宏。它用作
re2c
控制反转机制的一部分,通过
-f
命令行标志启用,该标志将扫描仪转换为“推送”扫描仪。这是一个方便的特性,但它与启动条件无关,很难想象在什么情况下可以突破抽象直接设置状态


re2c
具有类似于
flex
的启动条件的功能,该功能通过
-c
命令行标志启用。要设置当前条件,请使用
YYSETCONDITION
,它从开始条件的枚举中获取一个值。如果您还提供了
-t
命令行标志,
re2c
将使用此枚举创建一个头文件,以便您可以从其他翻译单元执行
YYSETCONDITION

YYSETSTATE和yyyfill是
re2c
接口的一部分,afaik。你引用的是哪本手册?我最终得到了一个更好的解决方案,但实际上我需要生成标题并包含生成的标题文件。我接受了这个答案,但我也不鼓励这种方法。@marcio:答案不够清楚,如果要使用
SETCONDITION
,您还需要生成并包含标题吗?你不鼓励的“这种方法”是什么(除了它是从解析器到词法分析器的不自然的反向通道之外)?或者,更好地问,“这个方法解决什么问题?”:)你的答案是完美的。我所指的方法是将信息从解析器传递到lexer。在我的具体案例中,有一种更好的方法:)
expr: { push_state( ? ) } /* what's the identifier of MY_STATE? */
    '(' FN_NAME VALUE VALUE ')' { compile_expr($2, $3, $4); }
;