《编译原理》实验指导及报告书 下载本文

内容发布更新时间 : 2024/11/16 1:24:54星期一 下面是文章的全部内容请认真阅读。

《编译原理》实验指导及报告书

/ 学年 第 学期

姓 名:______________ 学 号:______________ 班 级:______________ 指导教师:______________

计算机科学与工程学院

2016

编译原理 实验初步

一、实验目的

1、熟练掌握使用CODEBLOCK进行C程序编程,提高阅读程序与调试程序的能力。 2、掌握堆栈与队列的应用。

3、掌握C语言中对字符串处理的常见函数与方法。

4、熟悉编程规范,养成对重要的程序段进行必要的注释说明。

二、实验内容与步骤

1、下面的程序是对一个简单的算术表达式进行计算求值,并输出表达式的值与该表达式的后缀形式。该程序在求值与转换后缀形式时使用了2个堆栈和1个队列。请认真阅读程序和调试,并将程序补充完整。 #include #include #include #define ERROR 0 #define OK 1

#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;