【实验三】—— 逆波兰式生成实验报告
一、实验名称:逆波兰式生成
二、仪器、设备:计算机
三、参考资料:《编译原理教程》习题解析与上机指导(西安电子科技大 胡元义等)
四、实验目的:将非后缀式用来表示的算术表达式转换为用逆波兰式来表示的算术表达式。
五、实验内容:(实验步骤)
⑴ 按实习目的和要求,用 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<<"error!"<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<<"词法错误,标志符不能以数字开头"<= ";break;
case 9: cout<<"<= ";break;
}
}
}
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<<"输入布尔表达式,以#结束 :"<>buffer[i];
while(buffer[i]!='#')
{
i++;
cin.get(buffer[i]);
}
buffer[i]='\0';
memcpy(inword,buffer,length);
length=lex(inword);
cout<<"词法分析结果如下:"<