




免费预览已结束,剩余21页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译原理课 程 设 计院 系 信息科学与技术学院 专 业 软件工程 年 级 2011级 学 号 20112723 姓 名 林苾湲 西南交通大学信息科学与技术学院2013年 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课程设计一 词法分析器设计一、设计题目 手工设计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.源程序的预处理:源程序中,存在许多编辑用的符号,他们对程序逻辑功能无任何影响。例如:回车,换行,多余空白符,注释行等。在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。5.2.单词符号的识别并判断单词的合法性:将每个单词符号进行不同类别的划分。单词符号可以划分成5中。 (1)标识符:用户自己定义的名字,常量名,变量名和过程名。(2)常数:各种类型的常数。(3) 保留字(关键字):如if、else、while、int、float等。(4) 运算符:如+、-、*、=等。(5)界符:如逗号、分号、括号等。5.3.将所有合法的单词符号转化为便于计算机处理的二元组形式:(单词分类号,单词自身值);以图形化界面显示出来。5.4.可选择性地将结果保存到文件中。六、概要设计6.1数据类型6.1.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, unsigned, void, volatile, while(4)运算符:+、-、*、/、%、=、!=、=、=、+、-、!、&、&、|;(5)界符: ( ) : ; “ # , 6.1.2.单词二元组:(单词分类号,单词自身值) 表6.1单词分类表单词分类号标识符1常数2保留字3界符4运算符5 6.2词法分析器的结构源程序输入缓冲区预处理子程序扫描缓冲区1扫描缓冲区2词法分析子程序调用数据返回单词图6.1 词法分析器的结构 6.3部分单词的正规式与状态转换图图6.2部分单词的状态转换图 6.4功能模块表6.2 词法分析器的C#程序过程或函数功能表过程或函数名简要功能说明GetTokens()分析源程序得到单个单词并大致区分其类型,并生成二元组GetInput( string get )输入源程序NoWs( string aCopy, int cp )去除源程序中的空格符GetTokenType最终确定标识符和保留字OutPut输出二元组到指定的.txt文件中GetResult输出二元组七、详细设计7.1总体流程图开始输入C语言源程序初始化source逐个遍历字符,并去除空格符State 为0进入switch分支循环判断根据state的值选择适当的处理调用相关函数输出处理结果开始 图7.1程序总体流程图7.2主要分支选择算法介绍 7.2.1case0情况算法开始State 为0进入case0是否为界符前一个字符和单词最开始的字符是否为数字对应为哪种界符编码输出结果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 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, register,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(); 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 = 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 & ( Char.IsLetterOrDigit( aCopy cp ) | aCopy cp = _ ) ) cp+; tempToken = aCopy.Substring( lp, cp - lp ); tempType = 1 or 3; tempType = GetTokenType( tempToken, tempType ); token.token = tempToken; token.type = tempType; lp = cp = NoWs( aCopy, cp ); /Num else if( Char.IsDigit( aCopy cp ) ) cp+; while( cp aCopy.Length & ( ( Char.IsDigit( aCopy cp ) ) | ( aCopy cp = . & Char.IsDigit( aCopy cp + 1 ) ) ) ) cp+; tempToken = aCopy.Substring( lp, cp - lp ); tempType = 2; token.token = tempToken; token.type = tempType; lp = cp = NoWs( aCopy, cp ); /Border else if( aCopy cp = ( | aCopy cp = ) | aCopy cp = | aCopy cp = | aCopy cp = | aCopy cp = | aCopy cp = , | aCopy cp = ; | aCopy cp = | aCopy cp = | aCopy cp = ) cp+; tempToken = aCopy.Substring( lp, cp - lp ); tempType = 4; token.token = tempToken; token.type = tempType; lp = cp = NoWs( aCopy, cp ); /Operation and other else if( cp ) cp+; break; case *: cp = NoWs( aCopy, cp ); if( aCopy cp = = | aCopy cp = / ) cp+; break; case /: cp = NoWs( aCopy, cp ); if( aCopy cp = = | aCopy cp = * ) cp+; break; case =: cp = NoWs( aCopy, cp ); if( aCopy cp = = ) cp+; break; case : cp = NoWs( aCopy, cp ); if( aCopy cp = = ) cp+; break; case : cp = NoWs( aCopy, cp ); if( aCopy cp = = ) cp+; break; case !: cp = NoWs( aCopy, cp ); if( aCopy cp = = ) cp+; else statue = Error; break; case |: cp = NoWs( aCopy, cp ); if( aCopy cp = | ) cp+; else statue = Error; break; case &: cp = NoWs( aCopy, cp ); if( aCopy cp = & ) cp+; else statue = Error; break; default: statue = Error; break; tempToken = aCopy.Substring( lp, cp - lp ); tempToken = tempToken.Replace( , ); tempType = 5; tempType = GetTokenType( tempToken, tempType ); token.token = tempToken; token.type = tempType; lp = cp = NoWs( aCopy, cp ); return token; public void GetInput( string get ) /source = for( int i = 0; i length; i+ ) /* cmt */; source = get; private int NoWs( string aCopy, int cp ) if( cp aCopy.Length ) while( Char.IsWhiteSpace( aCopy cp ) ) cp+; return cp; private string GetTokenType( string tk2anls, string iniType ) if( iniType = 1 or 3 ) foreach( string kw in kwList ) if( tk2anls = kw ) return 3; return 1; if( iniType = 5 ) if( tk2anls = /* ) return cmtLeft; if( tk2anls = */ ) return cmtRight; return iniType; return UnknownTpye; public void OutPut( string fileName ) FileInfo outFile = new FileInfo( fileName ); StreamWriter fw = outFile.AppendText(); foreach( TokenNode tkNode in resultTokenNodes ) string show = string.Format( 0,-251,-40, tkNode.token, tkNode.type ); System.Console.WriteLine( show ); fw.WriteLine( show ); fw.Close(); public void OutPut() FileInfo outFile = new FileInfo( result.txt ); StreamWriter fw = outFile.AppendText(); foreach( TokenNode tkNode in resultTokenNodes ) string show = string.Format( 0,-251,-40, tkNode.token, tkNode.type ); System.Console.WriteLine( show ); fw.WriteLine( show ); fw.Close(); public List GetResult() List res = new List(); foreach( TokenNode tkNode in resultTokenNodes ) string show = string.Format( 0,-251,-40, tkNode.token, tkNode.type ); res.Add( show ); return res; /前台控制类与函数namespace TokenAnalysis_FormApp public partial class Form1 : Form public Form1() InitializeComponent(); private void btnAnalysis_Click(object sender, EventArgs e) TokenAnalysis.TokenAnalysis ta = new TokenAnalysis.TokenAnalysis(); ta.GetInput(rtxtInput.Text); ta.GetTokens(); List res = ta.GetResult(); lstResult.Items.Clear(); lstResult.Items.AddRange(res.ToArray(); private void btnExit_Click(object sender, EventArgs e) Application.Exit(); private void 保存SToolStripButton_Click(object sender, EventArgs e) saveFileDialog1.Title = 保存分析结果; saveFileDialog1.Filter = 文本文件|*.txt; if( ( saveFileDialog1.ShowDialog() ) = DialogResult.OK ) if( saveFileDialog1.FileName != null ) FileInfo outFile = new FileInfo( saveFileDialog1.FileName ); StreamWriter fw = outFile.AppendText(); foreach( string tkString in lstResult.Items ) fw.WriteLine( tkString ); fw.Close(); private void btnsave_Click(object sender, EventArgs e) saveFileDialog1.Title = 保存分析结果; saveFileDialog1.Filter = 文本文件|*.txt; if (saveFileDialog1.ShowDialog() = DialogResult.OK) if (saveFileDialog1.FileName != null) FileInfo outFile = new FileInfo(saveFileDialog1.FileName); StreamWriter fw = outFile.AppendText(); foreach (string tkString in lstResult.Items) fw.WriteLine(tkString); fw.Close(); 8.2调试 调试过程中存在保存不了输出结果的问题。最后调试发现是由于绝对路径与相对路径的区分。最后上网搜索解决方法,通过调用C#中提供的文件保存接口来解决保存的问题九、测试1.运行的主界面图9.1 运行的主界面2.输入想要分析的c语言源程序图9.2 输入源程序3.点击分析的按钮,显示分析后的结果,以二元组形式展示。图9.3 分析结果4.点击保存按钮,弹出选择保存文件的路径和名称图9.4 保存过程5.保存后的.txt文档图9.5 保存后的文档十、结束语通过这次的课程设计,我学会了很多。让我学会了如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析器的手工方式的相关原理,也对状态图以及如何表示并识别单词规则有了更进一步的了解。并且在掌握状态图对识别程序的编程上有了更深层次的进步。除此之外,还复习了高级语言单词的分类,总之,通过这次的实验,从各方面提高了我的编程能力以及解决问题和bug的能力。但此次的课程设计还存在一定的缺陷,如只实现了c语言子集的词法分析器以及,对于错误的单词无法识别出其错误原因。因此,我在今后的学习中还需要再接再厉,争取编出更完美的程序。25课程设计二 赋值语句的解释程序设计一、设计题目手工设计c语言的赋值语句解释程序(可以是c语言的子集)二、设计内容 2.1.要求用算符优先分析方法设计一个分析程序,对输入的赋值语句,输出语句,清除语句进行词法分析、语法分析、表达求值并存储于指定变量中;若存在错误,提示错误相关信息。2.2.给定文法S-V=E|E?|clearE-E+T|E-T|TT-T*F|T/F|FF-(E)|V|cV-i2.3.给定单词种别码表1 单词种别码表单词种别码单词种别码=1?2+3-4*5/6(7)8v9c10clear11#12N132.4.测试数据a=5b=a+10b?b+a*a?a=a+10三、设计目的1.了解掌握算符优先分析的基本方法;2.理解并处理语法分析中的异常和错误3学会科学思考并解决问题,提高程序设计能力四、设计环境该课程设计包括的硬件和软件条件如下: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数据分析5.1.1数据输入 (1)文法,即定义的语法单位,在进行语法分析时语句的规约必须遵循该文法定义。 (2)算数表达式,如a=5、b=a+10、b?5.1.2数据输出 (1)四元式 语法分析器所输出的分析结果用如下的四元式表示: (操作符,操作数1,操作数2,结果) 其中,操作符为文法定义中的=,?,+,-,*,/,(,)中的一个。 (2)算符优先关系表。 表2 算符优先关系表=?+-*/()v#=?+-*/(=i#type = INPUT_ERROR; temp_ip-value.strv = (char *)malloc(sizeof(char) * 11); memcpy(temp_ip-value.strv, &instrin_index, sizeof(char); return temp_ip; if(is_char() while(is_char() | is_num() inputin_length+ = instrin_index; in_index +; input = (char *)realloc(input, sizeof(char) * (in_length + 1); inputin_length = 0; if(in_length) temp_ip = (inuct *)malloc(sizeof(inuct); if(strcmp(input, clea
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 5.1 人类面临的主要环境问题 教学设计 2024-2025学年高一下学期 地理湘教版(2019)必修第二册
- Unit 5 There is a big bed Part A Let's try Let's talk(教学设计)-2024-2025学年人教PEP版英语五年级上册
- 蔬菜分拣知识培训课件
- 2.7电路中的开关 教学设计-2023-2024学年科学四年级下册教科版
- 第3阶段 出谜教学设计-2025-2026学年小学信息技术(信息科技)第四册河北大学版(第2版)
- 蓄电池的工作原理课件
- 小学考试试卷及答案
- 蒸菜馆知识培训课件
- 2025年全国茶艺师职业技能考试题库(含答案)
- 2025-2026学年地质版(2024)小学体育与健康二年级全一册《当心动物伤到你》教学设计
- 设备维护方案(3篇)
- 肉类加工间管理制度
- 2024-2025学年苏教版四年级下学期期末测试数学试卷(含答案)
- 动脉导管未闭封堵术的医疗护理
- 农村供水管网延伸工程可行性研究报告
- 2025年人教PEP版(2024)小学英语四年级上册(全册)教学设计(附目录)
- 快递公司快递员管理制度
- 转租养殖场地合同范本
- 施工工艺标准化做法实施图集汇编
- 精神运动发育迟缓护理要点
- 二年级上学期收心教育
评论
0/150
提交评论