lex 编程
lex编程分三步
1.以Lex可以理解的格式指定模式相关的动作。
2.在这一文件上运行lex 生成扫码器的C代码。
3.编译和链接C代码,生成可执行的扫描器。
C和Lex的全局声明
可以增加C变量声明,及Lex的标记声明如:
%{
int wordCount =0;
%}
chars [A-Za-z\_\'\.\"]
numbers ([0-9])+
delim [" "\n\t]
whilespace {delim}+
words {chars}+
%%
两个百分号标记指出了Lex程序中这一段的结束和三段中第二段的开始。
Lex的模式匹配规则
{words} {wordCount++;}
{whitespace} {}
{numbers} {}
%%
C代码
Lex编程的第三段,也就是最后一段覆盖了C的函数声明(有时是主函数)。注意这一段必须包括yywrap()函数。Lex有一套可供使用的函数和变量。其中之一就是yywrap.
例:
void main()
{
yylex();
printf("no of words:%d\n",wordCount);
}
int yywrap()
{
return 1;
}
Lex编译
$lex <filename.l>
生成lex.yy.c文件,它可以用C编译器来进行编译。
这里是一些Lex的标志:
-c 表示C动作,缺省
-t 写入lex.yy.c程序来代替标准输出。
-v 提供一个两行的统计汇总。
-n 不打印-v的汇总。
高级Lex
Lex有几个函数和变量提供了不同的信息,可以用来编译实现复杂函数的程序。详情参考lex或flex手册
Lex变量
yyin FILE *类型,指向lex正在解析的当前文件。
yyout FILE* 类型,指向记录lex输出的位置。缺省情况下,yyin和yyout都指向标准输入和输出。
yytext 匹配模式的文件存储在这一变量中(char *)
yyleng 给出匹配模式的长度。
yylineno 提供当前的行数信息。
Lex函数
yylex() 这一函数开始分析。有lex自动生成。
yywrap() 这一函数在文件的末尾调用。如果函数的返回值是1.就停止解析。
yyless(int n) 这一函数可以用来送回出了前n?这个字符外的所以读出标记。
yymore() 这一函数告诉Lex将下一个标记附加到当前标记后。