编译原理课程设计报告-C语言词法分析器.doc

上传人:来看看 文档编号:5026707 上传时间:2020-01-29 格式:DOC 页数:13 大小:266KB
返回 下载 相关 举报
编译原理课程设计报告-C语言词法分析器.doc_第1页
第1页 / 共13页
编译原理课程设计报告-C语言词法分析器.doc_第2页
第2页 / 共13页
编译原理课程设计报告-C语言词法分析器.doc_第3页
第3页 / 共13页
编译原理课程设计报告-C语言词法分析器.doc_第4页
第4页 / 共13页
编译原理课程设计报告-C语言词法分析器.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《编译原理课程设计报告-C语言词法分析器.doc》由会员分享,可在线阅读,更多相关《编译原理课程设计报告-C语言词法分析器.doc(13页珍藏版)》请在三一文库上搜索。

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,

18、%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,%st/Logical operators(逻辑运算符)n,yytext);/逻辑运算符识别%int yywrap() return 1;int main(int argc, char *argv) yyin = fopen(input.c,r); yyout = fopen(output.tok,w); printf(input.c文件分析完毕,结果保存在output.tok文件n); fprintf(yyout,/c语言词法分析n/2402080216n/杨凯n/2010/12/10nn/词法分析如下:n); yylex(); return 0;- 12 -

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1