如何在 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();
添加到头文件中,您可以从任何地方调用它。
如标题所述,如何在操作代码之外的 (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();
添加到头文件中,您可以从任何地方调用它。