编译原理课程设计报告C语言词法分析器_第1页
编译原理课程设计报告C语言词法分析器_第2页
编译原理课程设计报告C语言词法分析器_第3页
编译原理课程设计报告C语言词法分析器_第4页
编译原理课程设计报告C语言词法分析器_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编译原理课程设计报告题目名称c语言词法分析器班 级24020802学 号 姓 名指导教师 编写时间2010/12/10目 录1.课程设计题目名称- 2 -2.课程设计目的与任务- 2 -3.设计思想和实现方法- 3 -4.程序说明- 3 -5.程序运行结果和测试报告- 4 -6.存在问题及分析- 6 -7.总结及体会- 6 -参考文献- 6 -附件一- 7 -附件二- 11 -1. 课程设计题目名称使用工具实现c/c+语言词法分析器2. 课程设计目的与任务a) 人数:1人b) 时间:一周c) 输入:c/c+源代码文件,即后缀为c/cpp的文件。d) 输出:后缀为tok的文本性文件。e) 实现功

2、能:完成c/c+语言的词法分析器(c语言词法记号及其含义详见附件一)词法记号含义lb“”lp“(”rb“”rp“)”plus“+”- 2 -3. 设计思想和实现方法词法分析器的作用如下:1. 读入源程序字符序列2. 对源程序进行预处理,如删除注释和回车换行符,宏展开等3. 识别源程序中的单词符号,创建符号表并在相应的符号表中登录信息4. 输出单词符号序列对于此题,我们可以选择使用c+人工编写词法分析代码来实现,也可以使用lex编程来自动生成词法分析器。相对于lex编程,第一种方案的有着思路简单,实现方便的优点,但随着词法分析的深入,代码编写的复杂度和重复度逐渐上升,为词法分析的实现增加许多困难

3、;而使用lex编程则克服了这一困难,若需要增加一种识别模式,仅仅需要增加的是对此模式的正则表达式的编写以及识别后的动作编写。lex是一种生成扫描器的工具,我们可以通过编写lex文件来实现识别文本中的词汇模式的程序。lex编程可以分为三步:1. 以lex可以理解的格式制定模式相关的动作。2. 在这一文件上运行lex,生成扫描器的c/c+代码。3. 编译和链接c代码,生成可执行的扫描器。我要做的就是编写c语言词法的正则表达式,以及需要识别的各种词法记号和匹配后需要执行的动作即可,其他的操作都可以交给lex来执行。(详细源代码见附件二)4. 程序说明一个标准的lex程序分为三个段:第一段:定义部分

4、全局声明部分起始于“%”符号,终止于“%”符号,其间可以包括include语句、声明语句在内的c语句。例如:% #include stdio.hint linenum;%第二段:规则部分规则部分起始于“%”符号,终止于“%”符号,其间则是词法规则。词法规则由模式和动作两部分组成。模式部分可以由任意的正则表达式组成,动作部分由c语言语句组成,这些语句用来对所匹配的模式进行相应处理。需要注意的是,lex将识别出来的单词存放在yytext字符数据中,因此该数组的内容就代表了所识别出来的单词的内容。例如:%delim tn ws delim+number digit+(.digit+)?(e+-?di

5、git+)? ws /*忽略空格符、制表符、换行符的操作*/number fprintf(yyout,%st/number(常数)n,yytext);%在上述代码中,“ws delim+”代表识别空格符、制表符、换行符的规则,“ws /*忽略空格符、制表符、换行符的操作*/”就代表对识别出的“ws”进行操作,即忽略空格符、制表符、换行符。第三段:是补充的用户自定义函数。例如:int yywrap() return 1;int main(int argc, char *argv) yyin = fopen(input.c,r); yyout = fopen(output.tok,w); prin

6、tf(input.c文件分析完毕,结果保存在output.tok文件n); fprintf(yyout,/c语言词法分析n/2402080216n/杨凯n/2010/12/10nn/词法分析如下:n); yylex(); return 0;上述代码就是一个用户自定义的函数,此函数实现的功能是:打开input.c文件进行词法分析,并将结果输出到output.tok文件中。5. 程序运行结果和测试报告使用lex编程,命名为mylexer.l,使用parser generator 2编译生成mylexer.c、mylexer.h和mylexer.v文件,在microsoft visual c+6.0

7、中新建一个工程,命名为test,将mylexer.c加入到source files,将mylexer.h加入到header files,配置好环境变量后编译运行,运行结果如下图所示。用来测试的c语言文件名为input.c,经词法分析后输出的文件命名为output.tok。由结果可知,顺利完成词法分析任务。图1 编译运行运行结果图2 input.c文件截图图3 output.tok文件截图6. 存在问题及分析词法分析的正则表达式编写有些不是很全面,比如说识别常数“number”的正则表达式就无法识别8进制、16进制数据。识别某些词法记号的正则表达式编写的不是很严谨,比如说在识别c语言预处理定义语

8、句的正则表达式仅仅只能识别出预处理语句,而无法进行预处理包含的头文件的词法分析。用户自定义程序编写的较为简陋,若能美化一下,人机交互将会更美好。对lex编程还不是很了解,对词法分析器的作用以及工作原理的理解还有待提高。7. 总结及体会在拿到本次课程设计题目后,对完成此次课程设计的两种主流方案进行了一些思考,用c+语言直接编写词法分析程序从思路上来说会比较容易些,也曾试着写过一些代码,但在写代码的过程中,慢慢地就暴露出直接编写词法分析程序的一些问题,比如说代码的重复度很高,代码里充斥着大量的ifswitch语句,极大地增加了代码的复杂度,从而促使我选择使用lex编程来自动生成词法分析器的方案。使

9、用lex编程就简化了代码的编写,从而将注意力放在识别词法记号的正则表达式的编写和识别后所执行的动作的编写上。本次课程设计也暴露了我在编译原理学习中的一些不足,比如对正规式的含义和编写还有一些疑问,对词法分析器的作用和工作原理理解的不是很清等等,通过课程设计很好的复习了编译原理课程中的词法分析部分,对自己理解词法分析有很大的帮助。参考文献1 陈意云、张昱,编译原理(第二版),高等教育出版社 2 毛红梅,编译原理 学练考,清华大学出版社3 霍林,编译技术课程设计与上机指导,重庆大学出版社附件一c语言词法记号及其含义表词法记号含义lb“”lp“(”rb“”rp“)”plus“+”minus“-”mu

10、lt“*”div“/”mod“%”plusa“+=”minusa“-=”mula“*=”diva“/=”moda“%=”ls“”lsa“=”not“!”bitand&bitor|xorcompland“&”or“|”lt“”le“”ge“=”eq“=”ne“!=”assign“=”dot“.”ms-laraposinc+posdec-preinc+predec-unaryminus-unaryplus+dereferece*address&comma“,”sc;identifier标识符asm“asm”auto“auto”bool“bool”break“break”case“case”catc

11、h“catch”char“char”class“class”const“const”const_cast“const_cast”continue“continue”default“default”delete“delete”do“do”double“double”dynamic_cast“dynamic_cast”else“else”enum“enum”explicit“explicit”extern“extern”false“false”float“float”for“for”friend“friend”goto“goto”if“if”inline“inline”int“int”log“lo

12、g”long“long”mutable“mutable”namespace“namespace”new“new”operator“operator”private“private”protected“protected”public“public”register“register”reinterpret_cast“reinterpret_cast”return“return”short“short”signed“signed”sizeof“sizeof”static“static”static_cast“static_cast”struct“struct”switch“switch”temp

13、late“template”this“this”throw“throw”true“true”try“try”typedef“typedef”typeid“typeid”typename“typename”union“union”unsigned“unsigned”using“using”virtual“virtual”void“voidvolatile“volatilewchar_t“wchar_t”whilewhileinteger_literal整数,包括十进制、八进制(以0开头)、十六进制(以0x或0x开头)real_literal实数string字符串character字符附件二myl

14、exer.l源代码%#include #include #include int yywrap();%/*正规定义(规则声明)*/delim tn ws delim+letter a-za-z digit 0-9 identifier letter(letter|digit)* error_id (digit)+(letter)+number digit+(.digit+)?(e+-?digit+)? comment (/*(*/|*)*/)|(/(.)*n)string (.)*character (|)*pun (|)|,|;|=)ari_op (+|-|*|/)rel_op (|=|=|

15、!=) log_op (!|&|)binary_pos_op (identifier(+|-|+=)|-=|*=|/=|%=)binary_pre_op (+|-)identifier)pre_treatment (#(.)+n)%ws /*忽略空格符、制表符、换行符的操作*/ /空格处理comment /*注释*/ /空格处理 auto|_bool|break|case|char|_complex|const|continue|default|do|double|else|enum|extern|float|for|goto|if|_imaginar|inline|int|long|regi

16、ster|restrict|return|short|signed|sizeof|static|structswitch|typedef|union|unsigned|void|volatile|while fprintf(yyout,%st/keyword(关键字)n,yytext);/c语言32个关键字的识别number fprintf(yyout,%st/number(常数)n,yytext);/数字的识别identifier fprintf(yyout,%st/identifier(标识符)n,yytext);/标识符的识别error_id fprintf(yyout,%st/erro

17、r_id(开头为数字的错误标识符)n,yytext);/开头为数字的错误标识符的识别string fprintf(yyout,%st/string(字符串常量)n,yytext);/字符串识别character fprintf(yyout,%st/char_(char型变量)n,yytext);/字符变量识别pun fprintf(yyout,%st/punction(特殊符号)n,yytext);/特殊符号识别ari_op fprintf(yyout,%st/arithmetic operators(算术运算符)n,yytext);/ 算术运算符识别rel_op fprintf(yyout,%st/relational operators(关系运算符)n,yytext);/关系运算符识别pre_treatment fprintf(yyout,%st/pre_tratement(预处理定义)n,yytext);/预处理识别binary_pos_op fprintf(yyout,%st/binary_pos_op(双目向后运算符)n,yytext);/binary_pre_op fprintf(yyout,%st/binary_pre_op(双目向前运算符)n,yytext);/双目运算符的识别log_op fprintf(yyout,%

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论