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

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

举报
开通vip

编译原理课程设计报告-C语言词法分析器编译原理课程设计报告-C语言词法分析器 编译原理 课程设计报告 C语言词法分析器 题目名称 24020802 班 级 学 号 姓 名 指导教师 2010/12/10 编写时间 目 录 1. 课程设计题目名称....................................................................... - 2 - 2. 课程设计目的与任务 ..........................................................

编译原理课程设计报告-C语言词法分析器
编译原理课程设计报告-C语言词法分析器 编译原理 课程设计报告 C语言词法分析器 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 目名称 24020802 班 级 学 号 姓 名 指导教师 2010/12/10 编写时间 目 录 1. 课程设计题目名称....................................................................... - 2 - 2. 课程设计目的与任务 ................................................................... - 2 - 3. 设计思想和实现 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 ................................................................... - 3 - 4. 程序说明 ...................................................................................... - 3 - 5. 程序运行结果和测试报告 ........................................................... - 4 - 6. 存在问题及分析 .......................................................................... - 6 - 7. 总结及体会 .................................................................................. - 6 - 参考文献 ............................................................................................ - 6 - 附件一 ................................................................................................ - 7 - 附件二 .............................................................................................. - 11 - - 1 - 1. 课程设计题目名称 使用工具实现C/C++语言词法分析器 2. 课程设计目的与任务 a) 人数:1人 b) 时间:一周 c) 输入:C/C++源代码文件,即后缀为c/cpp的文件。 d) 输出:后缀为tok的文本性文件。 e) 实现功能:完成C/C++语言的词法分析器 (C语言词法记号及其含义详见附件一) 词法记号 含义 LB “{” LP “(” RB “}” RP “)” PLUS “+” „ „ - 2 - 3. 设计思想和实现方法 词法分析器的作用如下: 1. 读入源程序字符序列 2. 对源程序进行预处理,如删除注释和回车换行符,宏展开等 3. 识别源程序中的单词符号,创建符号表并在相应的符号表中登录信息 4. 输出单词符号序列 对于此题,我们可以选择使用C++人工编写词法分析代码来实现,也可以使用Lex编程来自动生成词法分析器。相对于Lex编程,第一种 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 的有着思路简单,实现方便的优点,但随着词法分析的深入,代码编写的复杂度和重复度逐渐上升,为词法分析的实现增加许多困难;而使用Lex编程则克服了这一困难,若需要增加一种识别模式,仅仅需要增加的是对此模式的正则表达式的编写以及识别后的动作编写。 Lex是一种生成扫描器的工具,我们可以通过编写Lex文件来实现识别文本中的 词汇 英语3500词汇语境记忆pets3考试词汇二年级反义词和近义词初中词汇词汇大全考研英语二高频词汇表 模式的程序。 Lex编程可以分为三步: 1. 以Lex可以理解的格式制定模式相关的动作。 2. 在这一文件上运行Lex,生成扫描器的C/C++代码。 3. 编译和链接C代码,生成可执行的扫描器。 我要做的就是编写C语言词法的正则表达式,以及需要识别的各种词法记号和匹配后需要执行的动作即可,其他的操作都可以交给Lex来执行。 (详细源代码见附件二) 4. 程序说明 一个 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 的Lex程序分为三个段: 第一段:定义部分 全局声明部分起始于“%{”符号,终止于“%}”符号,其间可以包括include语句、声明语句在内的C语句。 例如: %{ #include "stdio.h" int linenum; %} 第二段:规则部分 规则部分起始于“ %%”符号,终止于“%%”符号,其间则是词法规则。词法规则由模式和动作两部分组成。模式部分可以由任意的正则表达式组成,动作部分由C语言语句组成,这些语句用来对所匹配的模式进行相应处理。需要注意的是,lex将识别出来的单词存放在yytext[]字符数据中,因此该数组的内容就代表了所识别出来的单词的内容。 例如: %% delim [ \t\n] ws {delim}+ number {digit}+(\.{digit}+)?(E[+\-]?{digit}+)? {ws} {/*忽略空格符、制表符、换行符的操作*/} {number} {fprintf(yyout,"%s\t//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"); printf("input.c文件分析完毕,结果保存在output.tok文件\n"); fprintf(yyout,"//c语言词法分析\n//2402080216\n//杨凯\n//2010/12/10\n\n//词法分析如下:\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中新建一个工程,命名为test,将mylexer.c加入到source files,将mylexer.h加入到header files,配置好环境变量后编译运行,运行结果如下图所示。用来测试的C语言文件名为input.c,经词法分析后输出的文件命名为output.tok。 由结果可知,顺利完成词法分析任务。 图1 编译运行运行结果 - 4 - 图2 input.c文件截图 图3 output.tok文件截图 - 5 - 6. 存在问题及分析 1?词法分析的正则表达式编写有些不是很全面,比如说识别常数“number”的正则表达式就无法识别8进制、16进制数据。 2?识别某些词法记号的正则表达式编写的不是很严谨,比如说在识别C语言预处理定义语句的正则表达式仅仅只能识别出预处理语句,而无法进行预处理包含的头文件的词法分析。 3?用户自定义程序编写的较为简陋,若能美化一下,人机交互将会更美好。 4?对Lex编程还不是很了解,对词法分析器的作用以及工作原理的理解还有待提高。 7. 总结及体会 在拿到本次课程设计题目后,对完成此次课程设计的两种主流方案进行了一些思考,用C++语言直接编写词法分析程序从思路上来说会比较容易些,也曾试着写过一些代码,但在写代码的过程中,慢慢地就暴露出直接编写词法分析程序的一些问题,比如说代码的重复度很高,代码里充斥着大量的if…switch…语句,极大地增加了代码的复杂度,从而促使我选择使用Lex编程来自动生成词法分析器的方案。使用Lex编程就简化了代码的编写,从而将注意力放在识别词法记号的正则表达式的编写和识别后所执行的动作的编写上。 本次课程设计也暴露了我在编译原理学习中的一些不足,比如对正规式的含义和编写还有一些疑问,对词法分析器的作用和工作原理理解的不是很清等等,通过课程设计很好的复习了编译原理课程中的词法分析部分,对自己理解词法分析有很大的帮助。 参考文献 [1] 陈意云、张昱,《编译原理(第二版)》,高等教育出版社 [2] 毛红梅,《编译原理 学练考》,清华大学出版社 [3] 霍林,《编译技术课程设计与上机指导》,重庆大学出版社 - 6 - 附件一 C语言词法记号及其含义表 词法记号 含义 LB “{” LP “(” RB “}” RP “)” PLUS “+” MINUS “-” MULT “*” DIV “/” MOD “%” PLUSA “+=” MINUSA “-=” MULA “*=” DIVA “/=” MODA “%=” LS “<<” RS “>>” LSA “<<=” RSA “>>=” NOT “!” BITAND "&" BITOR "|" XOR "^" COMPL "~" AND “&&” - 7 - 词法记号 含义 OR “||” LT “<” LE “<=” GT “>” GE “>=” EQ “==” NE “!=” ASSIGN “=” DOT “.” MS "->" LA "[" RA "]" POSINC "++" POSDEC "--" PREINC "++" PREDEC "--" UNARYMINUS "-" UNARYPLUS "+" DEREFERECE "*" ADDRESS "&" COMMA “,” SC ";" IDENTIFIER 标识符 ASM “asm” AUTO “auto” BOOL “bool” BREAK “break” CASE “case” - 8 - 词法记号 含义 CATCH “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 “log” LONG “long” MUTABLE “mutable” NAMESPACE “namespace” NEW “new” - 9 - 词法记号 含义 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” TEMPLATE “template” THIS “this” THROW “throw” TRUE “true” TRY “try” TYPEDEF “typedef” TYPEID “typeid” TYPENAME “typename” UNION “union” UNSIGNED “unsigned” USING “using” VIRTUAL “virtual” VOID “void’ VOLATILE “volatile’ - 10 - 词法记号 含义 WCHAR_T “wchar_t” WHILE while INTEGER_LITERAL 整数,包括十进制、八进制(以0开头)、十六进制(以0x或0X开 头) REAL_LITERAL 实数 STRING 字符串 CHARACTER 字符 附件二 mylexer.l源代码 %{ #include #include #include int yywrap(); %} /*正规定义(规则声明)*/ delim [ \t\n] 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 ("<"|"<="|">"|">="|"=="|"!=") log_op ("!"|"&&"|"||"|"^") binary_pos_op ({identifier}(\+\+|\-\-|\+\=)|\-\=|\*\=|\/\=|\%\=) binary_pre_op ((\+\+|\-\-){identifier}) pre_treatment (\#(.)+\n) - 11 - %% {ws} {/*忽略空格符、制表符、换行符的操作*/} //空格处理 {comment} {/*注释*/} //空格处理 auto|_Bool|break|case|char|_Complex|const|continue|default| do|double|else|enum|extern|float|for|goto|if|_Imaginar|inline| int|long|register|restrict|return|short|signed|sizeof|static|struct switch|typedef|union|unsigned|void|volatile|while {fprintf(yyout,"%s\t//KEYWORD(关键字)\n",yytext);}//c语言32个关键字的识别 {number} {fprintf(yyout,"%s\t//Number(常数)\n",yytext);}//数字的识别 {identifier} {fprintf(yyout,"%s\t//Identifier(标识符)\n",yytext);}//标识符的识别 {error_id} {fprintf(yyout,"%s\t//Error_ID(开头为数字的错误标识符)\n",yytext);}//开头为数字的错误标识符的识别 {string} {fprintf(yyout,"%s\t//String(字符串常量)\n",yytext);}//字符串识别 {character} {fprintf(yyout,"%s\t//Char_(char型变量)\n",yytext);}//字符变量识别 {pun} {fprintf(yyout,"%s\t//Punction(特殊符号)\n",yytext);}//特殊符号识别 {ari_op} {fprintf(yyout,"%s\t//Arithmetic operators(算术运算符)\n",yytext);}// 算术运算符识别 {rel_op} {fprintf(yyout,"%s\t//Relational operators(关系运算符)\n",yytext);}//关系运算符识别 {pre_treatment} {fprintf(yyout,"%s\t//Pre_tratement(预处理定义)\n",yytext);}//预处理识别 {binary_pos_op} {fprintf(yyout,"%s\t//Binary_pos_op(双目向后运算符)\n",yytext);}// {binary_pre_op} {fprintf(yyout,"%s\t//Binary_pre_op(双目向前运算符)\n",yytext);}//双目运算符的识别 {log_op} {fprintf(yyout,"%s\t//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//2402080216\n//杨凯\n//2010/12/10\n\n//词法分析如下:\n"); yylex(); return 0; } - 12 -
本文档为【编译原理课程设计报告-C语言词法分析器】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_321575
暂无简介~
格式:doc
大小:89KB
软件:Word
页数:13
分类:生活休闲
上传时间:2017-09-26
浏览量:34