2) 使用开始条件来区分不同上下文
在LEX源程序中用户可以用名字定义不同的开始条件。当把某个开始条件置于某条识别规则之前时,只有在LEX处于这个开始条件下这条规则才起作用,否则等于没有这条规则。LEX当前所处的开始条件可以随时由用户程序(即LEX动作)改变。
开始条件由用户在LEX源程序的"辅助定义部分"定义,语法是
%Start name1 name2 name3…
其中Start可以缩写成S或s。开始条件名字的顺序可以任意给出,有很多开始条件时也可以由多个%Start行来定义它们。
开始条件在识别规则中的使用方法是把它用尖括号括起来放在识别规则的正规式左边:
<name1> expression
要进入开始条件如name1,在动作中用语句
BEGIN name1
它将LEX所处的当前开始条件改成name1
要恢复正常状态,用语句
BEGIN 0
它将LEX恢复到LEX解释器的初始条件。
一条规则也可以在几个开始条件下都起作用,如
<name1,name2,name3> rule
使rule在三个不同的开始条件下都起作用。要使一条规则在所有开始条件下都起作用,就不在它前面附加任何开始条件。
例 解决1)中的问题,这次用开始条件,LEX源程序如下:
%start AA BB CC
%%
∧a {ECHO;BEGIN AA;}
∧b {ECHO;BEGIN BB;}
∧c {ECHO;BEGIN CC;}
\n {ECHO;BEGIN 0;}
<AA>magic printf(′first′);
<BB>magic printf(′second′);
<CC>magic printf(′third′);
|