编译原理逆波兰式实验java_【实验三】—— 逆波兰式生成实验报告

实验三 逆波兰式生成实验报告

一、实验名称:逆波兰式生成

二、仪器、设备:计算机

三、参考资料:《编译原理教程》习题解析与上机指导(西安电子科技大 胡元义等)

四、实验目的:将非后缀式用来表示的算术表达式转换为用逆波兰式来表示的算术表达式。

五、实验内容:(实验步骤)

⑴ 按实习目的和要求,用C语言编写一个逆波兰式生成程序,同时考虑相应的数据结构。

⑵ 调试

调试例子应包括符合语法规则的算术表达式,以及分析程序能够判别的若干错例。

⑶ 输出

对于所输入的算术表达式,不论对错,都应有明确的信息告诉外界。

⑷ 扩充

有余力的同学,可适当扩大分析对象。考虑将布尔表达式转换成逆波兰的算法实现。

六、实验原理、数据(程序)记录

(一)实验原理:

逆波兰式生成的实验设计思想及算法

(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。

(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。

(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。

(4)如果不是数字,该字符则是运算符,此时需比较优先关系。

做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。

(5)重复上述操作(1)-(2)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。

(二)参考程序:

//简单算术表达式的逆波兰转换程序

#include

#include

#include

#include

#include

struct danci

{

int id;   //单词种别

char name[10]; //单词属性值

};

int fout[20];

int index=1;

int G_table[9][6];

int k[20];

int n=0;

danci word[20];

int boo(int);

int compare(int);

int not(int);

int forid(int);

typedef struct node{

int data;

node* next;

}* link;

link insert(link stack,int n)//向前插入链表

{

link newnode;

newnode=new node;

if(!newnode)

{

cout<

exit(0);

}

newnode->data=n;

newnode->next=stack;

stack=newnode;

return stack;

}

link del(link stack,int &value)//删除链表元素

{

link top;

if(stack)

{

top=stack;

stack=stack->next;

value=top->data;

delete top;

return stack;

}

value=-1;

return NULL;

}

void error()

{

cout<

exit(0);

}

void error1()

{

cout<

exit(0);

}

in

case 7: cout<

case 8: cout<= ";break;

case 9: cout<

}

}

}

index=0;

}

int compare(int i)

{

int ii;

i=not(i);

while(word[i].id==4||word[i].id==5||word[i].id==6

||word[i].id==7||word[i].id==8||word[i].id==9)

{

ii=i;

i++;

i=not(i);

fout[index]=ii;

index++;

}

return i;

}

void main()

{

char buffer[30];

int i=0;

int length;

char *inword;

init();

print();

cout<

cin>>buffer[i];

while(buffer[i]!='#')

{

i++;

cin.get(buffer[i]);

}

buffer[i]='\0';

memcpy(inword,buffer,length);

length=lex(inword);

cout<

cout<

for( i=0;i

{ cout<

cout<

n=length;

forboland(length);

gram(k);

cout<

//逆波兰式翻译

boland();

cout<

}

七、实验结果分析

输入任意的算术表达式,包括若干正例和错例,验证。

如课后习题1中的若干。写出结果,作为此实验的结果分析。

八、实验体会(小结)。

最后修改于 2008-05-23 00:33

阅读(?)评论(0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值