如何在 flex/lex 中的操作之外更改 "start condition"?

How to change "start condition" outside of actions in flex/lex?

如标​​题所述,如何在操作代码之外的 (f)lex 中更改当前活动的开始条件或状态? Flex 手册指出像 BEGIN 这样的特殊指令只能在动作中使用。

我试图在我的扫描仪中引入不同的“模式”来改变返回的内容,这些模式是在外部设置的,而不是在操作代码中设置的,所以我不能使用 BEGIN

有什么建议吗?预先感谢您的帮助!

您可以(仅)在 lex.l 文件中使用 BEGIN,但您可以在 .l 文件的任何位置使用它。特别是,您可以在第三部分(第二个 %% 之后)使用它,您可以在其中使用任何 C 代码。所以你可以定义一个使用 BEGIN 设置开始状态的函数,然后在头文件中声明该函数并在任何地方使用它。

示例:

%s STATE1

%%

<STATE1>"foo"    /* rule applies in state 1 */  ;

%%

void set_state1() {
    BEGIN STATE1;
}

extern void set_state1(); 添加到头文件中,您可以从任何地方调用它。