编译实验指导书(2017)

合集下载

编译方法实验报告(中间代码生成器)

编译方法实验报告(中间代码生成器)

编译方法实验报告(中间代码生成器)编译方法实验报告20xx年10月一、实验目的熟悉算术表达式的语法分析与中间代码生成原理。

实验内容二、(1)设计语法制导翻译生成表达式的四元式的算法;(2)编写代码并上机调试运行通过。

输入——算术表达式;输出——语法分析结果;相应的四元式序列。

(3)设计LL(1)分析法或LR(0)分析法的属性翻译文法,并根据这些属性翻译文法,使用扩展的语法分析器实现语法制导翻译。

三、实验原理及基本步骤●算术表达式文法:G(E):E ? E ω0 T | TT ? T ω1 F | FF ? i | (E)●文法变换:G’(E) E ? T {ω0 T}T ? F {ω1 F}F ? i | (E)●属性翻译文法:E ? T {ω0 “push(SYN, w)” T “QUAT”}T ? F {ω1 “push(SYN, w)” F “QUAT”}F ? i “push(SEM, entry(w))” | (E)其中:push(SYN, w) —当前单词w入算符栈SYN;push(SEM, entry(w)) —当前w在符号表中的入口值压入语义栈SEM;QUAT —生成四元式函数i.T = newtemp;ii.QT[j] =( SYN[k], SEM[s-1], SEM[s], T); j++;iii.pop( SYN, _ ); pop( SEM, _ ); pop( SEM, _ );push( SEM, T );●递归下降子程序:数据结构:SYN —算符栈;SEM —语义栈;四、数据结构设计使用递归的结构进行四元式的设计,同时,运用堆栈结构将四元式的输出序列打印出来while ( exp[i]=='+' || exp[i]=='-'){syn[++i_syn]=exp[i]; //push(SYN,w)i++; //read(w)T();quat();}while ( exp[i]=='*' || exp[i]=='/'){syn[++i_syn]=exp[i]; //push(SYN,w)i++; //read(w)F();quat();}void quat(){strcpy(qt[j],"(, , , )");//QT[j]:=(SYN[k],SEM[s-1],SEM[s],temp);qt[j][1]=syn[i_syn];qt[j][3]=sem[i_sem-1];qt[j][5]=sem[i_sem];qt[j][7]=temp;j++;i_syn--; //pop(SYN);i_sem--; //pop(SEM);i_sem--; //pop(SEM);sem[++i_sem]=temp; //push(SEM,temp);temp++;}五、关键代码分析(带注释)及运行结果#include <iostream>#include "string.h"#include "stdio.h"using namespace std;char syn[10]; //文法符号栈 int i_syn;char sem[10]; //运算对象栈 int i_sem;char exp[50]; //算术表达式区 int i;char qt[30][15]; //四元式区 int j=0;char temp='q'; //临时变量,取值为r--z int E();int T();int F();void quat(); //生成四元式函数 int main(int argc, char* argv[]){ printf("please input your expression:");scanf("%s",exp); //输入四元式 i=0; //read(w) E();if (exp[i]=='\0')for (i=0;i<j;i++) //输出四元式序列 printf("%s\n",qt[i]);elseprintf("err");return 0;}int E(){T();while ( exp[i]=='+' || exp[i]=='-'){syn[++i_syn]=exp[i]; //push(SYN,w)i++; //read(w)T();quat();}return 1;}int T(){F();while ( exp[i]=='*' || exp[i]=='/'){syn[++i_syn]=exp[i]; //push(SYN,w)i++; //read(w)F();quat();}return 1;}int F(){if ( exp[i]=='('){i++; //read(w)E();if ( exp[i]!=')'){printf("err");return 0;}}else if ((exp[i]>='a' && exp[i]<='p')||(exp[i]>='0' && exp[i]<='9')){sem[++i_sem]=exp[i]; } //push(SEM,w)else{printf("err");return 0;}i++; //read(w)return 1;}void quat(){strcpy(qt[j],"( , , , )"); //QT[j]:=(SYN[k],SEM[s-1],SEM[s],temp);/ p > p c l a s s = " t " > q t [ j ] [ 1 ] = s y n [ i _ s y n ] ; / p > p c l a s s = " t " > q t [ j ] [ 3 ] = s e m [ i _ s e m - 1 ] ; / p > p c l a s s = " t " > q t [ j ] [ 5 ] = s e m [ i _ s e m ] ; / p > p c l a s s = " t " > q t [ j ] [ 7 ] = t e m p ; / p > p c l a s s = " t " > j + + ; / p > p c l a s s = " t " > i _ s y n - - ; / / p o p ( S Y N ) ; / p > p c l a s s = " t " > i _ s e m - - ; / / p o p ( S E M ) ; / p > p c l a s s = " t " > i _ s e m - - ; / / p o p ( S E M ) ; / p > p c l a s s = " t " > s e m [ + + i _ s e m ] = t e m p ; / / p u s h ( S E M , t e m p ) ; / p > p c l a s s = " t " > t e m p + + ; } / p > p c l a s s = " g " >。

编译实验指导

编译实验指导

编译原理课程设计目录1.1课程设计的基本要求和方法______________________ 2一、目的 ________________________________________________________ 2二、课程设计步骤 ________________________________________________ 2三、考核评估 ____________________________________________________ 31.2编译原理设计题目——中间代码生成器和自动生成器 3一、中间代码生成器 ___________________________________________ 3二、自动生成工具FLEX 和Y ACC _______________________________ 41.3编译原理课程设计题目—面向对象的编译器设计____ 5三、面向对象的词法编译器设计 _________________________________ 5四、面向对象的中间代码编译器设计 _____________________________ 6五、面向对象的目标代码编译器设计 _____________________________ 71.4 编译原理设计题目—算法过程模拟_______________ 9六、限自动机的生成及化简过程模拟 _____________________________ 9七、First集和Follow集生成算法模拟 ____________________________ 9八、LL(1)分析过程模拟_______________________________________ 10九、FirstVT集和LastVT集生成算法模拟 ________________________ 11十、算符优先分析表生成模拟 __________________________________ 12十一、算符优先分析过程模拟 ____________________________________ 12 十二、LR分析过程模拟 _________________________________________ 131.1课程设计的基本要求和方法一、目的进一步培养学生编译器设计的思想,加深对编译原理和应用程序的理解,针对编译过程的重点和难点内容进行编程,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。

编译技术实验指导书

编译技术实验指导书

编译技术实验指导书计算机科学与工程学院前言《编译技术》是计算机科学与技术、软件工程等专业的一门理论性较强的专业课,旨在培养大学生的计算机专业素质和基本编译程序设计的能力。

通过实验教学,使学生加深对所学知识的理解,掌握编译程序构造原理和实现技术。

它的目的和任务是:让学生掌握编译程序的基本原理和实现技术,提高学生对程序设计语言的理解,让学生了解将高级程序设计语言源程序翻译成计算机能处理的目标代码语言的整个过程,培养学生的编译程序设计的能力。

编译程序的设计包括词法分析程序的设计、语法分析程序的设计、语义分析程序的设计和中间代码生成程序的设计等。

本实验指导书是金成植编著的《编译程序构造原理和实现技术》的配套教材。

编者根据计算机课程实践性强等特点,编写了本实验教程,帮助学生有计划地系统地上机实践。

根据教学内容和教学目标,实验指导书设计了八次实验,实验学时16学时,每个实验2学时。

学生应按照实验指导书的要求,完成指定的实验任务,并及时提交实验报告。

要求学生在每次实验之前做好预习,实验后按要求写出实验报告。

在每次实验过程中教师要考核学生每次实验的完成情况。

一、为保证实验效果学生应做到:1、遵守实验室的规章制度,爱护教学设备。

2、学生必须按时上机下机。

3、禁止做与实验无关的内容,禁止利用实验学时玩计算机游戏;4、每次实验前学生应做好预习,实验后按时提交实验报告。

二、实验报告的要求:1、明确实验的目的及要求;2、记录下相应编译阶段的程序设计的思想、程序代码及运行的结果;3、说明实验中出现的问题和解决过程;4、写出实验的体会和实验过程中没解决的问题。

由于编者水平有限,书中难免有错,敬请大家批评指正。

辽宁科技大学计算机学院科学系2009年2月目录实验一词法分析器的手工构造...................................................... . (3)实验二词法分析器的自动生成........................................... . (10)实验三递归下降语法分析程序设计 (18)实验四LL(1)语法分析程序设计..................................... ....... . (22)实验五LR语法分析器程序设计....................................... .. (27)实验六说明语句的语法制导翻译........................................... ...... .. (32)实验七中间代码生成程序设计............................................. (35)实验八微小编译器的设计............................................ (37)实验一词法分析器的手工构造实验类型:验证性实验要求:必修一、实验目的:通过本次实验,使学生掌握词法分析的构造原理及实现技术,会编写简单程序设计语言的词法分析器。

20170328修订-生物化学实验指导书(2017) (1)

20170328修订-生物化学实验指导书(2017) (1)

《生物化学》实验指导书2017年03月28日修订目录实验一生物化学实验常用仪器设备及使用实验二甲醛滴定法实验三糖的定量:3,5-二硝基水杨酸比色法实验四粗脂肪提取和含量测定实验五血清蛋白的醋酸纤维薄膜电泳实验六动物组织中脱氧核糖核酸的制备及测定实验一生物化学实验常用仪器设备及使用一、生物化学实验须知1.实验室规则(1) 实验课必须提前5 分钟到实验室,不迟到,不早退,应自觉遵守课堂纪律。

(2) 使用仪器、药品、试剂和各种物品必须注意节约, 应特别注意保持药品和试剂的纯净, 严防混杂污染。

(3) 实验台、试剂药品架必须保持整洁, 仪器药品摆放井然有序。

实验完毕,需将药品、试剂排列整齐, 仪器洗净倒置放好, 实验台面抹拭干净, 经教师验收仪器后, 方可离开实验室。

(4) 使用和洗涤仪器时, 应小心谨慎, 防止损坏仪器。

使用精密仪器时, 应严格遵守操作规程, 发现故障应立即报告教师, 不要自己动手检修。

(5) 在实验过程中要听从教师的指导, 严肃认真地按操作规程进行实验, 并简要、准确地将实验结果和数据记录在实验记录本上。

课后写出实验报告, 由课代表收齐交给教师。

(6)仪器损坏时, 应如实向教师报告, 真填写损坏仪器登记表, 然后补偿一定金额。

(7)每次实验课安排同学轮流值日, 值日生要负责当天实验的卫生和安全检查。

2.实验记录实验课前应认真预习实验内容,将实验名称、实验原理、实验内容和步骤等简单扼要写在记录本上。

实验记录本要标明页码,不能随意撕掉任何一页。

实验中使用的试剂纯度和终浓度以及使用的仪器类型等都要记录清楚。

实验中观察到的现象、结果和得出的数据,应及时直接记在记录本上,绝对不可以随意记在单片纸上。

原始记录必须准确、简练、清楚。

3.实验报告的书写实验结束后,应及时整理和总结实验结果, 写出实验报告。

(1)标题标题应包括实验名称、实验时间、实验室名称、实验组号、实验者及同组者姓名、实验室条件。

(2)实验目的(3)实验原理应简述基本原理,不要完全照抄实验指导书。

实验报告编译实验

实验报告编译实验

一、实验目的1. 理解编译原理的基本概念和过程。

2. 掌握编译器的基本组成和编译流程。

3. 学会使用编译器对源代码进行编译,并分析编译结果。

二、实验环境1. 操作系统:Windows 102. 编译器:GCC (GNU Compiler Collection)3. 开发工具:Visual Studio Code三、实验内容1. 编译器的基本组成和编译流程2. 编译器的使用3. 编译结果分析四、实验步骤1. 编译器的基本组成和编译流程(1)词法分析:将源代码分解成一个个的单词,如标识符、关键字、运算符等。

(2)语法分析:将单词序列转换成语法树,验证源代码是否符合语法规则。

(3)语义分析:检查语法树,确保源代码在语义上是正确的。

(4)中间代码生成:将语法树转换成中间代码,如三地址代码。

(5)代码优化:对中间代码进行优化,提高程序运行效率。

(6)目标代码生成:将优化后的中间代码转换成目标代码,如汇编代码。

(7)代码生成:将目标代码转换成可执行文件。

2. 编译器的使用(1)编写源代码:使用Visual Studio Code编写C语言源代码。

(2)编译源代码:在命令行中输入gcc -o 程序名源文件名.c,编译源代码。

(3)运行程序:在命令行中输入程序名,运行编译后的程序。

3. 编译结果分析(1)词法分析:编译器将源代码中的单词进行分解,如以下代码:```cint main() {int a = 1;return a;}```编译器将分解为以下单词:- int- main- (- )- {- int- a- =- 1- ;- return- a- ;- }- }(2)语法分析:编译器将单词序列转换成语法树,验证源代码是否符合语法规则。

(3)语义分析:编译器检查语法树,确保源代码在语义上是正确的。

(4)中间代码生成:编译器将语法树转换成中间代码,如以下三地址代码:```t1 = 1a = t1t2 = areturn t2```(5)代码优化:编译器对中间代码进行优化,如以下优化后的三地址代码:```a = 1return a```(6)目标代码生成:编译器将优化后的中间代码转换成汇编代码。

编译原理实验指导书(李宏芒)

编译原理实验指导书(李宏芒)

编译原理实验指导书(李宏芒)《编译原理》实验指导书李宏芒编写适用专业:计算机科学与技术合肥工业大学计算机与信息学院2012年 12 月前言《编译原理》是计算机专业的一门核心课程,在计算机本科教学中占有十分重要的地位。

由于《编译原理》课程兼有很强的理论性和实践性,并且编译程序构造的算法比较复杂,因而让学生在学习时普遍感到内容抽象、不易理解,难易掌握。

但是掌握编译原理的基本理论和设计思想是非常重要的,尤其是将本课程的理论知识与计算机应用中的许多领域紧密联系与广泛应用结合,将有利于提高学生专业素质和适应社会多方面需要的能力,因此,通过理论授课和上机实践相结合,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地加以运用;通过实验逐步提高学生的编程能力和调试程序的能力以及解决实际问题的能力,使学生培养出扎实的软件开发基本技能,并养成良好的编程风格,为进一步学习后续课程和将来从事应用软件开发奠定良好的基础。

实验课时具体内容安排如下:一、实验课的性质和目的(1)深刻理解程序语言编译系统的结构及各部分的功能。

(2)熟练掌握设计和构造程序语言编译系统的基本原理和技术。

(3)能独立编写清晰、工整、结论正确的编译原理的源程序。

(4)能学会上机进行正确调试,并进行程序修改。

即培养发现程序错误,排除错误的能力和经验。

二、实验课的基本要求:(1)掌握编译程序的功能和结构。

(2)掌握词法分析器的设计方法与实现步骤加深对讲授内容的理解,尤其是一些语法给定,通过上机实验帮助掌握。

(3)掌握语法分析器的设计方法与实现步骤。

(4)掌握符号表和存储空间的组织。

(5)掌握代码优化的作用与实现方法(6)掌握错误的诊断和校正方法。

三、主要实验教学方法实验前,由任课教师落实实验任务,每个学生必须事先独立完成好程序的设计的源程序编写工作。

实验课上对疑难点作集中辅导。

实验过程中随时针对不同的情况作个别启发式辅导。

实验后,学生撰写并提交实验报告。

编译方法实验指导书

编译方法实验指导书

少年易学老难成,一寸光阴不可轻- 百度文库目录No table of contents entries found.实验一 词法分析器设计【实验目的】1.熟悉词法分析的基本原理,词法分析的过程以及词法分析中要注意的问题。

2.复习高级语言,进一步加强用高级语言来解决实际问题的能力。

3.通过完成词法分析程序,了解词法分析的过程。

【实验内容】用JAVA 语言编写一个PL/0词法分析器,为语法语义分析提供单词,使之能把输入的字符串形式的源程序分割成一个个单词符号传递给语法语义分析,并把分析结果(基本字,运算符,标识符,常数以及界符)输出。

【流程图】NY N Y NN 调用语法分析函数初始化词法分析器 程序结束 从文本中读入一行字符,存于一个字符串不断读入,直到出现非数字符号 输出二元组及常数表,标识符从字符串中读出一个字符 判断文字是否读完 判断为何种字符 看是否有算符或运算符判断是否为保留字 将该项插入常数表增加一个对应的二元组 增加一个对应的二元组将该项插入标识符表中 报错,出现非法字符不断读入,直到出现非字母或数字符号 判断是否到行尾符号 字母 YY【源代码】package accidence_analyse;import java.io.*;import java.util.*;import buffer.*;public class AccidenceAnalyser {private java.io.File SourceFile;private java.io.File ReserveFile;private java.io.File ClassFile;private java.io.File OutputFile;public Pretreatment pretreatment;public KeyWordTable keyWordTable;public ClassIdentity classIdentity;public Scaner scaner;public ConcreteScanBufferFactory csbFactory;/*** 2)词法分析器主程序*/public AccidenceAnalyser() {System.out.println("[INFOR]已经建立词法分析器!");}public void initAA() {//创建缓冲工厂this.csbFactory=newConcreteScanBufferFactory();//创建字符串扫描对象scaner = new Scaner(this);//创建pre处理对象pretreatment=newPretreatment(SourceFile, this);//创建关键字表对象keyWordTable= new KeyWordTable(ReserveFile);//创建对象种别码表对象classIdentity = new ClassIdentity(ClassFile);System.out.println("[INFOR]已经初始化词法分析器!"); }public void setFilesPath(String reserveFileName, String ClassFileName,String sourceFileName, String outputFileName) {//创建文件对象SourceFile = new java.io.File(sourceFileName);//创建文件对象ReserveFile = new java.io.File(reserveFileName);//创建文件对象ClassFile = new java.io.File(ClassFileName);//创建文件对象OutputFile = new java.io.File(outputFileName);//如果文件已经存在,先删除,然后建立新文件if (OutputFile.exists()) {OutputFile.delete();}try {OutputFile.createNewFile();}catch(Exceptione){e.printStackTrace(System.err);}try {//创建文件随机读取对象java.io.RandomAccessFile ROutputFile = new java.io.RandomAccessFile(this.OutputFile, "rw");//提示信息ROutputFile.write("///////////////////////////////////////\n".getBytes());ROutputFile.write( ("//JAccidenceAnalyser version " + getVersion() +" design by yellowicq//\n").getBytes());ROutputFile.write("//java词法分析器//////////////\n".getBytes());ROutputFile.write("//使用java语言开发///\n".getBytes());ROutputFile.write("\n".getBytes());ROutputFile.write("词法分析结果如下:\n".getBytes());//关闭文件流ROutputFile.close();}catch (Exception e) {e.printStackTrace(System.err);}}public void startAA() {//从预处理开始词法分析this.pretreatment.startPretreatment();}public void outputAccidence(String outputString) {//把分析出来的单词写入文件outputString="\n[第" + this.pretreatment.fileRow + "行]\n" + outputString;try {//创建文件随机读取对象java.io.RandomAccessFile ROutputFile = new java.io.RandomAccessFile(this.OutputFile, "rw");//移动指针到文件末尾ROutputFile.seek(ROutputFile.length());//Start appending!ROutputFile.write(outputString.getBytes());//关闭文件流ROutputFile.close();}catch (Exception e) {e.printStackTrace(System.err);}//将分析的单词结果输出到终端System.out.print(outputString);}public void controlThread() {//控制扫描器启动扫描scaner.controlThread();}//获得版本号public String getVersion() {return "1.0";}}package accidence_analyse;import java.util.*;import java.io.*;public class ClassIdentity {private Hashtable ClassHash;private File ClassFile;private FileReader classFileReader; //读文件对象private int TMP_BUFFER_SIZE = 30;/*** 6)类型种别码程序*/public ClassIdentity(java.io.File ClassFile) {System.out.println("[INFOR]类型种别码表已创建!");this.ClassFile = ClassFile;}//查找类型种别码public int findKey(String classWord) {int KEY;for (Enumeration e = this.ClassHash.keys(); e.hasMoreElements(); ) {KEY=Integer.parseInt((String)e.nextElement());if( ( (String)this.ClassHash.get(Integer.toString(KEY))).equalsIgnoreCase(classWord)) {return KEY;} }return -1;}public void initClassIdentityTable() {ClassHash = new Hashtable(); //创建hash表int intLength;char[] chrBuffer = new char[TMP_BUFFER_SIZE];String classWord;int classCounter = 0;try {if (ClassFile.exists()) { //文件存在//创建读文件对象classFileReader=newjava.io.FileReader(ClassFile);//读文件内容到hash表while((intLength=classFileReader.read(chrBuffer)) != -1) {classCounter++;//填写hash表classWord = String.valueOf(chrBuffer).trim();System.out.println("[INFOR]读取类型种别码: [KEY: " + classCounter + "][VALUE: " + classWord + "]");this.ClassHash.put(Integer.toString(classCounter), classWord);}//关闭读文件对象classFileReader.close();}else { //文件不存在System.err.println("[ERROR]类型种别码文件不存在!");}}catch (Exception e) {e.printStackTrace(System.err);}}}package accidence_analyse;import java.util.*;import java.io.*;public class KeyWordTable {private Hashtable KWHash;private File ReserveFile;private FileReader resFileReader; //读文件对象private int TMP_BUFFER_SIZE = 30;/*** 5)表留字表程序*/public KeyWordTable(java.io.File ReserveFile) {System.out.println("[INFOR]关键字表已创建!");this.ReserveFile = ReserveFile;}public boolean isKeyWord(String inw) {String resWord;//查找hash表for (Enumeration e = this.KWHash.elements(); e.hasMoreElements(); ) {resWord = (String) e.nextElement();if (resWord.equalsIgnoreCase(inw)) {return true;}}return false;}public void initKeyWordTable() {KWHash = new Hashtable(); //创建hash表int intLength;char[] chrBuffer = new char[TMP_BUFFER_SIZE];String resWord;int resCounter = 0;try {if (ReserveFile.exists()) { //文件存在//创建读文件对象resFileReader = new java.io.FileReader(ReserveFile);//读文件内容到hash表while((intLength = resFileReader.read(chrBuffer))!= -1) { resCounter++;//填写hash表resWord = String.valueOf(chrBuffer).trim();System.out.println("[INFOR]读取关键字: [INDEX: " + resCounter +"][VALUE: " + resWord + "]");this.KWHash.put(Integer.toString(resCounter), resWord);}//关闭读文件对象resFileReader.close();}else { //文件不存在System.err.println("[ERROR]保留字文件不存在!");}}catch (Exception e) {e.printStackTrace(System.err);}}}package accidence_analyse;import javax.xml.parsers.*;import org.w3c.dom.*;public class main {/*** 1) 词法分析器引导文件*/public static void main(String[] args) {//读取配置文件,得到系统属性String cfgString[] = new String[4];try {cfgString = main.loadAACfg("d:\\aaCfg.xml");}catch (Exception e) {e.printStackTrace(System.err);}//设置待读文件名//保留字表文件String reserveFileName = cfgString[0];//类型种别码表文件String classFileName = cfgString[1];//需要分析的源文件String sourceFileName = cfgString[2];//输出文件String outputFileName = cfgString[3];//创建词法分析器AccidenceAnalyser aa=new AccidenceAnalyser();aa.setFilesPath(reserveFileName, classFileName, sourceFileName,outputFileName);//建立所需要的文件对象//初始化词法分析器aa.initAA();//初始化关键字表aa.keyWordTable.initKeyWordTable();//初始化类型种别码表aa.classIdentity.initClassIdentityTable();//开始进行词法分析aa.startAA();//分析完毕}//读取配置文件private static String[] loadAACfg(String name) throws Exception {String cfgString[] = new String[4];/*解析xml配置文件*/try {/*创建文档工厂*/DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();/*创建文档解析器*/DocumentBuilder builder = factory.newDocumentBuilder();/*解析配置文件*/Document doc = builder.parse(name);/*规范化文档*/doc.normalize();/*查找接点表*/NodeList nlists = doc.getElementsByTagName("FilePath");for (int i = 0; i < nlists.getLength(); i++) {Element item = (Element) nlists.item(i);//取得需要的配置属性cfgString[0] = item.getElementsByTagName("ReserveFileName").item(0).getFirstChild().getNodeValue().trim();cfgString[1] = item.getElementsByTagName("ClassFileName").item(0).getFirstChild().getNodeValue().trim();cfgString[2] = item.getElementsByTagName("SourceFileName").item(0).getFirstChild().getNodeValue().trim();cfgString[3] = item.getElementsByTagName("OutputFileName").item(0).getFirstChild().getNodeValue().trim();}}catch (Exception e) {e.printStackTrace();throw new Exception("[ERROR]加载配置文件" + name + " 错误!");}//返回属性数组return cfgString;}}package accidence_analyse;import java.io.*;import buffer.*;public class Pretreatment {private String tmpString;private String outputString;private int BUFFER_SIZE = 100;private AccidenceAnalyser aa;public InputBuffer inputBuffer; //输入缓冲区--共享private java.io.File SourceFile; //文件对象private java.io.RandomAccessFile randomAFile; //随机文件对象public static int fileRow = 0;/*** 3)预处理子程序*/public Pretreatment(File SourceFile, AccidenceAnalyser aa) {try {this.SourceFile = SourceFile;this.randomAFile = new java.io.RandomAccessFile(this.SourceFile, "r");}catch (FileNotFoundException e) {e.printStackTrace(System.err);}this.aa = aa;inputBuffer = aa.csbFactory.createInputBuffer(BUFFER_SIZE);System.out.println("[INFOR]预处理器已经创建!");}public void putSourceToINBuffer(String tmpString) {this.inputBuffer.Data = tmpString.toCharArray();}public void putFinToSCBuffer(String filtratedString) {aa.scaner.scanBuffer.Data = filtratedString.toCharArray();}public void controlThread() {int intLength;int resCounter = 0;String tmpString;String filtratedString;System.out.println("[INFOR]开始单词分析////////////////////////////////////////"); try {if (SourceFile.exists()) { //文件存在//读文件内容到缓冲区while ( (tmpString = this.randomAFile.readLine()) != null) {++fileRow;//分割符System.out.println("...................begin row " + this.fileRow +".......................");//开始这一行分析System.out.println("[INFOR]正在处理行: " + String.valueOf(fileRow));//放入输入缓冲区this.putSourceToINBuffer(tmpString);//处理字符串filtratedString = this.filtrateSource(this.inputBuffer.Data);System.out.println("[INFOR]已过滤句子: " + filtratedString);//放入扫描缓冲区this.putFinToSCBuffer(filtratedString);aa.controlThread();}System.out.println("[INFOR]分析完毕////////////////////////////////////////////");}else { //文件不存在System.err.println("[ERROR]源文件不存在!");}}catch (Exception e) {e.printStackTrace(System.err);}}public String filtrateSource(char[] Data) {String filtratedString = String.valueOf(Data).trim();return filtratedString;}public void startPretreatment() {this.controlThread();}}package accidence_analyse;import buffer.*;public class Scaner {public ScanBuffer scanBuffer; //扫描缓冲区--共享private String finalAccidence;private AccidenceAnalyser aa;private int BUFFER_SIZE = 100;private String toDelString;private int senLength = 0;private char[] sentenceChar = new char[1000];private String TOKEN;private char CHAR;private int index = 0;private String IDENTITY = "identity";private String DIGIT = "digit";private String WORD_ERROR_INF = "在此行发现不能识别的单词,此行分析终止!"; private boolean ASTATE = true;/*** 4)扫描子程序*/public Scaner(AccidenceAnalyser aa) {this.aa = aa;initBuffer();this.finalAccidence = "";System.out.println("[INFOR]扫描处理器已经创建!");}public String readFromBuffer(char[] Data) {String toDelString = String.valueOf(Data);return toDelString;}public String scan(String toDelString) {sentenceChar = toDelString.toCharArray();this.senLength = sentenceChar.length;int i = 0;//分析单词while (this.index <= this.senLength) {//state0:this.TOKEN = "";this.CHAR = GETBC(sentenceChar);if (this.CHAR == ';') {break; //';'表示这一行结束}//进入状态判断switch (this.CHAR) {//judge lettercase 'a':case 'b':case 'c':case 'd':case 'e':case 'f':case 'g':case 'h':case 'i':case 'j':case 'k':case 'l':case 'm':case 'n':case 'o':case 'p':case 'q':case 'r':case 's':case 't':case 'u':case 'v':case 'w':case 'x':case 'y': case 'z':case 'A':case 'B':case 'C':case 'D':case 'E':case 'F':case 'G':case 'H':case 'I':case 'J':case 'K':case 'L':case 'M': case 'N':case 'O':case 'P':case 'Q':case 'R':case 'S':case 'T':case 'U':case 'V':case 'W':case 'X':case 'Y':case 'Z': //dothis.TOKEN = this.CONTACT(TOKEN, CHAR);//state1CHAR = this.GETCHAR(sentenceChar);while (this.ISLETTER(CHAR) || this.ISDIGIT(CHAR)) {this.TOKEN = this.CONTACT(this.TOKEN, CHAR);CHAR = this.GETCHAR(sentenceChar);}this.RETRACT();//state2if (aa.keyWordTable.isKeyWord(TOKEN)) {this.finalAccidence = this.finalAccidence + "[保留字] " +this.returnAWord(TOKEN) + "\n";}else {this.finalAccidence = this.finalAccidence + "[标识符] " +this.returnAWord(TOKEN) + "[种别码] " +String.valueOf(aa.classIdentity.findKey(IDENTITY)) + "\n";}//clear up tokenthis.TOKEN = "";break;//judge dititalcase '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': //dothis.TOKEN = this.CONTACT(TOKEN, CHAR);//state3CHAR = this.GETCHAR(sentenceChar);while (this.ISDIGIT(CHAR)) {this.TOKEN = this.CONTACT(TOKEN, CHAR);CHAR = this.GETCHAR(sentenceChar);}this.RETRACT();//state4this.finalAccidence = this.finalAccidence + "[数字] " +this.returnAWord(TOKEN) + "[种别码] " +String.valueOf(aa.classIdentity.findKey(DIGIT)) + "\n";//clear up tokenthis.TOKEN = "";break;case '='://state5this.TOKEN = this.CONTACT(TOKEN, CHAR);this.finalAccidence = this.finalAccidence + "[等号] " +this.returnAWord(TOKEN) + "[种别码] " +String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +"\n";//clear up tokenthis.TOKEN = "";break;case '+'://state6this.TOKEN = this.CONTACT(TOKEN, CHAR);this.finalAccidence = this.finalAccidence + "[加号] " +this.returnAWord(TOKEN) + "[种别码] " +String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +"\n";//clear up tokenthis.TOKEN = "";break;case '*'://state7this.TOKEN = this.CONTACT(TOKEN, CHAR);CHAR = this.GETCHAR(sentenceChar);if (CHAR == '*') {this.TOKEN = this.CONTACT(TOKEN, CHAR);this.finalAccidence = this.finalAccidence + "[乘方] " +this.returnAWord(TOKEN) + "[种别码] " +String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +"\n";}//state9else {this.finalAccidence = this.finalAccidence + "[乘号] " +this.returnAWord(TOKEN) + "[种别码] " +String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +"\n";}//clear up tokenthis.TOKEN = "";break;case ','://state10this.TOKEN = this.CONTACT(TOKEN, CHAR);this.finalAccidence = this.finalAccidence + "[逗号] " +this.returnAWord(TOKEN) + "[种别码] " +String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +"\n";//clear up tokenthis.TOKEN = "";break;case '('://state11this.TOKEN = this.CONTACT(TOKEN, CHAR);this.finalAccidence = this.finalAccidence + "[左括号] " +this.returnAWord(TOKEN) + "[种别码] " +String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +"\n";//clear up tokenthis.TOKEN = "";break;case ')'://state12this.TOKEN = this.CONTACT(TOKEN, CHAR);this.finalAccidence = this.finalAccidence + "[右括号] " +this.returnAWord(TOKEN) + "[种别码] " +String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +//clear up tokenthis.TOKEN = "";break;case '{'://state13this.TOKEN = this.CONTACT(TOKEN, CHAR);this.finalAccidence = this.finalAccidence + "[左大括号] " +this.returnAWord(TOKEN) + "[种别码] " +String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +"\n";//clear up tokenthis.TOKEN = "";break;case '}'://state14this.TOKEN = this.CONTACT(TOKEN, CHAR);this.finalAccidence = this.finalAccidence + "[右大括号] " +this.returnAWord(TOKEN) + "[种别码] " +String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +"\n";//clear up tokenthis.TOKEN = "";break;case '['://state15this.TOKEN = this.CONTACT(TOKEN, CHAR);this.finalAccidence = this.finalAccidence + "[左中括号] " +this.returnAWord(TOKEN) + "[种别码] " +String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +"\n";//clear up tokenthis.TOKEN = "";break;case ']'://state16this.TOKEN = this.CONTACT(TOKEN, CHAR);this.finalAccidence = this.finalAccidence + "[右中括号] " +this.returnAWord(TOKEN) + "[种别码] " +String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +"\n";//clear up tokenthis.TOKEN = "";break;case '.'://state17this.TOKEN = this.CONTACT(TOKEN, CHAR);this.finalAccidence = this.finalAccidence + "[点号] " +this.returnAWord(TOKEN) + "[种别码] " +String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +"\n";//clear up tokenthis.TOKEN = "";break;default://state18this.TOKEN = this.CONTACT(this.TOKEN, this.CHAR);//追加出错信息this.finalAccidence = this.finalAccidence + "[ERROR]" +this.WORD_ERROR_INF + "'" + this.TOKEN + "'" + "\n";this.ASTATE = false;//clear up tokenthis.TOKEN = "";break;}if (this.ASTATE == false) {break;}}return this.finalAccidence;}public void controlThread() {this.toDelString = this.readFromBuffer(this.scanBuffer.Data);this.aa.outputAccidence(this.scan(this.toDelString));//分割符System.out.println("...................end row " + aa.pretreatment.fileRow +".........................");//结束这一行分析//clear up the varthis.index = 0;this.finalAccidence = "";this.ASTATE = true;this.toDelString = "";this.senLength = 0;this.TOKEN = "";}public String returnAWord(String TOKEN) {return TOKEN;}public void initBuffer() {this.scanBuffer = aa.csbFactory.createScanBuffer(BUFFER_SIZE); }//以下为字符的处理方法public char GETBC(char[] sentenceChar) {try {while ( (sentenceChar[this.index]) == ' ') {this.index++;}this.index++;}catch (ng.ArrayIndexOutOfBoundsException e) {return ';'; //表示此行已经结束}return sentenceChar[index - 1];}public char GETCHAR(char[] sentenceChar) {next();return sentenceChar[this.index - 1];}public void next() {this.index++;}public boolean ISLETTER(char letter) {return ng.Character.isLetter(letter);}public boolean ISDIGIT(char letter) {return ng.Character.isDigit(letter);}public String CONTACT(String TOKEN, char CHAR) {String tmpS = TOKEN + String.valueOf(CHAR);TOKEN = tmpS;return TOKEN;}public boolean ISRESERVE(String TOKEN) {return aa.keyWordTable.isKeyWord(TOKEN);}public void RETRACT() {this.index--;}}package buffer;//abstract buffer interfacepublic interface Buffer {}package buffer;public interface BufferFactory {/*** 7)抽象扫描缓冲区工厂*/public ScanBuffer createScanBuffer(int size);public InputBuffer createInputBuffer(int size);}package buffer;public class ConcreteScanBufferFactoryimplements BufferFactory {/*** 8)缓冲区工厂*/public ConcreteScanBufferFactory() {System.out.println("[INFOR]缓冲区工厂已经建立!"); }public ScanBuffer createScanBuffer(int size) {System.out.println("[INFOR]创建扫描缓冲区!");return new ScanBuffer(size);}public InputBuffer createInputBuffer(int size) {System.out.println("[INFOR]创建输入缓冲区!");return new InputBuffer(size);}}package buffer;import java.io.*;public class InputBufferimplements Buffer {public char[] Data;/*** 10)输入缓冲区对象*/public InputBuffer(int size) {this.Data = new char[size]; }}package buffer;public class ScanBufferimplements Buffer { public char[] Data;/*** 11)扫描缓冲区对象*/public ScanBuffer(int size) {this.Data = new char[size]; }}【程序部分截图】实验二 LL (1)语法分析程序设计【实验目的】1.熟悉判断LL (1)文法的方法及对某一输入串的分析过程。

VS2017-实验手册-中文

VS2017-实验手册-中文

实验一 C# 7.0 特性与 IDE 扩展
一、本地方法或内嵌方法:
定义在方法内的方法称为本地方法。 • 打开 Visual Studio 2017,点击文件 -> 新建项目 -> Console App (.Net Framework) • • 项目名称 “UseLocalFunctitic System.Console; namespace UseLocalFunctions { // Exercise 1 class Program { static void Main(string[] args) { void Add(int x, int y) { WriteLine($"Sum of {x} and {y} is : {x + y}"); }
public class Program { public static void Main(string[] args) { Shape sh = new Rectangle(); Program obj = new Program();
sh.Radius = 5; sh.Height = 10; sh.Length = 15; obj.CheckShape(sh); ReadLine(); } public void CheckShape(Shape sh) { switch (sh) { case Circle c: WriteLine($"circle with radius {sh.Radius}"); break; case Rectangle s when (sh.Length == sh.Height): WriteLine($"{sh.Length} x {sh.Height} square"); break; case Rectangle r: WriteLine($"{sh.Length} x {sh.Height} rectangle"); break; default: WriteLine("<unknown shape>"); break; case null: throw new System.ArgumentNullException(nameof(shape)); } } } public class Shape { public int Height; public int Length; public int Radius; } public class Circle : Shape { public int Height; public int Length; public int Radius; } public class Rectangle : Shape { public int Height; public int Length; public int Radius; } public class Square : Shape { public int Height; public int Length; public int Radius; }

Python实验指导书

Python实验指导书

Python实验指导书Python实验指导书马川燕⼭⼤学计算机教学实验中⼼2017、5⽬录实验⼀:P YTHON程序设计之初窥门径 (2)实验⼆:P YTHON程序设计之结构与复⽤ (8)实验三:P YTHON程序设计之组合数据类型 (11)实验四:P YTHON程序设计之⽂件 (16)实验⼀:Python程序设计之初窥门径⼀、实验⽬得:1.了解Python得基本编程环境,熟悉其主要组成部分与使⽤。

2.熟悉turtle库语法元素,了解其绘图坐标体系、画笔控制函数与运动命令函数.通过程序实例,初步掌握Python程序设计得基本概念、编程规则与开发过程。

3.掌握Python得基本数据类型得概念与使⽤;运⽤Python得标准数学库进⾏数值计算;掌握字符串类型得格式化操作⽅法与应⽤.⼆、知识要点:1、⼀张图尽览Python:2.Turtle库语法元素3。

基本数据类型三、实验内容及步骤:基础实验:1、启动 IDLE,新建⽂件,请根据课本中内容,将“蟒蛇绘制”程序逐⾏输⼊其中,并运⾏效果。

2、正⽅形螺旋线得绘制。

(1)利⽤turtle库绘制⼀个正⽅形螺旋线,效果如下图所⽰。

(2)修改上⾯程序,绘制斜螺旋线,效果如下图所⽰.(3)修改上⾯程序,绘制彩⾊斜螺旋线,效果如下图所⽰。

3、彩⾊蟒蛇绘制.修改1中“蟒蛇绘制”程序,对 Python 蟒蛇得每个部分采⽤不同颜⾊,绘制⼀条彩⾊蟒蛇。

(提⽰:参考彩⾊斜螺旋线绘制程序.实现⽅法有很多,按照您⾃⼰得思路发挥吧)程序完成后,上传提交。

4、绘制奥运五环图,其中五种颜⾊分别为蓝⾊、⿊⾊、红⾊、黄⾊与绿⾊。

注意根据实际效果调整圆形得⼤⼩与位置.效果如图所⽰.请补全绿⾊环得代码,将程序上传提交。

5、参照课本中带刷新得⽂本进度条例⼦,制作⼀个模拟windows启动界⾯得⽂本进度条,执⾏效果如下图所⽰。

源码如下:实验⼆:Python程序设计之结构与复⽤⼀.实验⽬得1.掌握程序得分⽀、循环等控制结构;2.掌握random随机库得使⽤⽅法;3。

《编译原理》实验指导书(程细柱)

《编译原理》实验指导书(程细柱)

前言“编译原理”课程是计算机本科专业的必选课程,上机实验是该课程的重要环节,应开实验数约为12学时。

一个编译程序把源程序翻译成等价的目标程序,一般应做词法分析、语法分析、语义分析、代码生成和代码优化等五个方面的工作,为了使学生对其有较深的理解,必须根据这五个方面设计实验。

本指导书正是根据课程的内容,将实验分为前期准备阶段、基本操作阶段和技术提高阶段三个阶段进行:①前期准备阶段的实验主要是为后续实验做好准备,应围绕编译原理课程进行设计,如:学生可根据教科书的内容,设计一个源程序的输入和扫描程序,并完成相应的设计报告;②基本操作阶段的实验是围绕着编译原理的五个方面的工作来进行,其内容主要是词法分析、语法分析、语义分析、代码生成和代码优化等,如:简单的词法分析程序、LL(1) 分析法算法、语义分析程序、中间代码和目标代码生成算法的实验,这些实验基本上包括了以上知识要点,学生可结合书本上有关的知识来完成;③技术提高阶段的实验是综合性课程设计实验,根据编译原理编制应用程序,不仅要求把书本上的内容掌握好,同时还需要自学一些相关的知识。

1目录第1章实验的一般知识 (3)1—1 软件实验室规则及安全守则 (3)1-2 实验条件 (3)1—3 实验的基本要求 (3)第2章实验技术及原理 (3)第3章实验项目 (4)实验一:源程序的输入和扫描(2学时) (4)实验二:词法分析算法(2学时) (6)实验三:LL(1) 分析算法(2学时) (8)实验四:语义分析算法(2学时) (11)实验五:中间代码生成算法(2学时) (14)实验六:目标代码生成算法(4学时) (14)实验七:“编译原理”课程设计(8学时) (14)附录:实验报告示例:有限自动机的运行实验 (16)参考文献:《编译原理》吕映芝、张素琴、蒋维杜等主编清华大学出版社《编译原理与实现》..金成植编高教出版社《编译程序设计原理》..杜淑敏王永宁编北大出版社2第1章实验的一般知识1—1 软件实验室规则及安全守则见《软件实验室规则及安全守则》)。

实验指导书编译原理

实验指导书编译原理

编译原理实验教学指导书计算机科学与工程学院华南理工大学目录1 实验简介 (3)2 TINY+语言介绍 (4)2.1 TINY+语言的词法定义 (4)2.2 TINY+的语法定义 (5)2.3 TINY+的语义定义 (7)2.4 用TINY+语言编写的示例程序 (7)3 实验1:实现TINY+语言的词法分析器 (9)3.1 实验目的 (9)3.2 实验要求 (10)3.3 TINY+的测试程序及词法分析器的输出 (10)4 实验2:实现TINY+的语法分析器、语义分析器以及中间代码生成器 (13)4.1 实验目的 (13)4.2 实验要求 (14)4.3 TINY+示例程序及其输出 (14)附录:和TINY+文法规则对应的生成三地址中间代码的属性文法 (16)1 实验简介学生在实验中,构造一个将TINY+高级程序设计语言转换为TINY+虚拟机上的中间代码的编译器。

整个实验包括两个部分:实验一完成TINY+编译器的词法分析器部分;实验二完成TINY+编译器的语法分析器部分、语义分析器部分及中间代码生成器部分。

每个同学必须独立完成自己的实验,与其他同学的讨论或合作是允许的,但必须是有限度的,可以互相交流想法和方法,但不能抄袭。

学术不端将导致成绩为零。

TINY+的编译器必须用C语言或C++语言实现(推荐使用Microsoft Visual Studio)。

2 TINY+语言介绍实验定义了一种叫TINY+的高级程序设计语言,该语言是对TINY 语言的一个扩充,TINY+比TINY增加了程序的声明部分,while语句,字符串类型定义等等,在本节的描述中,用蓝色字体标识的是TINY语言原有的词法及语法规定,而用红色字体标识的是TINY+语言扩充的词法及语法规定。

本节主要是对TINY+语言的介绍,具体包括:1)TINY+语言的词法定义,包括对TINY+语言的单词(token)的描述;2)TINY+语言语法结构的EBNF描述;3)TINY+语言主要的语义描述;4)TINY+的实例程序2.1 TINY+语言的词法定义1.TINY+语言的关键字(keyword)包括:or and int bool char while doif then else end repeat until read write所有的关键字是程序设计语言保留使用的,并且用小写字母表示,用户自己定义的标识符不能和关键字重复。

129677548599719473编译原理实验指导书(新)

129677548599719473编译原理实验指导书(新)

前言编译原理是计算机科学与技术、软件工程等专业的主干课和必修课,由于这门课程相对抽象且内容较复杂,一直是比较难学的一门课程。

在编译原理的学习过程中,实验非常重要,只有通过上机实验,才能使学生对比较抽象的课程内容产生一个具体的感性认识。

但是,目前国内市场上很少有较详细且比较适合我院实际的实验指导书,为此,我们特编了这份指导书,希望能对我院的《编译原理》教学工作有所帮助。

本书实验环境主要为C环境(由于兼容性问题,建议使用Turboc2.0)及一个词法分析器自动生成工具FLEX和一个语法分析器自动生成工具BISON。

书中给出的参考源程序也是C源程序,但由于实验者熟悉精通的语言工具不尽相同,因而强求采用统一的编程语言编程是不现实的。

实验者在掌握了编译程序各个阶段的功能和原理之后,不难借助使用其他自己熟悉的语言实现相关功能。

实验者在实验过程中应该侧重写出自己在算法分析、设计思路、实现功能或程序代码等方面的特色,写出设计和实现过程中遭遇到的难点和解决办法,可以不拘泥于实验指导给出的参考性设计思路,尽可能在深度和广度上加以拓展。

只有这种各具特色的实验报告,才将更有利于体现实验者在创新思维和动手能力上的差异。

通过这些实验,能使学生对这些部份的工作机理有一个详细的了解,达到“知其然,且知其所以然”的目的。

并可在C环境下对自动生成工具生成的词法、语法分析器进行编译调试。

由于手工生成词法和语法分析器的工作量太大,在实际中常用自动生成工具来完成之。

这些工具中最著名的当属贝尔实验室的词法分析器生成工具LEX和语法分析器生成工具YACC。

它们现已成为UNIX的标准应用程序同UNIX一起发行。

与此同时GNU推出与LEX完全兼容的FLEX,与YACC完全兼容的BISON。

这两个程序都在Internet上以源代码的形式免费发行,所以很容易在其它操作系统下重新编译安装。

我们实验采用的就是for dos的FLEX和BISON。

本书有关的编译工具及其源程序例子,可到BISON的网站上下载。

编译原理课程实验指导书.docx

编译原理课程实验指导书.docx

《编译原理》课程实验指导书(Compiler Principle)计算机科学与技术专业04级吴臣杨跃武编写佛山科学技术学院2009年3月目录序言 (1)一、实验安排 (2)第一阶段:编译器的词法分析 (2)第二阶段:编译器的语法分析 (2)第三阶段:编译器的代码生成 (3)二、考核方式及评定标准 (4)三、参考资料与编译器分析 (4)第一部分PL语言及其编译器 (4)1.PL语言介绍 (4)1.1 PL语言的语法图 (5)2.PL语言编译器 (8)2.1词法分析 (9)2.2语法分析 (9)2.3语义分析 (11)2.4代码生成 (11)2.5代码执行 (13)2.6错误诊断处理 (15)2.7符号表管理 (17)2.8其他 (18)第二部分上机实验要求 (19)第三部分PL语言编译器源程序与示例 (21)1 • 不例与结果表不 (21)1.1 PL语言源程序 (21)1.2生成的代码(片段) (23)2.PL语言编译器源程序 (23)序言本《编译原理》实验,其口的是让大家动手设计和实现一个规模适屮的语言的编译器,该编译器不仅涉及编译程序的各个阶段,而且也强调了编译的总休设计、各个阶段的接口安排等等。

通过上机实践,来设计这个相对完整的编译器,一方面可以使同学们增加对编译程序的整体认识和了解一一巩固《编译原理》课程所学知识,另一方面,通过上机练习,学生也可以学到很多程序调试技巧和设计大型程序一般的原则,如模块接口的协调,数据结构的合理选择等等。

为了使学生能尽早动手实践,我们建议把实践分成三部分,首先阅读木教程第一部分,在这部分就PL语言的语法及其编译程序的各个阶段作了简单介绍,以便对PL编译程序有个初步的印象。

其次要认真阅读理解第三部分所给出的PL 编译器源程序及示例,使上一阶段的初步印象得以加深、具体化。

最后按照第二部分的实验要求扩充PL语言的功能并加以实现。

具体操作时分成三个阶段:词法分析、语法分析及代码生成。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《编译原理》
实验指导书
太原理工大学计算机与软件学院
2017 年 3 月
《编译原理》实验
适用专业:计算机实验类别:专业实验
实验时数:8学时
一、实验课程的性质、目的和任务
1.培养学生初步掌握编译原理实验的技能。

2.验证所学理论、巩固所学知识并加深理解。

3.对学生进行实验研究的基本训练。

二、实验课程的内容、要求及学时分配
实验一、无符号数的词法分析程序(4学时)
内容:掌握词法分析的基本思想,并用高级语言编写无符号数的词法分析程序。

要求:从键盘上输入一串字符(包括字母、数字等),最后以“;”结束,编写程序识别出其中的无符号数。

无符号数文法规则可定义如下:
<无符号数>→<无符号实数>│<无符号整数>
<无符号实数>→<无符号整数>.<数字串>[E<比例因子>]│
<无符号整数>E<比例因子>
<比例因子>→<有符号整数>
<有符号整数>→[+│-]<无符号整数>
<无符号整数>→<数字串>
<数字串>→<数字>{<数字>}
<数字>→0 1 2 3 (9)
读无符号数的程序流程图见下图
实验二、逆波兰式生成程序(4学时)
内容:掌握语法分析的基本思想,并用高级语言编写逆波兰式生成程序;
要求:利用逆波兰式生成算法编写程序,将从键盘上输入的算术表达式(中缀表达式)转化成逆波兰式。

逆波兰表达式的生成过程涉及到运算符的优先级,下表中列出几个常用运算
符的优先关系。

常用运算符优先关系矩阵
如上表所示的优先关系矩阵表示了+,-,*,/,↑,(,)等七种运算符之间的相互优先关系。

“>、<、=”三种符号分别代表“大于”、“小于”、“相等”三种优先关系。

左边的“=”与右边的“(”之间没有优先关系存在,所以表中为空白。

逆波兰表达式生成算法的关键在于比较当前运算符与栈顶运算符的优先关系,若当前运算符的优先级高于栈顶运算符,则当前运算符入栈,若当前运算符的优先级低于栈顶运算符,则栈顶运算符退栈。

下面给出了逆波兰表达式生成算法的流程图。

(为了便于比较相邻运算符的优先级,需要设立一个工作栈,用来存放暂时不能处理的运算符,所以又称运算符栈)。

实验三、语法分析程序的设计(4学时)
语法分析阶段根据程序语言的语法规则,对词法分析产生的单词序列进行语法检查。

凡不合语法者,尽可能多和确切地指出错误(包括出错位置、原因和性质),否则,变换成各类语法范畴。

(1)内容:通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌
握常用的语法分析方法。

(4学时)
(2)要求:选择具有代表性的语法分析方法,如:LL(K)分析法、递归子程序法、运算符优先数法、LR(K)分析法等方法之一进行设计;选择对各种常见程序语言都通用的语法结构,如赋值语句(尤指表达式)作为分析对象,并与所选语法分析方法要比较贴切;先写出BNF定义,如:〈赋值语句〉::=〈变量〉=〈表达式〉
〈表达式〉::=〈项〉│〈表达式〉+〈项〉│〈表达式〉-〈项〉
〈项〉::=〈因子〉│〈项〉*〈因子〉│〈项〉/〈因子〉
〈因子〉::= 〈初等量〉│〈因子〉↑〈初等量〉
〈初等量〉::= (〈表达式〉)│i
然后编写语法分析程序;调试:调试例子应包括符合语法规则的算术表达式,以及分析程序能够判别的若干错例。

①LL(1)语法分析方法
LL(1)分析器的逻辑结构
输入串
分析栈
构造LL(1)分析表的算法如下:
1)对于A::=Dβ(D∈VN)且select(A::=Dβ)={b1,b2…bn}
则M[A,bi]=RE(Dβ)/R
表示:用Dβ的逆替换A,重读当前字符.
2)对于A::=aβ(a∈VT)
则M[A,a]= RE(β)/C
表示:用β的逆替换A,继续读入下一字符.
3)对于A::=ε且select(A::=ε)={b1,b2…bn}
则M[A,bi]=RE(ε)/R=ε/R
4)对所有没出现在规则右部的首部的终结符a,
令M[a,a]=RE(ε)/C=ε/C
5)对于#,令M[#,#]=succ,表示分析成功,结束.
6)其他情况属于出错,在分析表中用空白表示.
②递归下降语法分析法
是一种确定的自顶向下分析法。

又称递归子程序分析法。

思想:对文法中每个非终结符(代表语法成分)编写一个子程序(或递归过程),用来识别它所表示的语法范畴。

例:赋值语句S→V:=E
变量 V→i | i(E)
表达式 E→E+T | E-T | T
项 T→T*F | T/F | F
因子 F→F↑P | P
初等量 P→(E) | i
消除左递归:
S→V:=E
V→i | i (E)
E→T { ( + | - ) T }
T→F { ( * | / ) F }
F→P {↑P }
P→(E) | i
赋值语句处理流程图:
变量处理流程图
项处理流程图
初等量处理流程图:
③运算符优先数法
表达式文法G[E]的优先关系矩阵
④SLR(1)语法分析方法





图11 LR(K)分析器的逻辑结构
表达式文法的SLR(1)分析表
三、基本要求:
学生可以从以上三个实验中选做两个。

要求在实验课前仔细阅读实验相关内容,明确实验的目的和要求,然后了解词法分析和语法分析的基本方法,利用一种高级语言(如C语言、C++语言、PASCAL、JA V A语言等),编写无符号数的词法分析程序、逆波兰式生成程序、语法分析程序(选做一种语法分析方法)。

调试程序后,打印程序代码及实验结果,写出实验报告。

四、考核以学生的实验报告、实验内容、实验结果和实验态度为考核依据。

相关文档
最新文档