逆波兰式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

塔里木大学信息工程学院

论文

编译原理课程设计

课目:编译原理

学生姓名:\

学号:

学生姓名

学号:

所属学院:信息工程学院

班级:

设计任务书

指导教师(签章):

年月日

摘要:

编译原理是计算机科学与技术专业最重要的一门专业基础课程,内容庞大,涉及面广,知识点多。编译原理旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。它是计算机科学与技术专业最重要的一门专业基础课程,内容庞大,涉及面广,知识点多。由于该课程教、学难度都非常大,往往费了大量时间而达不到预期教学效果俗语说:学习的最好方法是实践。本课程设计正是基于此,力求为学生提供一个理论联系实际的机会,通过布置一定难度的课题,要求学生独立完成。我们这次课程设计的主要任务是编程实现对输入合法的中缀表达式进行词法分析、语法分析,构造相应的逆波兰式,计算后缀表达式的值输出结果。比如中缀表达式:C*(E+F),其后缀表达式为:CEF+*。逆波兰式也叫后缀表达式,即将运算符写在操作数之后。通过实践,建立系统设计的整体思想,锻炼编写程序、调试程序的能力,学习文档编写规范,培养独立学习、吸取他人经验、探索前言知识的习惯,树立团队协作精神。同时,课程设计可以充分弥补课堂教学及普通实验中知识深度与广度有限的缺陷,更好地帮助学生从全局角度把握课程体系。

关键字:逆波兰式;语法分析;中缀表达式

1 课设综述

1.1 课设来源

在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示。对中缀表达式的计值,并非按运算符出现的自然顺序来执行其中的各个运算,而是根据算符间的优先关系来确定运算的次序,此外,还应顾及括号规则。因此,要从中缀表达式直接产生目标代码一般比较麻烦。相对的,逆波兰式在计算机看来却是比较简单易懂的结构。因为计算机普遍采用的内存结构是栈式结构,它执行先进后出的顺序。

1.2 设计意义

对于实现逆波兰式算法,难度并不大,但为什么要将看似简单的中缀表达式转换为逆波兰式,原因就在于这个简单是相对人类的思维结构来说的,对计算机而言中缀表达式是非常复杂的结构。相对的,逆波兰式在计算机看来却是比较简单易懂的结构。因为计算机普遍采用的内存结构是栈式结构,它执行先进后出的顺序。在逆波兰式中,不存在运算符的优先级问题,也不存在任何括号,计算的顺序完全按照运算符出现的先后次序进行。比中缀表达式的求值要简单得多。1.3 设计目标

编写程序,实现逆波兰式的生成和计算。首先对输入的表达式进行词法分析,然后进行语法分析,最后进行逆波兰式的输出和计算。过实践,建立系统设计的整体思想,锻炼编写程序、调试程序的能力,学习文档编写规范,培养独立学习、吸取他人经验、探索知识的习惯。

1.4 遇到的问题

如何通过递归下降方法分析表达式,并且输出词法分析、语法分析过程及结果。如何实现把中缀表达式转换成后缀表达式,并计算表达式的结果。

1.5 需解决的关键技术

本次课程设计中的关键是:通过递归下降方法分析表达式,主要有词法分析和语法分析,输出分析结果,判断表达式是否合法。如何确定操作符的优先顺序,确定数据的进栈及出栈顺序,根据后缀表达式计算表达式的结果。以及如何编写、调试、修改代码。还要了解一个题目有许多种解决方法。锻炼我们的思维能力。

2 系统分析

2.1 基础知识

2.1.1 词法分析基本原理

词法分析程序完成的是编译第一阶段的工作。词法分析的作用是把符流的程序变为单词序列,输出在一个中间文件上,这个文件作为语法分析程序的输入而继续编译过程。

2.1.2 递归下降的原理

由于时间和技术的限制,语法分析采用递归下降的方法。递归下降法是语法分析中最易懂的一种方法。它的主要原理是,对每个非终极符按其产生式结构构造相应语法分析子程序,其中终极符产生匹配命令,而非终极符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。其中子程序的结构与产生式结构几乎是一致的。

2.1.3 递归下降分析的文法要求

递归下降法要满足的条件:假设A的全部产生式为A→α1|α2|……|αn ,则必须满足如下条件才能保证可以唯一的选择合适的产生式

predict(A→αi)∩predict(A→αj)=Φ,当i≠j。

2.1.4 后缀表达式基础知识

有的编译程序直接生成目标代码,有的编译程序采用中间代码。中间代码,也称中间语言,是复杂性介于源程序代码和机器语言的一种表示形式。一般快速编译程序直接生成目标代码,没有中间代码翻译成目标代码的额外开销。但是为了使编译程序在结构上更为简单明确,常采用中间代码,这样可以将与机器相关的某些实现细节置于代码生成阶段进行处理,并且可以在中间代码一级进行优化工作使得代码优化比较容易实现。编译程序所使用的中间代码有多种形式。我们采用的是逆波兰记号的形式。

逆波兰记号是最简单的一种中间代码表示形式,早在编译程序出现之前,它就用于表示算术表达式,是波兰逻辑学家卢卡西维奇发明的。

这种表示法将运算对象写在前面,把运算符写在后面,叫后缀表达式。后缀表示法表示表达式,其最大优点是易于计算机处理表达式。利用一个栈,自左向右扫描算术表达式。每碰到运算对象,就把它推进栈,碰到运算符,若该运算符

是二目的,则对栈顶部的两个运算对象实施运算,并将运算结果代替运算对象而进栈。若是一目运算符,则对栈顶元素执行该运算,并以运算结果代替元素进栈。最后的结果留在栈顶。

2.2 解决问题的基本思路

根据课程设计的要求,程序应具有如下功能:对输入的表达式进行分析并输出逆波兰式。由于对算数表达式的分析过程比较简单,这里采用递归下降的分析方法。首先对输入的表达式进行词法分析,分析的结果作为语法分析的输入。然后进行语法分析,语法分析采用递归下降的分析方法。最后输出生成的逆波兰式并进行运算。

2.3 总体方案

启动VC++,新建源程序并进行编程,程序的功能模块图如图2-1所示。

图2-1 程序功能模块图

相关文档
最新文档