B.9 再谈上下文相关性的处理
在第B.3节中介绍LEX用的正规式时提到了上下文相关性的表示,这里再详细介绍LEX提供的处理上下文相关的措施。
要处理的问题是某些规则在不同的上下文中要采取不同的动作,或者说同样的字符串在不同的上下文中有不同的解释。例如,在程序设计语言中,同一个等号"=",在说明部分表示为变量赋初值,这时的动作应是修改符号表内容;而在语句部分等号就是赋值语句的赋值号,这时又应该产生相应于赋值语句的代码。因此要依据等号所处的上下文来判断它的含义。LEX提供了两种主要的方法,
1) 使用标志来区分不同的上下文
标志是用户定义的变量,用户在不同的上下文中为它置不同的值,以区分它在哪个上下文中,这样识别规则就可以根据标志当前值决定在哪个上下文中并采取相应的动作。
例 将输入串照原样输出,但对magic这个词,当它出现在以字母a开头的行中,将其改为first,出现在以b开头的行中将其改为second,出现在以c开头的行中则改为third。使用标志flag的LEX源程序如下:
int flag;
%%
∧a {flag=a;ECHO;}
∧b {flag=b;ECHO;}
∧c {flag=c;ECHO;}
\n {flag=0;ECHO;}
magic {
switch (flag)
{
case a:printf(′first′);break;
case b:printf(′second′);break;
case c:printf(′third′);break;
default:ECHO; break;
}
}
|