lex可以辅助生成词法分析程序,我们要做的仅仅是写好相应的正则表达式。
简介:http://www.ibm.com/developerworks/cn/linux/sdk/lex/
一个lex source file
由三部分组成。
%{
C变量、函数声明
%}
lex标记声明
%%
lex的模式匹配规则
%%
C代码
下面是一个统计字数与行数的小程序
%{
int word_cnt=0;
int rows = 0;
%}
words [^ \t\n]+
%%
{words} word_cnt++;
.
\n rows++;
%%
void main()
{
yylex();
printf("%d words, %d line\n", word_cnt, rows);
}
下面是一个找出源文件中函数的程序
%{
#include <stdio.h>
int cnt=0,line=0;
void FindFunc(char *str);
void DoNothing();
%}
chars [a-zA-Z\_\'\"\.]
words {chars}+
identifier [a-zA-Z\_]+[a-zA-Z0-9_]*
/*one or some blank or tab */
blanks [ \t]+
/* zero or some blank or tab */
blanks_opt [ \t]*
/* return type */
ret_type {identifier}|({identifier}{blanks}{identifier})
/* function name */
func_name {identifier}
/* left bracket: may have blanks between function name and left bracket */
left_bracket {blanks_opt}\(
/* parameters: NULL or one identifier is need */
params (({blanks_opt}[a-zA-Z0-9_]+[ \t]+[a-zA-Z0-9 \t\_\*&\[\],\n]*)|({blanks_opt}))
semicolon [; \n\r]
right_bracket {blanks_opt}\){blanks_opt}[;\n]{1}
func_end {right_bracket}
%%
{ret_type}{blanks}{func_name}{left_bracket}{params}{func_end} FindFunc(yytext);cnt++;
. DoNothing();
\n DoNothing();line++;
%%
void main(int argc, char *argv[])
{
yyin = fopen(argv[1], "r");
if (yyin < 0)
{
printf("Open file %s failed\n", argv[1]);
return ;
}
yylex();
fclose(yyin);
// printf("%d functions found.\n", cnt);
}
void FindFunc(char *str)
{
char *p=str;
int no = line+1;
while(*p)
{
if (*p == '\n')
{
line++;
*p=' ';
}
p++;
}
printf("%3d %s\n", no, str);
}
void DoNothing()
{
}
编译生成程序:
上面代码存储为tt.lex文件
lex -o findFunc.c tt.lex 生成源文件findFunc.c
gcc -o findFunc findFunc -lfl 生成可执行程序findFunc
./findFunc input.c 打印输出input.c中的函数
下面程序实现把一个文件中的小写字母转换成大写字母
%{
#include <stdio.h>
int cnt=0;
%}
lowcase [a-z]
%%
{lowcase} {yytext[0] = toupper(yytext[0]);cnt++; fprintf(yyout,"%c",yytext[0]);}
. fprintf(yyout, "%c",yytext[0]);
\n fprintf(yyout, "%c",yytext[0]);
%%
void main(int argc, char *argv[])
{
yyin = fopen(argv[1], "r");
if (yyin < 0)
{
printf("Open file %s failed\n", argv[1]);
return;
}
yyout = fopen(argv[2], "w");
if (yyout < 0)
{
printf("Open file %s failed\n", argv[2]);
fclose(yyin);
return;
}
yylex();
printf("%d lowcases found.\n", cnt);
fclose(yyin);
fclose(yyout);
}