[标准实验报告]
南昌航空大学实验报告
年月日
课程名称: 编译原理 实验名称: 扩充的PL/0编译程序 班级: 姓名: 同组人:
指导教师评定: 签名:
一、 实验目的
进一步熟悉编译程序的整体框架,给出整个编译程序的流程结构,用C或vc++语言编写程序;并将编制的编译程序进行调试、实现PL/0编译程序。
二、 实验要求
(1)根据所选的程序设计语言,修改并调试。 (2)举出例子程序,在程序中进行编译。
(3)用此编译程序对有关语句进行编译,并输出目标指令。 (4)书写出合格的实验报告。
三、 实验步骤
1.输入文件中变量的声明形如:var a,b,c; 以var保留字开始,不同变量以”,”分隔,最后以”;”结束。
2.read语句格式为read(a)或者read(a,b);
3.write语句格式为write(a),括号里面没有字符串常量,注意与书后的形如write(‘a=’,a)是不相同的。
4.的声明形如:”procedure proname;”不含参数表。 5.一维数组形如:变量类型array 数组名[数组下标]。 6.条件语句形如:if <条件>then<语句> {;else,语句>}
7.扩充的记录型数据类型形如:for 循环语句及带参数的过程。
四、 参考源代码
#include
1
char ch;
enum symbol sym; char id[al+1]; int num; int cc,ll; int cx;
char line[81]; char a [al+1]; int num ; int cc,ll; int cx;
char line [81]; char a [al+1];
struct instruction code [cxmax]; char word [norw][al];
struct instruction code [cxmax]; char word [norw][al];
enum symbol wsym [norw]; enum symbol ssym [256]; char mnemonic [fctnum][5]; bool declbegsys [symnum]; bool statbegsys [symnum]; bool facbegsys [symnum]; bool facstatbegsys[symnum]; struct tablestruct { char name [al]; enum object kind ; int val; int level; int adr; int size; };
struct tablestruct table [txmax]; FILE * fin; FILE * fout; char fname [al]; int err;
3
#define getsymdo if(-1==getsym())return -1 #define getchdo if(-1==getch())return -1
#define testdo(a,b,c) if(-1==test(a,b,c))return -1 #define gendo(a,b,c) if(-1==gen(a,b,c))return -1
#define expressiondo(a,b,c) if(-1==expression(a,b,c))return -1 #define factordo(a,b,c) if(-1==factor(a,b,c))return -1 #define termdo(a,b,c) if(-1==term(a,b,c))return -1
#define conditiondo(a,b,c) if(-1==condition(a,b,c))return -1 #define statementdo(a,b,c) if(-1==statement(a,b,c))return -1
#define constdeclarationdo(a,b,c) if(-1==constdeclaration(a,b,c))return -1 #define vardeclarationdo(a,b,c) if(-1==vardeclaration(a,b,c))return -1 void error(int n); int getsym(); int getch(); void init();
int gen(enum fct x,int y,int z); int test(bool *sl,bool *s2,int n); int inset (int e,bool *s);
int addset (bool* sr,bool* sl,bool *s2,int n); int subset (bool* sr,bool* sl,bool *s2,int n); int mulset (bool* sr,bool* sl,bool *s2,int n); int block (int lev,int tx,bool* fsys); void interpret();
int factor (bool* fays,int * ptx,int lev); int term (bool* fays,int * ptx,int lev); int condition (bool* fays,int * ptx,int lev); int expression (bool* fays,int * ptx,int lev); int statement (bool* fays,int * ptx,int lev); void listcode(int cx0);
int vardeclaration (int * ptx,int lev,int * pdx); int constdeclaration (int * ptx,int lev ,int * pdx); int position (char * idt,int tx);
void enter (enum object k,int * ptx ,int lev ,int *pdx); int base (int l,int * s,int b);
int main()
{bool nxtlev[symnum]; printf(\
4
scanf(\fin=fopen(fname,\if(fin)
{printf(\scanf(\
/*listwitch=(fname[0]=='y'||fname[0]=='Y');*/ printf(\scanf(\
tableswitch=(fname[0]=='y'||fname[0]=='Y'); fal=fopen(\fprintf(fal,\fprintf(fal,\init(); err=0;
cc=cx=ll=0; ch='';
if(-1 !=getsym())
{ fa=fopen(\fas=fopen(\
addset(nxtlev,declbegsys,statbegsys,symnum); nxtlev[period]=true;
if(-1==block(0,0,nxtlev)) {
fclose(fa); fclose(fal); fclose(fas); fclose(fin); printf(\return 0; }
fclose(fa); fclose(fal); fclose(fas); if(sym!=period) {error(9); }
if(err==0)
{fa2=fopen(\
5