行云

行至水穷处,坐看云起时。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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);
}

posted on 2011-07-20 17:01  windflying  阅读(335)  评论(0编辑  收藏  举报