ILD

Flex学习笔记3: Start condition
作者:Yuan Jianpeng 邮箱:yuanjp89@163.com
发布时间:2019-8-1 站点:Inside Linux Development

Start Conditions

flex提供一个机制,条件的激活rule。任何以<sc>开头的rule,只有scanner在叫sc的start condition时,才激活。

sc可以有多个,用逗号分开。


start conditons是在definitions section中声明的,使用%s或者%x,跟着名字列表。


%s定义inclusive start condition

%x定义exclusive start condition


start condition使用BEGIN action激活,直到下一个BEGIN action被执行。给定的start action被激活,其它action被inactive。


如果start condition是inclusive的,那么其它没有start condition的rules也是active的。

如果start condition是exclusive,那么只有那条start conditon被激活。


例子1:

1
2
3
4
%s example
%%
<example>foo do_something();
bar something_else();

由于example是inclusive的,所以bar总是激活的。如果example是exclusive的,那么当example激活时,bar就不激活了。


等价的实现:

1
2
3
4
5
6
%x example
%%
<example>foo
do_something();
<INITIAL,example>bar
something_else();


特殊的start conditon <*> 匹配任何start condition。


BEGIN(0),返回原始状态,没有任何start condition被激活。


下列routines可以用来维护一个start conditons栈

yy_push_state (int new state)

yy_pop_state()

yy_top_state()


为了使用上面的接口,你必须要包含 %option stack 语法。


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.