编译原理作业——编制一个词法分析器。
显然做这个作业有两种途径,
1)自己编
2)google+biadu+others.
昨天Simon童鞋给我说他们让搞lex,好吧那我也正好凑凑热闹,嘿嘿。结果别说,还让我整出来了,lex简单应用语法还是很简单的,附上我的lex源程序,kaisir.l
(我这个wp的代码高亮不支持lex,大家凑合着看吧 我懒……)
[codesyntax lang=”c”]
%{ #include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> int lineno=1; %} letter [A-Z,a-z] digit [0-9] id ({letter}|_)({letter}|{digit}|_)* error_id ({digit})+({letter})+ num {digit}+ whitespace [t]+ enter [n]+ %% "int"|"if"|"else"|"return"|"void"|"while" {Upper(yytext,yyleng); printf("%d 行 ",lineno); printf("%s reserved wordn",yytext); } {num} { printf("%d 行 ",lineno); printf("%s NUMn",yytext); } ","|";"|"("|")"|"+"|"-"|"*"|"/"|"=="|"<="|">="|"!="|"=" {printf("%d 行 ",lineno); printf("%s special symboln",yytext); } {id} {printf("%d 行 ",lineno); printf("%s IDn",yytext); } {error_id} {printf("%d 行 ",lineno); printf("error: %sn",yytext); } {whitespace} { } {enter} {lineno++; } %% Upper(char *s,int l){ int i; for(i=0;i<l;i++) {s[i]=toupper(s[i]);} } //Main main(void) { char filename[400]; printf("file name:"); scanf("%s",&filename); yyin=fopen(filename,"r"); printf("Starting..n"); return yylex(); }
[/codesyntax]
在ubuntu下使用
flex kaisir.l
顺利通过,之后使用gcc对flex生存的lex.yy.c进行编译,结果报错如下:
kaisir@Kaisir-ubuntu:~$ gcc -g lex.yy.c -o a.out
test.txt: In function 鈓ain?
test.txt:49: warning: format ?s?expects type 鈉har *? but argument 2 has type 鈉har (*)[400]?
/tmp/ccmK1ARZ.o: In function `yylex’:
/home/kaisir/lex.yy.c:902: undefined reference to `yywrap’
/tmp/ccmK1ARZ.o: In function `input’:
/home/kaisir/lex.yy.c:1237: undefined reference to `yywrap’
collect2: ld returned 1 exit status
大体看了下说是yylex这个函数找不到,baidu了下,编译的时候增加参数“–lfl” 顺利编译通过,写了个Test.C进行词法分析,No Problem!
kaisir@Kaisir-ubuntu:~$ ./a.out hellolex.c
file name:hellolex.c
Starting..
1 行 VOID reserved word
1 行 main ID
1 行 ( special symbol
1 行 ) special symbol
{3 行 INT reserved word
3 行 a ID
3 行 ; special symbol
4 行 a ID
4 行 = special symbol
4 行 10 NUM
4 行 ; special symbol
5 行 printf ID
5 行 ( special symbol
5 行 a ID
5 行 ) special symbol
5 行 ; special symbol
}
这个给力啊,以后版主多发这种东西啊!
不是版主,是博主,螃蟹童鞋……
这个给力啊!以后要多发这种东西!
Upper(char *s,int l){
int i;
for(i=0;i<l;i++)
{s[i]=toupper(s[i]);}
}
这个函数实现什么功能,好像有问题,不能运行
这个函数实现了小写字母向大写字母的转换,减少因为大小写不同而造成的重复匹配。文中的词法分析器当年都是测试通过的,应该是没有问题的 : )