《编译原理》实验指导及报告书
/ 学年 第 学期
姓 名:______________ 学 号:______________ 班 级:______________ 指导教师:______________
计算机科学与工程学院
2016
编译原理 实验初步
一、实验目的
1、熟练掌握使用CODEBLOCK进行C程序编程,提高阅读程序与调试程序的能力。 2、掌握堆栈与队列的应用。
3、掌握C语言中对字符串处理的常见函数与方法。
4、熟悉编程规范,养成对重要的程序段进行必要的注释说明。
二、实验内容与步骤
1、下面的程序是对一个简单的算术表达式进行计算求值,并输出表达式的值与该表达式的后缀形式。该程序在求值与转换后缀形式时使用了2个堆栈和1个队列。请认真阅读程序和调试,并将程序补充完整。 #include
#define STACK_INT_SIZE 10 /*存储空间初始分配量*/ #define Queue_Size 20
typedef int ElemType; /*定义元素的类型*/
typedef struct{
char Qdata[Queue_Size]; int front,rear; }SeqQueue;
typedef struct{
ElemType *base; ElemType *top;
int stacksize; /*当前已分配的存储空间*/ }SqStack;
SqStack OPTR, OPND; SeqQueue SeQ;
char PreTab[7][7]={{'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=','x'}, {'>','>','>','>','x','>','>'}, {'<','<','<','<','<','x','='} }; // 该矩阵中,X字符表示不存在优先关系,在分析过程查找到这个值,表示表达式有错。
char *OpretorS=\ // 运算符集
char *Express=\ // 初始化的表达式
// 注意本程序只分析1位整数的表达式的运算,所以输入的表达式要注意!! // 能力强的同学自己进行扩展:增加词法分析过程进行拼数。
int InitStack(SqStack *S); /*构造空栈*/ int push(SqStack *S,ElemType *e); /*入栈*/ int Pop(SqStack *S); /*出栈*/
void initQueue(SeqQueue *Q){/*队列初始化*/ Q->front=0; Q->rear=0; }
int EnterQueue(SeqQueue *Q,char c){ /*入队*/ if (Q->rear==Queue_Size)
{ printf(\队列满,无法入队!\\n\ Q->Qdata[Q->rear]=c; Q->rear++; return OK; }
int OutQueue(SeqQueue *Q,char *e){ /*出队*/ if(Q->front==Q->rear)
{ printf(\队列空,无法出队!\\n\ *e=Q->Qdata[Q->front++]; return OK; }
int InitStack(SqStack *S){
S->base=(ElemType *)malloc(STACK_INT_SIZE *sizeof(ElemType)); if(!S->base) return ERROR; S->top=S->base;
S->stacksize=STACK_INT_SIZE; return OK; }/*InitStack*/
int Push(SqStack *S,ElemType e){
if ((S->top-S->base)>STACK_INT_SIZE) return 0; *S->top=e; S->top++; return OK; }
int Pop(SqStack *S){ int e;
if (S->top==S->base ) return 0;