lex实现的简单词法分析

这篇博客介绍了如何利用lex工具实现一个简单的C语言词法分析器,该分析器能够识别并打印标识符、数字和运算符。文章中提供了程序代码,并提到后续会涉及更复杂的lex程序,包括符号表功能。

lex是一个高效简单的实现词法分析器的工具,本文的工作只是实现了一个c语言的简易词法分析,识别出单词并打印。后续文章将会有稍微复杂的lex程序,实现了符号表等功能。
先上代码:

%{ #include <stdio.h> %}

WS  [ \t\n]*
NUMBER [0123456789]+
ID [a-zA-Z][a-zA-Z0-9]* 

LABRACE [{}]    
EQUAL [=][=]
LPARNE [()]
SEMICOLON   [;]
ASSIGN [=]
ADD [+]
SUB [-]
MUL [*]
DIV [/]

IF [i][f]
WHILE [w][h][i][l][e]

INT [i][n][t]
CHAR [c][h][a][r]


%%
{NUMBER}        printf("NUMBER\n");

{IF}            printf("IF\n");
{WHILE} printf("while\n");
{INT} printf("int\n");
{CHAR} printf("char\n");
{ID}            printf("WORD\n");

{SEMICOLON} printf("semicolon\n");

{ADD} printf("add\n");
{SUB} printf("sub\n");
{MUL} printf("mul\n");
{DIV} printf("div\n");
{LABRACE}       printf("LBRACE\n");
{ASSIGN}        printf("ASSIGN\n");
{EQUAL}         printf("EQUAL\n");
{LPARNE}        printf("LPARNE\n");

{WS}                    /* do nothing */    ;

%%
main(int argc, char *argv[])
{ 
   ++argv, --argc; 
   if ( argc > 0 ) yyin = fopen("E:\\text1.txt", "r" );
   else  yyin = stdin;
   yylex();
   getch();
}

博主使用的PARSER_GENERATOR的lex模块,关于环境配置请自行google。上图程序实现了对标识符、数字以及运算符的词法分析,并在识别后打印。

实验二 词法分析器 一、实验目的 掌握词法分析器的构造原理,掌握手工编程或LEX编程方法之一。 二、实验内容 编写一个LEX源程序,使之生成一个词法分析器,能够输入的源程序转换为单词序列输出。 三、实验环境 Flex+VC6.0 四、实验注意 1.Id正则表达式:{letter}({letter}|{digit})* 2.Num正则表达式:{digit}+(\.{digit}+)?(E[+-]?{digit}+)? 3.注释:(\/\*(.)*\*\/) 4.关键字再加上其他字符就又能编程id,所以在词法分析时,id的判断应该放在关键字前面,这样才不会误判 5.由于本程序知识简单的打印数字,因此没有考虑数字的转换 6.">="比">"多一个字符,它应该放在前面判断,其他类似的也应该如此安排 五、实验代码 ******************************************************************************* 实验文件:lex.l、lex.yy.c 实验结果:lex.exe 运行方式:打开lex.exe,弹出input.txt,在其中输入所要测试的程序,保存并关闭,即可在output.txt中看到所得结果 ******************************************************************************* %{ void Install(char *type); %} %option noyywrap delim [ \t] newline [\n] digit [0-9] num {digit}+(\.{digit}+)?(E[+-]?{digit}+)? letter [A-Za-z] id {letter}({letter}|{digit})* key ("if"|"while"|"do"|"break"|"true") basic ("int"|"float"|"bool"|"char") op (">="|""|"<"|"="|"!="|"+"|"-"|"*"|"/") comment (\/\*(.)*\*\/) %% delim {;} newline {printf("\n");} {num} {Install("Num");} {key} {Install("Key");} {basic} {Install("Basic");} {op} {Install("Op");} ";" {Install("Comma");} {id} {Install("ID");} {comment} {Install("Comment");} "(" | "[" | "{" {Install("lbracket");} ")" | "]" | "}" {Install("rbracket");} %% void Install(char *s) { fprintf(yyout, "%s:%s ", s, yytext); } int main() { printf("please input the test program in input.txt\n"); system("input.txt"); yyin = fopen("input.txt", "r"); yyout = fopen("output.txt", "w" ); yylex(); fclose(yyout); fclose(yyin); printf("analysis result in output.txt\n"); system("output.txt"); return 0; } 六、实验小结 本次的实验由于使用了flex,所以代码较短,麻烦的事flex的正则式表达,由于该使用规则只有简单介绍,而网上找的教程难免有比重就轻之嫌,所以得到上述表达式着实费力,且有的没有成功,例如bracket的(\ ((.)*\ ))或者("("(.)*")")使用时都没有成功,所以便单独写出,有点不伦不类。至于其他的,都较为简单,完。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值