B.8 LEX源程序例子
这一节举两个例子看看LEX源程序的写法
1) 将输入串中所有能被7整除的整数加3,其余部分照原样输出,先看下面的LEX源程序:
%%
int k;
[0-9]+{
scanf(-1,yytext,"%d",&k);
if(k%7==0)
printf("%d",k+3);
else
printf("%d",k);
}
上面的程序还有不足的地方,如对负整数,只是将其绝对值加上3,而且像X7,4963这样的项也做了修改,现在只要对上面的源程序稍作修改就避免了这些问题。
%%
int k;
-。[0-9]+{
scanf(-1,yytext,"%d",&k);
printf("%d",k%7==0。k+3;k);
}
-。[0-9]+ECHO;
[A-Za-z][A-Za-z0-9]+ECHO;
2) 下一个例子统计输入串中各种不同长度的单词的个数,统计结果在数组lengs中,单词定义为由字母组成的串,源程序如下:
int lengs[100];
%%
[a-z]+lengs[yyleng]++;
· |
\ n;
%%
yywrap()
{
int i;
printf("Length No.words \。);
for (i=0;i<100;i++)
if (lengs[i]>0)
printf ("%5d%10d\n",i,
lengs[i]);
return(1);
}
在上面的源程序中,当LEX读入输入串时,它只统计而不输出,到输入串读入完毕后,才在调用yywrap()时输出统计结果,为此用户自己提供了yywrap(),注意yywrap()的最后一个语句是返回值1。
|