编译原理课程设计基于表达式计算器

上传人:re****.1 文档编号:486151370 上传时间:2023-08-14 格式:DOC 页数:28 大小:306.50KB
返回 下载 相关 举报
编译原理课程设计基于表达式计算器_第1页
第1页 / 共28页
编译原理课程设计基于表达式计算器_第2页
第2页 / 共28页
编译原理课程设计基于表达式计算器_第3页
第3页 / 共28页
编译原理课程设计基于表达式计算器_第4页
第4页 / 共28页
编译原理课程设计基于表达式计算器_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《编译原理课程设计基于表达式计算器》由会员分享,可在线阅读,更多相关《编译原理课程设计基于表达式计算器(28页珍藏版)》请在金锄头文库上搜索。

1、*工程学院编译原理课程设计课程设计题目 :表达式计算器姓 名 :*院(系) :计算机科学与工程学院 专业班级 :计算机科学与技术084班学 号 :200810214415指导教师 :*设计日期 :2010 年 12 月26日I目录表达式计算器11. 需求分析11.1.总述12. 概要设计12.1.开发环境12.2.总体设计22.2.1.模块结构图22.2.2.模块说明22.2.3.界面设计33. 详细设计43.1.词法分析模块:43.1.1.词法分析简介:43.1.2.词法分析模块的设计及实现43.2.语法分析模块113.2.1.语法分析简介113.2.2.语法分析器的实现113.3文法分析1

2、9.1文法分析器生成工具yacc194.测试分析215课程总结246.参考文献25表达式计算器1. 需求分析1.1. 总述计算器是我们经常使用的小工具,它能帮我们对数据进行有效的运算,如通过四则运算能实现对输入数据的加减乘除。本课程设计结合了编译原理中的词法分析、语法分析及语义分析方法,给出了表达式计算器的系统设计过程,并在VC+6.0中使用面向对象的技术实现了计算器。1.2. 功能要求计算器的功能要求如下:可以支持加(+)、减(-)、乘(*)、除(/)运算,如3+4-5*2/2;支持括号运算,如(4+5)*5/8;判断用户输入的表达式是否正确,如3+-*3是一个错误的表达式,在计算时将提示错

3、误;用户输入表达式后,按下等号按钮执行计算。2. 概要设计2.1. 开发环境开发平台:Windows XP + VC+6.0开发语言:C+2.2. 总体设计程序在VC+6.0中使用面向对象的技术实现了计算器。模块设计2.2.1. 模块结构图词法分析模块语法分析模块计算模块需要一个单词识别一个单词得到一个语法短语计算结果图1. 程序模块图2.2.2. 模块说明计算器分为三个功能模块:(1)词法分析模块:对输入的表达式从左到右扫描,识别出表达式中的单词(包括运算符和运算数),若单词的构成不符合词法规则(运算符和运算数的构成规则),则报错并停止计算。(2)语法分析模块:将单词分解为各类语法短语,若存

4、在不符合规则的语法短语,则报错并停止计算。(3)计算模块:对符合语法规则的语法短语进行计算,若计算不能进行,则报错并停止计算。计算器的三个功能模块中语法分析模块起到了核心作用,如图1所示。2.2.3. 界面设计图2表达式计算器3. 详细设计3.1. 词法分析模块:其词法分析器调用接口为lex()3.1.1. 词法分析简介:词法分析是编译原理程序的第一阶段,其任务是:从左至右逐个字符地对源程序扫描和分解,识别出一个个的单词(如标志符、常量、运算符、界符等),并判断单词的构成是否符合词法规则。可以使用上下文无关文法来描述词法规则,使用有限自动机来识别单词。3.1.2. 词法分析模块的设计及实现le

5、x工具的基本使用方法和工作原理:Lex工具是一种词法分析程序生成器,它可以根据词法规则说明书的要求来生成单词识别程序,由该程序识别出输入文本中的各个单词。 一般可以分为。其中规则部分是必须的,定义和用户子程序部分是任选的。(1)定义部分 定义部分起始于 % 符号,终止于 % 符号,其间可以是包括include语句、声明语句在内的C语句。这部分跟普通C程序开头没什么区别。% #include stdio.hint linenum;%(2) 规则部分 规则部分起始于%符号,终止于%符号,其间则是词法规则。词法规则由模式和动作两部分组成。模式部分可以由任意的正则表达式组成,动作部分是由C语言语句组成

6、,这些语句用来对所匹配的模式进行相应处理。需要注意的是,lex将识别出来的单词存放在yytext字符数据中,因此该数组的内容就代表了所识别出来的单词的内容。类似yytext这些预定义的变量函数会随着后面内容展开一一介绍。动作部分如果有多行执行语句,也可以用括起来。%title showtitle();n linenum+;0-9+ printf(Int : %sn,yytext);0-9*.0-9+ printf(Float : %sn,yytext);a-zA-Za-zA-Z0-9* printf(Var : %sn,yytext);+-*/% printf(Op : %sn,yytext)

7、;. printf(Unknown : %cn,yytext0);%A.规则部分的正则表达式规则部分是Lex描述文件中最为复杂的一部分,下面列出一些模式部分的正则表达式字符含义:A-Z, 0-9, a-z 构成模式部分的字符和数字。- 指定范围。例如:a-z 指从 a 到 z 之间的所有字符。 转义元字符。用来覆盖字符在此表达式中定义的特殊意义, 只取字符的本身。 表示一个字符集合。匹配括号内的任意字符。如果第一个字 符是那么它表示否定模式。例如: abC 匹配 a, b, 和C 的任何一个。 表示否定。* 匹配0个或者多个上述模式。+ 匹配1个或者多个上述模式。? 匹配0个或1个上述模式。$

8、 作为模式的最后一个字符时匹配一行的结尾。 表示一个模式可能出现的次数。 例如: A1,3 表示 A 可 能出现1次或3次。a-z5 表示长度为5的,由a-z组成的 字符。此外,还可以表示预定义的变量。 . 匹配任意字符,除了 n。( ) 将一系列常规表达式分组。如:Letter(Letter|Digit)* | 表达式间的逻辑或。一些符号 字符的字面含义。元字符具有。如:* 相当于 *。/ 向前匹配。如果在匹配的模式中的/后跟有后续表达式, 只匹配模版中/前面的部分。如:模式为 ABC/D 输入 ABCD, 时ABC会匹配ABC/D,而D会匹配相应的模式。输入ABCE的话, ABCE就不会去

9、匹配ABC/D。B.规则部分的优先级规则部分具有优先级的概念,先举个简单的例子:%#include stdio.h%n ;A printf(ONEn);AA printf(TWOn);AAAA printf(THREEn);%此时,如果输入内容:rootlocalhost liweitest# cat file1.txtAAAAAAArootlocalhost liweitest# ./parser file1.txtTHREETWOONELex分析词法时,是逐个字符进行读取,自上而下进行规则匹配的,读取到第一个A字符时,遍历后发现三个规则皆匹配成功,Lex会继续分析下去,读至第五个字符时,发

10、现AAAA只有一个规则可用,即按行为进行处理,以此类推。可见Lex会选择最长的字符匹配规则。如果将规则AAAA printf(THREEn);改为AAAAA printf(THREEn);./parser file1.txt 输出结果为:THREETWO(3) 用户子程序部分最后一个%后面的内容是用户子程序部分,可以包含用C语言编写的子程序,而这些子程序可以用在前面的动作中,这样就可以达到简化编程的目的。这里需要注意的是,当编译时不带-ll选项时,是必须加入main函数和yywrap(yywrap将下后面说明)。如:.%showtitle()printf(- Lex Example -n);i

11、nt main()linenum=0;yylex(); /* 进行Lex分析 */printf(nLine Count: %dn,linenum);return 0;int yywrap()return 1;3.2. 语法分析模块3.2.1. 语法分析简介语法分析的任务是:在词法分析的基础上,根据语言的语法规则,把单词串分解成各类语法短语(如句子、程序、表达式等),从而确定整个输入串的结构是否正确。可使用上下文无法文法描述语法规则,算符优先分析法是一种语法分析方法,它特别适合分析各类表达式。3.2.2. 语法分析器的实现(1)产生式: (0)SE(1)EE+T(2)ET(3)TT*F(4)TF(5)F(E)(6)Fi(7)EE-T(8)TT/F(2)得出LR分析表:状态ACTIONGOTOi+-*/()#ETF0S5S41231S6S7ACC2r2r2S8S9r2r23r4r4r4r4r4r44S5S410235r6

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

当前位置:首页 > 大杂烩/其它

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