南昌航空大学实验报告课程名称: 编译原理 实验名称: PL/O 语言的语法分析过程 BLOCK班级: 07061213 姓名: 何沛浓 同组人:指导教师评定: 签名:实验二 PL/O 语言的语法分析过程 BLOCK一、 实验目的1. 为了更好的配合《编译原理》有关词法分析章节的教学2. 加深和巩固学生对于语法分析的了解和掌握3. 让学生进一步的认识 PL/0 语言的基础和简单的程序编写4. 使学生通过本实验能够初步的了解和掌握程序语法分析的整个过程5. 提高学生的上机和编程过程中处理具体问题的能力二、 实验要求1. 在做本实验之前要先阅读完总体的预备知识以及本实验相关的基础知识。2. 在编写和调试过程中出现的问题最好做一下记录。3. 阅读懂所给出的语法分析程序,然后进行改进。4. 在阅读懂所给出的语法分析程序后,老师将进行逐个的检查以及提问,然后给出成绩。三、 实验内容:1. 阅读所给出的语法分析程序(),搞懂程序中每一个变量的含义,以及每一个过 程的作用,并在该过程中进行中文注释。2. 阅读完程序后,画出各过程的流程图。3. 在阅读懂所给出的语法分析程序后,将你对语法分析的理解写在实验报告上。四、实验代码1、 文件程序:#include <>#include ""#include ""int block(int lev, int tx, bool* fsys){ int i;int dx; //名字分配到的相对地址int tx0; //保留初始 tx 的值int cx0; //保留初始 cx 的值bool nxtlev[symnum]; //开辟新的空间传递给下级函数dx=3;tx0=tx; //记录本层名字的初始位置table[tx].adr=cx;gendo(jmp, 0, 0);if(lev>levmax) error(32);do{if(sym==constsym) //收到常量声明符号,开始处理常量声明{ getsymdo;do{constdeclarationdo(&tx, lev, &dx); //dx 的值会被改变,使用指针while (sym==comma) //句号{ getsymdo;constdeclarationdo(&tx,lev,&dx); }if(sym==semicolon) getsymdo;else error(5);}while(sym==ident);}if(sym==varsym) //收到变量声明符号,开始处理变量声明{ getsymdo;do{ vardeclarationdo(&tx,lev,&dx);while(sym==comma){ getsymdo;vardeclarationdo(&tx,lev,&dx); }if(sym==semicolon) getsymdo;else error(5);}while(sym==ident);}while(sym==procsym) //收到过程声明符号,开始处理过程声明{ getsymdo;if(sym==ident){ enter(procedur, &tx,lev,&dx); //记录过程名字getsymdo; }else error(4); //procedure 后应为标志符if(sym==semicolon) getsymdo;else error(5);memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[semicolon]=true;if(-1==block(lev+1,tx,nxtlev)) return -1; //递归调用if(sym==semicolon){ getsymdo;memcpy(nxtlev,statbegsys,sizeof(bool)*symnum);nxtlev[ident]=true;nxtlev[procsym]=true;testdo(nxtlev,fsys,6); }else error(5);}memcpy(nxtlev,statbegsys,sizeof(bool)*symnum);nxtlev[ident]=true; nxtlev[period]=true;testdo(nxtlev,declbegsys,7);}while(inset(sym,declbegsys)); //直到没有声明符号code[table[tx0].adr].a=cx; //开始生成当前过程代码table[tx0].adr=cx; //当前过程代码地址table[tx0].size=dx; //声明部分中美增加一条声明都会给 dx 增加 1,声明部分已经结束,dx 就是
实验二 语法分析过程 来自beplayapp体育下载www.apt-nc.com转载请标明出处.