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 语法。