- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
 
                        查看更多
                        
                    
                编译原理逆波兰式的产生及计算汇编
                    学号	1406410107	成绩			
编译原理上机报告
名		称:	 	  逆波兰式的产生及计算			
学		院:	      信息与控制工程学院			
专		业:	       计算机科学与技术				
班		级:	    	   计算机1401班				
姓		名:	            叶达成					
2016年 11月 4日
一、上机目的
通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。
选择最有代表性的语法分析方法,如LL(1) 语法分析程序算符优先分析程序和分析程序并
2、选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。实前的准备
按实目的和要求,编写语法分析程序,同时考虑相应的数据结构。
调试
调试例子应包括符合语法规则的算术表达式,以及分析程序能够判别的若干错例。
输出
对于所输入的算术表达式,不论对错,都应有明确的信息告诉外界。
扩充
有余力的同学,可适当扩大分析对象。譬如:
算术表达式中变量名可以是一般标识符,还可含一般常数、数组元素、函数调用等等。
除算术表达式外,还可扩充分析布尔、字符、位等不同类型的各种表达式。加强语法检查,尽量多和确切地指出各种错误。
基本原理:
(1)构造一个栈,存放运算对象。
(2)读入一个用逆波兰式表示的简单算术表达式。
(3)自左至右扫描该简单算术表达式并判断该字符,如果该字符是运算对象,则将该字符入栈。若是运算符,如果此运算符是二目运算符,则将对栈顶部的两个运算对象进行该运算,将运算结果入栈,并且将执行该运算的两个运算对象从栈顶弹出。如果该字符是一目运算符,则对栈顶部的元素实施该运算,将该栈顶部的元素弹出,将运算结果入栈。
(4)重复上述操作直至扫描完整个简单算术表达式的逆波兰式,确定所有字符都得到正确处理,我们便可以求出该简单算术表达式的值。
三、上机结果
程序清单:
#includeiostream
#includestdio.h
#includestdlib.h
#includealgorithm
#includecctype
#includecstring
using namespace std;
char str[50];			//用于存放原来的表达式
int top;				//栈顶指针
char stack[50];			//定义栈,用于计算逆波兰式
char ex[50];			//存放后缀表达式
double _stack[50];		//定义栈,用于计算逆波兰式子
int flag[50];			//用于区分+、-号的含义,0表示运算符,1表示正负号
//生成逆波兰式
void NiBolan()
{
    memset(flag,0,sizeof(flag));    //flag初始值设为0
    char ch=str[0];
    int i=1,t=0;
    top=0;
    while(ch!=#)
    {
        switch(ch)
        {
        case (:
            top++;
            stack[top]=ch;
            break;
        case ):
            while(stack[top]!=()
            {
                ex[t]=stack[top];
                top--;
                t++;
            }
            top--;
            break;
        case ^:
            while(stack[top]==^)  //设置^运算符优先级为最高
            {
                ex[t]=stack[top];
                top--;
                t++;
            }
            top++;
            stack[top]=ch;
            break;
        case +:
        case -:
//当ch为+、-号是,若前面相邻字符不是)或数字且后面相邻字符是数字时表示正负号
            if(isdigit(str[i])    !isdigit(str[i-2])   str[i-2]!=))
            {
  
                
原创力文档
                        

文档评论(0)