编译原理词法分析器语法分析课程设计

上传人:s9****2 文档编号:486758608 上传时间:2024-01-18 格式:DOC 页数:23 大小:146KB
返回 下载 相关 举报
编译原理词法分析器语法分析课程设计_第1页
第1页 / 共23页
编译原理词法分析器语法分析课程设计_第2页
第2页 / 共23页
编译原理词法分析器语法分析课程设计_第3页
第3页 / 共23页
编译原理词法分析器语法分析课程设计_第4页
第4页 / 共23页
编译原理词法分析器语法分析课程设计_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《编译原理词法分析器语法分析课程设计》由会员分享,可在线阅读,更多相关《编译原理词法分析器语法分析课程设计(23页珍藏版)》请在金锄头文库上搜索。

1、编译原理课 程 设 计院 系信息科学与技术学院 专业软件工程年级2023级学号20232723姓名林苾湲西南交通大学信息科学与技术学院2023年12月目录课程设计1 词法分析器21.1设计题目21.2设计内容21.3设计目的21.4设计环境21.5 需求分析21.6概要设计21.7 详细设计41.8 编程调试51.9 测试111.10 结束语13课程设计2赋值语句的解释程序设计142.1 设计题目142.2 设计内容142.3 设计目的142.4 设计环境142.5 需求分析152.6 概要设计162.7 详细设计162.8 编程调试242.9 测试242.10 结束语25课程设计一词法分析器

2、设计一、设计题目 手工设计c语言的词法分析器(可以是c语言的子集)。二、设计内容 处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。三、设计目的了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。四、设计环境该课程设计包括的硬件和软件条件如下:4.1.硬件(1)Intel Core Duo CPU P8700(2)内存4G4.2.软件(1)Window 7 32位操作系统(2)Microsoft Visual Studio c#开发平台4.3.编程语言C#语言五、需求分析5.1.源程序的预处理:源程序

3、中,存在许多编辑用的符号,他们对程序逻辑功能无任何影响。例如:回车,换行,多余空白符,注释行等。在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。5.2.单词符号的识别并判断单词的合法性:将每个单词符号进行不同类别的划分。单词符号可以划分成5中。 (1)标识符:用户自己定义的名字,常量名,变量名和过程名。(2)常数:各种类型的常数。(3)保留字(关键字):如if、else、while、int、float等。(4)运算符:如+、-、*、=等。(5)界符:如逗号、分号、括号等。5.3.将所有合法的单词符号转化为便于计算机处理的二元组形式:(单词分类号,单词自身值);以图形化界面显示出来

4、。5.4.可选择性地将结果保存到文件中。六、概要设计6.1数据类型.单词的分类:本词法分析器演示的是C语言的一个子集,故字符集如下:(1)标识符:以字母开头的字母数字串。(2)整数或浮点型(3)保留字:auto, break, case, char, const, continue, default, do, double, else,enum, extern, float, for, goto, if, int, long, register,return, short, signed, sizeof, static, struct, switch, typedef, union, unsi

5、gned, void, volatile, while(4)运算符:+、-、*、/、%、=、!=、=、=、+、-、!、&、&、|;(5)界符: ( ) : ; “ # , 6.1.2.单词二元组:(单词分类号,单词自身值)表6.1单词分类表单词分类号标识符1常数2保留字3界符4运算符56.2词法分析器的结构源程序输入缓冲区预处理子程序扫描缓冲区1扫描缓冲区2词法分析子程序调用数据返回单词图6.1 词法分析器的结构6.3部分单词的正规式与状态转换图图6.2部分单词的状态转换图6.4功能模块表6.2 词法分析器的C#程序过程或函数功能表过程或函数名简要功能说明GetTokens()分析源程序得到单

6、个单词并大致区分其类型,并生成二元组GetInput( string get )输入源程序NoWs( string aCopy, int cp )去除源程序中的空格符GetTokenType最终确定标识符和保留字OutPut输出二元组到指定的.txt文件中GetResult输出二元组七、详细设计7.1总体流程图开始输入C语言源程序初始化source逐个遍历字符,并去除空格符State 为0进入switch分支循环判断根据state的值选择适当的处理调用相关函数输出处理结果开始 图7.1程序总体流程图7.2主要分支选择算法介绍case0情况算法开始State 为0进入case0是否为界符前一个字

7、符和单词最开始的字符是否为数字对应为哪种界符编码输出结果State置0编号截取该数值输出结果是否为单目运算符是否为数字是否为字母State=10标记该位置为数字开始处State=11记该处为字符开始处State对应更改进入对应选择分支词法出错输出错误原因以及行列结束是是是是是否否否否否 图7.2 部分分支流程图八、编程调试8.1主要源代码/逻辑操作类与函数using System;using System.Collections.Generic;using System.Text;using System.IO;namespace TokenAnalysis struct TokenNode

8、public string type; public string token; class TokenAnalysis int cPosition = 0; int lPosition = 0; int ignorWs = 0; int recordWs = 1; FileInfo output; string source; string kwList = auto, break, case, char, const, continue, default, do, double, else,enum, extern, float, for, goto, if, int, long, reg

9、ister,return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while,printf,scanf,end,main; int Error = -2; int Normal = -1; int statue = -1; bool isComment = false; List resultTokenNodes = new List(); public List GetTokens() TokenNode node2Add = new TokenNode

10、(); int cp = 0;/current position int lp = 0;/last position string aCopy = source; int length = aCopy.Length; aCopy = aCopy.Trim(); while( cp aCopy.Length ) /ID or KeyWords node2Add = this.GetToken( ignorWs, aCopy, ref cp, ref lp ); if( node2Add.type = cmtLeft ) isComment = true; if( node2Add.type =

11、cmtRight ) isComment = false; if( !isComment & node2Add.type != cmtRight ) resultTokenNodes.Add( node2Add ); return resultTokenNodes; public TokenNode GetToken() if( cPosition source.Length ) TokenNode token = this.GetToken( ignorWs, source, ref cPosition, ref lPosition ); return token; else TokenNode token = new TokenNode(); token.token = Error; return token; private TokenNode GetToken( int type, string aCopy, ref int cp, ref int lp ) TokenNode token = new TokenNode(); string tempToken; string tempType; if( type = ignorWs ) if( Char.IsLetter( aCopy cp ) ) cp+; while( cp aCopy.Length &

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 模板/表格 > 财务表格

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号