当前位置:首页 > 编译原理课程设计编译器实现
3.总体设计及开发工具的选择
3.1开发工具
LEX编译器环境:flex builder 2.0 编程语言:C
3.2总体设计
LEX语言是一种描述性语言,LEX源程序主要用来描述各类语言的词法,LWX源程序由三部分组成,说明部分、转换规则和辅助过程。用%%作间隔符。 a.说明部分主要用正规式定义单词的构词原则。 b.转换规则是如下形式的语句:
P1|action 1| P2|action 2| ??
Pn|action n|
其中,每个Pi是一个正规式,标示某类单词的词形,action i 是一段C程序代码,表示词法分析时识别出符合词形Pi的单词后应做的动作,如将该单词转化为内部形式,登录符号表等。
c.辅助过程容纳的是action部分需要的辅助过程,这些过程可分别编译并置于词法分析器中。
4.设计原则
4.1LEX编译程序产生词法分析程序的过程
要自动生成X语言的词法分析程序,需先编写LEX源程序来描述X语言的词法,之后LEX编译程序处理LEX源程序,构造一个DFA和一个控制程序,DFA和控制程序相互配合就可以作为X语言的词法分析程序。
4.1.1LEX编译程序产生DFA的过程
a.将各类单词的正规式转化为DFA
b.将各类单词正规式对应的DFA按相同的初态0连接成一个完整的DFA M
4.1.2产生控制程序的过程
LEX编译程序产生控制程序是通用的,不同的LEX源程序对应的控制程序的流程是相同的,控制程序流程如图三所示。图三中的限制条件是控制程序已读入的符号串长度
5
是否大于正在识别的单词的最大长度。图三中识别出i个单词后的后续处理是LEX源程序中的转换规则部分的动作代码。
DFA M和图三的控制程序配合即为词法分析程序。
图三 控制程序
5.数据结构
lex提供的外部数据结构
(1)yytext :外部字符数组,其内容是当前被匹配的字符串。每识别出一个字符串,yytext中的内容即被替换。
(2)ECHO :宏,Printf(“%s”,yytext);将yytext的内容打印出来。
(3)yyleng :外部变量,当前yytext中字符的个数。即当前匹配的字符串的长度。 例:输入串中 单词的个数 和 字符的个数 记数 [a―zA―Z]+ { words++; chars+= yyleng; }
注意:被匹配字符串的第一个和最后一个字符分别为yytext[0],和
yytext[yyleng-1]
6
6.详细设计
综合运用LEX编程。
a.将输入文件中的小写字母转换成大写字母,并输出到屏幕上 b.识别出文件中的标识符, 然后将识别出的标识符输出到屏幕上。
c.将输入串中所有能被7整除的整数加上3, 将结果输出到屏幕上. 其余部分照原样输出.
d.构造一个识别C语言的单词的词法分析程序。 源程序: A. %{
#include
yylex(); return 0; } int yywrap() {return 1; } B. %{
#include
yylex(); return 0; } int yywrap() {return 1; } C.
#include
[0-9][0-9]* { a=atoi(yytext); if(a%7==0) printf(\
7
else printf(\%% main() {
yylex(); return 0; } int yywrap() {return 1; } D. %{
#include
DIGIT [0-9] ID [a-z][a-z0-9]* %% {DIGIT}+|\
printf(\整数: %s (%d)\\n\}
{DIGIT}+\
printf(\浮点数:%s (%g)\\n\}
if|case|char|continue|default|do|double|else|float|for|int|return|switch|while|void { printf(\关键字:%s\\n\
\ printf(\运算符r:%s\\n\{ID} printf(\标志符: %s\\n\\
分
隔
符: %s\\n\白字符\\n\不能识别字符:%s\\n\
main(argc,argv) int argc; char **argv; {
++argv, --argc; /*跳过执行文件名到第一个参数 if(argc>0) yyin=fopen(argv[0],\yyin=stdin; */
yyin=fopen(\从源文件中读取 */ yylex(); }
8
共分享92篇相关文档