计算机源程序语法分析器实验.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
计算机源程序语法分析器实验

算术表达式求值 一 问题描述:编写一个能分析包含数值表达式字符串的程序,使其能正确计算出表达式的值,并且具有一定的容错能力。 二 设计思想: 1)表达式的组成 由于表达式分析程序用于计算代数表达式的值,因此必须清楚表达式的各组成部分。虽然表达式可以由多种类型的信息构成,但由于本人的能力有限,所以只研究由以下几项构成的信息: 数字 运算符+、-、*、/、^、%和= 圆括号 运算符的优先级顺序如下: 最高级 + -(一元运算) ^ * / % + - 最低级 = 2)表达式的分析 表达式是一种递归的数据结构,即表达式中包含它们自身。如果暂时假定表达式中只有+、-、*、/和圆括号,则所以的表达式都可以使用下面的规则来定义: expressiong -term [+term] [-term] term -factor [*factor] [/factor] factor -variable、number、or(expression) 说明:方括号表示可选元素,-表示规约。运算符的优先级已经隐含在表达式的定义中。 比如:表达式15*(8+10) 有两个项:15和(8+10),其中一个是数字,一个是括号里的表达式。括号里的表达式又由两个数字组成。 下面给出一个简单的实例来说明本次实验程序的工作原理:(给定表达式为:9/3-(63-3)) 取得第一项,9/3 取得项中的每个因子并进行整除运算,结果为3 取得第二项(63-3)。此时,开始递归分析第二个表达式 取得每一项并相加,结果等于60 从递归调用中返回并用3减去60,结果等于-57 3)表达式的解析 需要一个分析程序来返回表达式中的每个独立的单词。这种方法能够过滤空格等并判断表达式的末尾。该方法为GetToken( )。 下面给出本次程序类的部分定义: class{ enum Type {NONE,DELIMITER,NUMBER};//单词的类型。枚举类型 enum Error {SYNTAX,NUBALPARENS,NOEXP,DIVBYZERO};//分析错误。枚举类型 string exp;//用于存储表达式 int expIdx;//表示下一个单词的索引值 string token;//新获得的单词 Types tokType;//单词的类型 } 三 实验总结及提高 表达式的分析是所有语言编译器、解释器以及任何其他需要把数学表达式转换成计算机能够使用的形式的基础。通过本次实验可以更好地掌握语法分析的基本方法。 语法分析是源程序经词法分析后的一个必经阶段,对于其后的构造语法分析树等有重要作用。本次实验采用的分析方法是递归下降分析发构造分析程序,包含Evaluate()、EvalExp2()、EvalExp3()、EvalExp4()、EvalExp5()、EvalExp6()等六个递归定义的子程序,他们分别针对具有不同运算符的表达式。Evaluate()是程序的入口点,在处理一次表达式后将返回值传递给EvalExp2(),…..类似地传递下去,加入在处理的过程中遇到语法错误,则在相应的递归子程序中返回,并通过自定义的异常类来处理异常(包括打印出错误提示,共定义了4中异常),递归方法使得语法检查更加简单高效。本次实验选择C#语言来实现是比较方便的,因为C#提供了比较方便的引用参数传递,使递归程序实现起来方便。 本次实验可以在此基础上修改成支持带变量的表达式计算。这样将使表达式的计算更灵活智能。 在完成本次实验后,我又用VS2005的开发平台编写了一个类似Windows的计算器,其基本原理是应用本次实验的类来实现的,功能不是很完善,但能正确计算,其界面如下: 四 实验结果 运行本次程序并输入测试数据 输入:13/(6+2)+10*2 输出:21.625 输入:13/(6+2)+ 输出:Syntax Error 输入:13/(1-1) 输出:Division by Zero 输入:13*+3 输出:39 输入:12+2^4-6 输出:22 输入:(空白字符) 则结束 五 源程序(C#描述) using System; //异常类 class ParserException : ApplicationException { public ParserException(string str) : base(str) { } public override string ToString() { return Message; } } cla

文档评论(0)

yurixiang1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档