lex 程序启动条件
规则可以与任何启动条件关联。
但是,lex 程序仅当处于关联的启动条件下时才识别规则。 您可以随时更改当前启动条件。
使用下面形式的行在说明文件的定义部分定义启动条件:
%Start name1 name2其中name1和name2定义表示条件的名称。 条件的数量没有限制,它们可以以任何顺序出现。 您也可以将单词 Start 缩短为 s 或者 S。
在规范文件的规则部分中使用启动条件时,请将启动条件的名称括在<>(小于,大于) 规则开头的符号。 以下示例定义 lex 程序仅在 lex 程序处于启动状态时识别的规则
expressionname1:<name1> expression要将 lex 程序置于特定启动条件中,请在规则的操作部分中执行操作语句; 例如,BEGIN在以下行中:
BEGIN name1;此语句将启动条件更改为name1.
要恢复正常状态,请输入:
BEGIN 0;或BEGIN INITIAL;其中INITIAL定义为0lex 程序。BEGIN 0;将 lex 程序复位为其初始条件。
lex 程序还支持 %x(百分号,小写 x)或者 %X(百分号,大写 X)运算符所指定的互斥启动条件,运算符后面是与通常的启动条件格式相同的互斥启动名称的列表。 互斥启动条件与通常的启动条件的区别在于:当词法分析器处于互斥启动状态下时,不以启动条件开始的规则是不活动的。 例如:
%s one
%x two
%%
abc {printf("matched ");ECHO;BEGIN one;}
<one>def printf("matched ");ECHO;BEGIN two;}
<two>ghi {printf("matched ");ECHO;BEGIN INITIAL;}在上述示例中处于启动状态 1 ,abc和def可以匹配。 处于启动状态 2 ,仅ghi可以匹配。