YYSETSTATE如何知道YYFILL的标识符?

时间:2015-02-07 06:24:57

标签: 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.
[...]

问题是,我正在从野牛解析器中调用我的YYSETSTATE定义的宏。如何在不知道integer UI的情况下开始状态?换句话说,我如何获得我想要开始的州的标识符。

on lexer:

<MY_STATE>{NAME} {
    return FN_NAME;
}

解析器:

expr: { push_state( ? ) } /* what's the identifier of MY_STATE? */
    '(' FN_NAME VALUE VALUE ')' { compile_expr($2, $3, $4); }
;

1 个答案:

答案 0 :(得分:2)

我认为你不应该调用YYSETSTATE宏。它被用作re2c控件反转机制的一部分,使用-f命令行标志启用,该标志将扫描程序转换为&#34; push&#34 ;扫描器。这是一个方便的功能,但它与开始条件无关,而且很难想象你可以突破抽象直接设置状态的情况。

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