LEX自动生成词法分析器
来源:互联网 发布:电子商务大数据分析 编辑:程序博客网 时间:2024/05/16 14:31
词法分析器作为编译器的一个重要组成部分,原理很简单,代码也都没什么技术含量,但是如果让你手工写一个词法分析器,哪怕是一个简单的词法分析器,工作量无疑是巨大的。现代的词法分析器一般都是依靠工具自动生成,这里我们选用flex生成词法分析器,下面是用到的flex的下载地址。windows的环境的话,lex.exe文件使我们所需要的工具。里面的帮助文档将教会你如何更好的使用flex。
学习编译原理并非一定要做一个完美的编译器,我们所需要的只是了解编译器的工作原理并能运用这些特性写出更高效合法的程序,因此我们只用lex的一些简单功能写一个简单的词法分析器来印证我们所学的知识。下图是lex的使用步骤简要说明:
这里的源文件是符合lex的语句,flex 的输入文件由三段组成,用一行中只有%%来分隔。
定义;definition
%%
规则;rules
%%
用户代码;code
这个源文件输出的就是词法分析器的C语言源程序,编译这个.c的源程序生成的就是你所定义语言的词法分析器。
这里我们用一个简单的例子来做一个简单的词法分析器,词法规则符合《编译原理及实践教程》中描述的sample语言。
下面是Source文件
%{#include<math.h>#include<stdlib.h>#include<stdio.h>%}DIGIT [0-9]ID [a-z][a-z0-9]*%%{DIGIT}+ {printf("整数: %s(%d)\n",yytext,atoi(yytext));}{DIGIT}+"."{DIGIT}+ {printf("实数: %s(%g)\n",yytext,atof(yytext));}if|then|begin|end|program|while|repeat {printf("关键字: %s\n",yytext);}{ID} {printf("标识符: %s\n",yytext);}"+"|"-"|"*"|"/" {printf("运算符: %s\n",yytext);}"{"[^}\n]*"}";[\t\n\x20]+;. {printf("不能识别的字符:%s\n",yytext);}%%int main(int argc,char **argv){ ++argv; --argc; if(argc>0) yyin=fopen(argv[0],"r"); else yyin=stdin; yylex(); return 0;}int yywrap(){ return 1;}
这里我们把Source源文件保存为lex.l
通过在命令行模式下输出命令 lex lex.l 生成lex.yy.c文件,这就是我们的词法分析器的源代码了,打开看看,吃惊吧,这么简单的语言的词法分析程序竟然需要这么多代码,还好我们不用手工写。编译这个源程序,得到 lex.yy.exe,测试一下
OK,简单词法分析器就完成了。
欢迎转载,转载注明出处
- LEX自动生成词法分析器
- 词法分析器的自动生成
- LEX/FLEX词法分析器
- Lex词法分析器
- 编译原理----Lex词法分析器
- 【编译原理】Lex词法分析器
- Lex:词法分析器的生成器
- [cp] 词法分析器的自动生成
- LEX & FLEX 实现C语言词法分析器
- 自制Lex-词法分析器生成器(C++)
- Yacc 与 Lex-词法分析器工具
- 自制脚本语言(4) 自动生成的词法分析器
- 词法分析器生成工具flex
- 词法分析器生成工具flex
- Lex – 一个词法分析器的生成器(全文)
- Lex – 一个词法分析器的生成器(全文)
- 利用LEX实现词法分析器(vs2010 + Parser Generator版)
- 利用LEX实现词法分析器(vs2010 + Parser Generator版)
- 关于vs2010+QT Addin 创建类时弹出"Not a valid .h file"的解决方法
- Java读取文件
- Ubuntu server 14.04 启用root用户并设置密码
- 不可变设计模式
- linux中bmp085驱动移植
- LEX自动生成词法分析器
- ExtJS5获取当前光标位置插入文本内容
- 行为型模式之十——访问者模式
- SVN服务器迁移(两台Linux机器之间)
- Day 5 (11.8):(3)数据分组和汇总
- ubuntu下服务自启与关闭
- poj1845
- tomcat加载启动越来越慢怎么解决?
- 又看自己年少时的代码