3

手册上明确写着:

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

在词法分析器上:

<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); }
;
4

1 回答 1

3

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

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

于 2015-02-08T01:22:24.933 回答