编译实验指导书

合集下载

编译程序实验指导书讲解教学提纲

编译程序实验指导书讲解教学提纲

编译程序实验指导书解讲.编译程序实验指导书实验目的:用C语言对一个C语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。

1.词法分析1.1 实验目的设计、编制并测试一个词法分析程序,加深对词法分析原理的理解。

1.2 实验要求1.2.1 待分析的C语言子集的词法1. 关键字main if else int char for while所有的关键字都是小写。

2.专用符号= + - * / < <= > >= == != ; : , { } [ ] ( )3.其他标记ID和NUM通过以下正规式定义其他标记:→letter(letter|digit)*ID→digit digit*NUMletter→a|…|z|A|…|Zdigit→0|…|9…4.空格由空白、制表符和换行符组成空格一般用来分隔ID、NUM、专用符号和关键字,词法分析阶段通常被忽略。

1.2.2 各种单词符号对应的种别码表1 各种单词符号的种别码单词符号种别码单词符号种别码单词符号种别码main 1 = 21 , 32int 2 + 22 : 33char 3 - 23 ; 34if 4 * 24 > 35else 5 / 25 < 36for 6 ( 26 >= 37while 7 ) 27 <= 38ID 10 [ 28 == 39MUN 20 ] 29 != 40{ 30 ‘\0' 1000} 31 ERROR -11.2.3 词法分析程序的功能输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。

其中,. syn为单词种别码。

. Token为存放的单词自身字符串。

. Sum为整型常量。

具体实现时,可以将单词的二元组用结构进行处理。

例如,对源程序main(){int i=10;while(i) i=i-1;}的源文件,经词法分析后输出如下序列:(1,main) (26,() (27,)) (30,{} (2,int) (10,i) (21,=) (20,10) (34,;) (7,while) (26,() (10,i) (27,)) (10,i) (21,=) (10,i) (23,-) (20,1) (34,;) (31,))1.3 词法分析程序的主要算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到的单词符号的第一个字符的种类,拼出相应的单词符号。

《编译技术》课程实验指导书

《编译技术》课程实验指导书

《编译技术》课程实验指导书实验一词法分析一.实验目的1、学会针对DFA转换图实现相应的高级语言源程序。

2、深刻领会状态转换图的含义,逐步理解有限自动机。

3、掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理。

二.实验内容TINY计算机语言的编译程序的词法分析部分实现。

从左到右扫描每行该语言源程序的符号,拼成单词,换成统一的内部表示(token)送给语法分析程序。

为了简化程序的编写,有具体的要求如下:(1)数仅仅是整数。

(2)空白符仅仅是空格、回车符、制表符。

(3)代码是自由格式。

(4)注释应放在花括号之内,并且不允许嵌套TINY语言的单词三.实验要求要求实现编译器的以下功能:(1)按规则拼单词,并转换成二元式形式(2)删除注释行(3)删除空白符 (空格、回车符、制表符)(4)显示源程序,在每行的前面加上行号,并且打印出每行包含的记号的二元形式(5)发现并定位错误。

词法分析进行具体的要求:(1)记号的二元式形式中种类采用枚举方法定义;其中保留字和特殊字符是每个都一个种类,标示符自己是一类,数字是一类;单词的属性就是表示的字符串值。

(2)词法分析的具体功能实现是一个函数GetToken(),每次调用都对剩余的字符串分析得到一个单词或记号识别其种类,收集该记号的符号串属性,当识别一个单词完毕,采用返回值的形式返回符号的种类,同时采用程序变量的形式提供当前识别出记号的属性值。

(3)标识符和保留字的词法构成相同,为了更好的实现,把语言的保留字建立一个表格存储,这样可以把保留字的识别放在标示符之后,用识别出的标示符对比该表格,如果存在该表格中则是保留字,否则是一般标识符。

实验二递归下降语法分析器设计一、实验目的(1)加深对递归下降分析法一种自顶向下的语法分析方法的理解。

(2)根据文法的产生式规则消除左递归,提取公共左因子构造出相应的递归下降分析器。

二、实验内容根据课堂讲授的形式化算法,编制程序实现递归下降分析器,能对常见的语句进行分析。

编译程序实验指导书讲解教学提纲

编译程序实验指导书讲解教学提纲

编译程序实验指导书讲解编译程序实验指导书实验目的:用C语言对一个C语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。

1.词法分析1.1 实验目的设计、编制并测试一个词法分析程序,加深对词法分析原理的理解。

1.2 实验要求1.2.1 待分析的C语言子集的词法1. 关键字main if else int char for while所有的关键字都是小写。

2.专用符号= + - * / < <= > >= == != ; : , { } [ ] ( ) 3.其他标记ID和NUM通过以下正规式定义其他标记:ID→letter(letter|digit)*NUM→digit digit*letter→a|…|z|A|…|Zdigit→0|…|9…4.空格由空白、制表符和换行符组成空格一般用来分隔ID、NUM、专用符号和关键字,词法分析阶段通常被忽略。

1.2.2 各种单词符号对应的种别码表1 各种单词符号的种别码单词符号种别码单词符号种别码单词符号种别码main 1 = 21 , 32int 2 + 22 : 33char 3 - 23 ; 34if 4 * 24 > 35else 5 / 25 < 36for 6 ( 26 >= 37while 7 ) 27 <= 38ID 10 [ 28 == 39MUN 20 ] 29 != 40 { 30 ‘\0’ 1000} 31 ERROR -11.2.3 词法分析程序的功能输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。

其中,. syn为单词种别码。

. Token为存放的单词自身字符串。

. Sum为整型常量。

具体实现时,可以将单词的二元组用结构进行处理。

例如,对源程序main(){int i=10;while(i) i=i-1;}的源文件,经词法分析后输出如下序列:(1,main) (26,() (27,)) (30,{} (2,int) (10,i) (21,=) (20,10) (34,;) (7,while) (26,() (10,i) (27,)) (10,i) (21,=) (10,i) (23,-) (20,1) (34,;) (31,))1.3 词法分析程序的主要算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到的单词符号的第一个字符的种类,拼出相应的单词符号。

编译技术--实验指导书

编译技术--实验指导书

《编译技术》实验指导书湘潭大学信息工程学院计算机工程系何春梅2015-09-01实验课时说明《编译技术》课总课时为32/8学时,其中实验课时为8学时,课时分配为:前三个实验是必做实验:其中DFA的模拟程序2学时、DFA的化简2学时、LL(1)文法判断程序4学时。

后面3个实验为学生根据自己安排选做实验。

目录实验1 DFA模拟程序 1 实验2 DFA化简 2 实验3 LL(1)文法判断程序 4 实验4 基于预测分析表法的语法分析程序(1) 5 实验5 基于预测分析表法的语法分析程序(2) 6 实验6 中间代码生成:逆波兰式的产生与计算8实验1 词法程序设计——DFA模拟程序一、实验目的通过实验教学,加深学生对所学的关于编译的理论知识的理解,增强学生对所学知识的综合应用能力,并通过实践达到对所学的知识进行验证。

通过对DFA模拟程序实验,使学生掌握词法分析的实现技术,及具体实现方法。

通过本实验加深对词法分析程序的功能及实现方法的理解。

二、实验环境供Windows系统的PC机,可用C++/C#/Java等编程工具编写三、实验内容1、定义一个右线性正规文法,示例如(仅供参考)G[S]:S→aU|bV U→bV|aQV→aU|bQ Q→aQ|bQ|e实验前要考虑清楚用哪种数据结构存储上述文法。

2、构造其有穷确定自动机,如3、利用有穷确定自动机M=(K,Σ,f, S,Z)行为模拟程序算法,来对于任意给定的串,若属于该语言时,该过程经有限次计算后就会停止并回答“是”,若不属于,要么能停止并回答“不是”。

K:=S;c:=getchar;while c<>eof do{K:=f(K,c);c:=getchar; };if K is in Z then return (‘yes’)else return (‘no’)四、实验方式与要求1、每位同学定义的语言或文法不同,上机编程实现2、实验报告格式要求书写要点:概要设计(总体设计思想);详细设计(程序主流程、自动机的存储格式、关键函数的流程图);结果分析(输入与输出结果、存在问题及有待改进善的地方、实验心得)。

编译方法实验指导书

编译方法实验指导书

(1) 实验一 源程序的输入和扫描 实验目的: 编制一个源程序的输入过程,从键盘、文件或文本框 输入若干行语句,依次存入输入缓冲区(字符型数据)。 实验要求:在进行本实验之前,应熟练课程内容,在上机之前做好 实验计划,编写好相应的代码 . 实验内容:编制一个扫描子程序,该子程序中每次调用能依次从存 放源程序的输入缓冲区中读出一个有效字符。 (2) 实验二 算符优先文法处理算术表达式与赋值语句 实验目的:算术表达式和赋值语句的文法是(学生可以根据需要适当 改变): S→i=E E→E+E|E-E|E*E|E/E|(E)|i 根据算符优先分析法,将赋值语句进行语法分析,翻译成等价的一组 基本操作,每一基本操作用四元式表示。 实验要求:阅读课本有关章节,花一周时间确定算术表达式的文法, 设计出算符优先关系表;考虑好设计方案;设计出模块结构、测试数 据,初步编制好程序。 实验内容:编制能够根据文法及算符优先矩阵生成四元式序列的程序
{ str_test[p_test]=str[i]; i++; if(str[i-1]=='+') /*handle ++ and +=*/ { if(str[i]=='='||str[i]=='+') { str_test[++p_test]=str[i]; str_test[++p_test]='\0'; output(str_test,findsymble(str_test)); for(p_test=0;p_test<=M;p_test++) str_test[p_test]=0; p_test=0; i++; continue; } } if(str[i-1]=='-') /*handle – and -=*/ { if((str[i]=='='||str[i]=='-')||(str[i]=='>')) { str_test[++p_test]=str[i]; str_test[++p_test]='\0'; output(str_test,findsymble(str_test)); for(p_test=0;p_test<=M;p_test++) str_test[p_test]=0; p_test=0; i=i+1; continue; } } if(str[i-1]=='=') /*handle ==*/ { if(str[i]=='=') { str_test[++p_test]=str[i]; str_test[++p_test]='\0'; output(str_test,findsymble(str_test)); p_test=0;p_test<=M;p_test++) str_test[p_test]=0; p_test=0; i=i+1; continue; } } if(str[i-1]=='<'||str[i-1]=='>') /*handle <= or >= or << or >> or <>*/ { if(str[i]=='='||str[i]=='<'||str[i]=='>') { str_test[++p_test]=str[i]; str_test[++p_test]='\0'; output(str_test,findsymble(str_test)); for(p_test=0;p_test<=M;p_test++) str_test[p_test]=0; p_test=0; i=i+1; continue; } }

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

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

编译原理实验指导书(李宏芒)《编译原理》实验指导书李宏芒编写适用专业:计算机科学与技术合肥工业大学计算机与信息学院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)文法的方法及对某一输入串的分析过程。

汇编语言编译实验指导

汇编语言编译实验指导

实验一源程序的输入和扫描学时数:2[实验内容]:1、编制一个源程序的输入、扫描程序,从文件中每次读入一行到输入缓冲区(可以用字符数组实现);然后从缓冲区中依次取出字符显示在屏幕上。

2、从文件每次读入一行到输入缓冲区的功能(可以用字符数组实现)用一个子程序实现。

[实验目的]:1、通过自己编制一个源程序的输入、扫描程序,熟悉并了解从文件中读入数据到输入缓冲区的过程。

[实验步骤]:1、准备:用TC、VC++等开发工具;确定被处理的语言的语法特点(可使用现成语言如Pascal、C等)。

编好程序,写好实验报告。

2、上机:输入源程序,修改、调试,运行。

[编程思想]:采用一个子程序实现的形式。

(1)程序判断源文件是否为NULL,如果是,则输出错误提示!如果不是,则进入循环。

(2)调用子程序readbuffer(),每次读入一个字符给字符变量,如果字符变量的内容不是回车符,则把字符变量的内容存入数组buffer(),然后读入下一字符,再判断再存入数组,直到一行全存入数组,然后返回主程序,用输出语句输出刚才存入数组的一行字符;(3)如果没有到文件尾,则重复第(2)步,直到文件结束,则退出主程序,完成任务![程序要求]:1)例如首先输入以下一段C语言的源程序,并以A.c的文件名保存到磁盘中,然后运行自己编制的输入、扫描程序,所得到的输出应与输入的源文件A.c中内容相同。

例如:输入的A.c文件内容:main(){int a,b ,c;a = 10; b=20;c=a+b;}自编源程序:输入、扫描程序源代码(仅供参考)://程序开始:# include<stdio.h># include<stdlib.h># include<conio.h>//声明头文件int i;FILE *fp;char buffer[256];//声明变量int readbuffer() //读字符子程序开始{int j=0;char ch;//声明变量while(j<256){ch=fgetc(fp);if (ch=='\n'){i=j; return 0;} //buffer[j]=ch; //保存字符++j; //记录字符个数}return 1;} //子程序结束main() //main()开始{if((fp=fopen("e:\\a.c","r"))==NULL){printf("THE FILE DOESN’T OPEN!");exit(0);}while(!feof(fp)){int j;j=0;readbuffer();while(j<i){printf("%c",buffer[j]);j++;}printf("\n");getch();}fclose(fp);getch();} //main()结束//程序结束2)改变源文件e:\\a.c内容为:main(){int sum=0,i;float k;scanf ("%f plese input (0-100) to total!",&k)for(i=0;i<k;i++)sum =sum+i;}运行自编的输入扫描程序,检查输出结果必须与上面输入的源文件中的代码相同。

编译技术实验指导书

编译技术实验指导书

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

实验指导书编译原理

实验指导书编译原理

编译原理实验教学指导书计算机科学与工程学院华南理工大学目录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的网站上下载。

编译技术课程设计大纲及指导书

编译技术课程设计大纲及指导书

《编译技术》课程设计大纲及指导书实验名称:根据给定的文法完成一个小型编译器。

实验目的:本课程设计实验项目的目标是通过实际构造一个完整的编译器,加深对编译器实现原理的理解,了解完整编译系统的构造方法。

实验类型:验证型、提高型实验学时:50学时实验描述:根据各难度的题目的说明,选择一个难度等级,将获得一份随机分配的该难度等级的文法。

根据获取的文法实现编译器:1.难度等级:低目标:完成编译器及解释执行程序,解释执行程序对编译器产生的PCODE能解释执行,产生运行结果文法:PL/0文法(与教材上的文法略有差别)优化:无中间代码:无目标码:PCODE最高分:652.难度等级:中目标:完成编译器及解释执行程序,解释执行程序对编译器产生的PCODE能解释执行,产生运行结果文法:扩充C0文法优化:无中间代码:无目标码:PCODE最高分:853.难度等级:高目标:实现编译器,生成X86汇编或MIPS汇编文法:扩充C0文法(无实型)优化:基本块内部的公共子表达式删除(DAG图);全局寄存器分配(引用计数或着色算法);数据流分析(通过活跃变量分析,或利用定义-使用链建网等方法建立冲突图);其它优化自选;代码生成时合理利用临时寄存器(临时寄存器池),并能生成较高质量的目标代码;中间代码:四元式目标码:32位X86汇编或MIPS汇编(任选一)最高分:100实验要求:1. 每人独立完成一份作业2. 采用递归子程序法进行语法分析,所有代码要求手工编程实现3. 可以有图形用户界面4. 完成一份文档,包括以下内容:1) 需求说明:包括文法及其分析说明、目标代码说明、优化方案说明(高)2) 详细设计:包括程序结构、类、方法/函数的功能描述和调用依赖关系、关键算法、符号表管理方案、存储分配方案、解释执行程序结构(低中)、解释执行过程(低中)、四元式设计(高)、优化算法设计(高)、出错处理方案3) 操作说明:包括程序安装、环境配置;程序启动后,编译、运行、结果显示等操作的说明4) 测试报告:包括至少10个测试程序的源程序及测试结果(无需截屏)(其中5个是有错误的文件,如有扩充,还需另外提供5个测试程序,扩充后的语言必须包含原来的语言)、测试结果分析5) 总结感想:完成本实验项目后的感想及建议5. 用C/C++语言实现6. 开发环境Visual Studio或CodeBlocks7. 提交完整的项目/工程文件,在集成开发环境下可编译运行8. 目录命名及组织阶段成果以”学号_姓名_任务说明”命名提交的文档;最终成果组织为如下三个文件夹:源代码文档测试程序提交时打包为一个zip文件,按如下规则命名:学号_姓名[_MIPS][_申优].zip(如12061001_×××_申优.zip ,12061001_×××.zip,12061001_×××_MIPS_申优.zip)考核:1. 检查文档内容是否齐全、正确。

《编译原理》科学实验指导说明书

《编译原理》科学实验指导说明书

《编译原理》实验指导书实验一词法分析器的设计一、实验目的和要求加深对状态转换图的实现及词法分析器的理解。

熟悉词法分析器的主要算法及实现过程。

要求学生掌握词法分析器的设计过程,并实现词法分析。

二、实验基本内容给出一个简单语言的词法规则,画出状态转换图,并依据状态转换图编制出词法分析程序,能从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。

并依次输出各个单Error”,然后跳过错误部分继续显示)词法规则如下:三、实验时间:上机三次。

第一次按照自己的思路设计一个程序。

第二、三次在理论课学习后修改程序,使得程序结构更加合理。

四、实验过程和指导:(一)准备:1.阅读课本有关章节(c/c++,数据结构),花一周时间明确语言的语法,写出基本算法以及采用的数据结构和要测试的程序例。

2.初步编制好程序。

3.准备好多组测试数据。

(二)上课上机:将源代码拷贝到机上调试,发现错误,再修改完善。

(三)程序要求:程序输入/输出示例:输入如下一段:main(){/*一个简单的c++程序*/int a,b; //定义变量a = 10;b = a + 20;}要求输出如右图。

要求:(1) 剔除注解符(2) 常数为无符号整数(可增加实型数,字符型数等)(四)练习该实验的目的和思路:程序开始变得复杂起来,可能是大家以前编过的程序中最复杂的,但相对于以后的程序来说还是简单的。

因此要认真把握这个过渡期的练习。

程序规模大概为200行及以上。

通过练习,掌握对字符进行灵活处理的方法。

(五)为了能设计好程序,注意以下事情:1.模块设计:将程序分成合理的多个模块(函数/类),每个模块(类)做具体的同一事情。

2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。

3.编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。

4.程序设计语言不限,建议使用面向对象技术及可视化编程语言,如C++,VC,JA V A,VJ++等。

《编译原理实验》实验指导书

《编译原理实验》实验指导书

广州大学实验课程建设项目《编译原理实验》实验指导书广州大学信息与机电工程学院计算机系2006年10月目录实验1 Pascal 语言的编译器的使用 3 实验2 词法分析(一) 13 (调试一个词法分析程序)实验3 词法分析(二) 16 (设计、编制并调试一个词法分析程序)实验4 语法分析(一) 19 (调试一个语法分析程序,了解编译程序中LR分析表的作用)实验5 语法分析(二) 22(设计、编制并调试一个语法分析程序)实验6 语义分析 24实验7 编译原理综合实验 26 实验报告示例:词法分析程序 47考试考核方式 53实验一:Pascal 语言的编译器的使用实验目的:调试一个Pascal 语言的编译器,加深对语言编译器的理解实验内容:此程序为Pascal 语言的编译器,支持Proc ,Repeat,If,While,For,Fun函数结构代码的编译,能生成变量表、常量表和汇编程序。

界面如下:图1 Pascal 语言的编译器的使用界面下面给出软件所能编译的代码和编译出的结果。

―――――――――――――――――――――――――――――――――――Proc函数结构代码:vara, b, i: integer;procedure p1(arg1: integer; arg2: integer);begina := arg1 * arg2;end;beginb := 123;p1(3, b);――――――――――――――――――――――――――――――――――-编译状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = unsigned[静], OffPos = 0[2]b = unsigned[静], OffPos = 0[3]i = unsigned[静], OffPos = 0[4]arg1 = unsigned[参], OffPos = 0[5]arg2 = unsigned[参], OffPos = 1常量[0]Number = 123[静], OffPos = 0[1]Number = 3[静], OffPos = 0方法ID = 1, Name = p1, MethodType = 过程, ParamList = (4, 5), DynaV arList = (), Addr = 2 ++++++++++++++++++++++++++++++++++++运行状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = 369[静], OffPos = 0[2]b = 123[静], OffPos = 0[3]i = unsigned[静], OffPos = 0[4]arg1 = unsigned[参], OffPos = 0[5]arg2 = unsigned[参], OffPos = 1汇编语句:0:Goto 0, 71:Return 0, 02:Mov 0, 43:Mov 0, 54:Mul 0, 05:Sto 1, 16:Return 0, 07:LoadConst 0, 08:Sto 0, 29:LoadConst 0, 110:Mov 0, 211:Call 0, 1 ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――For结构代码:vara, b, i: integer;a := 0;for i := 0 to 100 dobegina := a + i;end;end;――――――――――――――――――――――――――――――――――-编译状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = unsigned[静], OffPos = 0[2]b = unsigned[静], OffPos = 0[3]i = unsigned[静], OffPos = 0常量[0]Number = 0[静], OffPos = 0[1]Number = 0[静], OffPos = 0[2]Number = 100[静], OffPos = 0方法ID = 0, Name = ShowMessage, MethodType = 过程, ParamList = (0), DynaV arList = (), Addr = 1++++++++++++++++++++++++++++++++++++运行状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = 5050[静], OffPos = 0[2]b = unsigned[静], OffPos = 0[3]i = 101[静], OffPos = 0汇编语句:0:Goto 0, 21:Return 0, 02:LoadConst 0, 03:Sto 0, 14:LoadConst 0, 15:Sto 0, 36:LoadConst 0, 27:Mov 0, 38:>=? 0, 09:IfFalseGoto 0, 1810:Mov 0, 111:Mov 0, 312:Add 0, 013:Sto 0, 114:Mov 0, 315:IncV ar 0, 116:Sto 0, 317:Goto 0, 6 ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――While函数结构代码:vara, i: integer;begini := 0;a := 0;while i <= 100 dobegina := a +i;i := i +1;end;end;――――――――――――――――――――――――――――――――――-编译状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = unsigned[静], OffPos = 0[2]i = unsigned[静], OffPos = 0常量[0]Number = 0[静], OffPos = 0[1]Number = 0[静], OffPos = 0[2]Number = 100[静], OffPos = 0[3]Number = 1[静], OffPos = 0方法ID = 0, Name = ShowMessage, MethodType = 过程, ParamList = (0), DynaV arList = (), Addr = 1++++++++++++++++++++++++++++++++++++运行状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = 5050[静], OffPos = 0[2]i = 101[静], OffPos = 0汇编语句:0:Goto 0, 21:Return 0, 02:LoadConst 0, 03:Sto 0, 24:LoadConst 0, 15:Sto 0, 16:Mov 0, 27:LoadConst 0, 28:<=? 0, 09:IfFalseGoto 0, 1910:Mov 0, 111:Mov 0, 212:Add 0, 013:Sto 0, 114:Mov 0, 215:LoadConst 0, 316:Add 0, 017:Sto 0, 218:Goto 0, 6 ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――Repeat函数结构代码:vara, i: integer;begina := 0;i := 0;repeata := a + i;i := i + 1;until i > 100;end; ――――――――――――――――――――――――――――――――――-编译状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = unsigned[静], OffPos = 0[2]i = unsigned[静], OffPos = 0常量[0]Number = 0[静], OffPos = 0[1]Number = 0[静], OffPos = 0[2]Number = 1[静], OffPos = 0[3]Number = 100[静], OffPos = 0方法ID = 0, Name = ShowMessage, MethodType = 过程, ParamList = (0), DynaV arList = (), Addr = 1++++++++++++++++++++++++++++++++++++运行状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = 5050[静], OffPos = 0[2]i = 101[静], OffPos = 0汇编语句:0:Goto 0, 21:Return 0, 02:LoadConst 0, 03:Sto 0, 14:LoadConst 0, 15:Sto 0, 26:Mov 0, 17:Mov 0, 28:Add 0, 09:Sto 0, 110:Mov 0, 211:LoadConst 0, 212:Add 0, 013:Sto 0, 214:Mov 0, 215:LoadConst 0, 316:>? 0, 017:IfFalseGoto 0, 6 ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――Fun函数结构代码:vara, i: integer;function fun1(arg1, arg2: integer): integer;beginResult := arg1 + arg2;end;begina := 0;for i := 1 to 100 dobegina := fun1(a, i);end;end;――――――――――――――――――――――――――――――――――-编译状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = unsigned[静], OffPos = 0[2]i = unsigned[静], OffPos = 0[3]arg1 = unsigned[参], OffPos = 0[4]arg2 = unsigned[参], OffPos = 1[5]Result = unsigned[动], OffPos = 2常量[0]Number = 0[静], OffPos = 0[1]Number = 1[静], OffPos = 0[2]Number = 100[静], OffPos = 0方法ID = 1, Name = fun1, MethodType = 函数, ParamList = (3, 4), DynaV arList = (5), Addr = 2 ++++++++++++++++++++++++++++++++++++运行状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = 5050[静], OffPos = 0[2]i = 101[静], OffPos = 0[3]arg1 = unsigned[参], OffPos = 0[4]arg2 = unsigned[参], OffPos = 1[5]Result = unsigned[动], OffPos = 2汇编语句:0:Goto 0, 71:Return 0, 02:Mov 0, 33:Mov 0, 44:Add 0, 05:Sto 0, 56:Return 0, 07:LoadConst 0, 08:Sto 0, 19:LoadConst 0, 110:Sto 0, 211:LoadConst 0, 212:Mov 0, 213:>=? 0, 014:IfFalseGoto 0, 2315:Mov 0, 116:Mov 0, 217:Call 0, 118:Sto 0, 119:Mov 0, 220:IncV ar 0, 121:Sto 0, 222:Goto 0, 11 ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――If 结构代码:vara, i: integer;begina := 2;if a = 1 thenbegini := 10;endelse begini := 100;end;end;――――――――――――――――――――――――――――――――――-编译状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = unsigned[静], OffPos = 0[2]i = unsigned[静], OffPos = 0常量[0]Number = 2[静], OffPos = 0[1]Number = 1[静], OffPos = 0[2]Number = 10[静], OffPos = 0[3]Number = 100[静], OffPos = 0方法ID = 0, Name = ShowMessage, MethodType = 过程, ParamList = (0), DynaV arList = (), Addr = 1 ++++++++++++++++++++++++++++++++++++运行状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = 2[静], OffPos = 0[2]i = 100[静], OffPos = 0汇编语句:0:Goto 0, 21:Return 0, 02:LoadConst 0, 03:Sto 0, 14:Mov 0, 15:LoadConst 0, 16:=? 0, 07:IfFalseGoto 0, 118:LoadConst 0, 29:Sto 0, 210:Goto 0, 1311:LoadConst 0, 312:Sto 0, 2 ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――递归结构代码:vara, b: integer;function f1(arg: integer): integer;beginif arg <= 1 thenbeginResult := 1;endelse beginResult := arg * f1(arg - 1);end;end;begina := 10;b := f1(a);ShowMessage(b);end; ――――――――――――――――――――――――――――――――――-编译状态下:变量[0]str = unsigned[参], OffPos = 0[1]a = unsigned[静], OffPos = 0[2]b = unsigned[静], OffPos = 0[3]arg = unsigned[参], OffPos = 0[4]Result = unsigned[动], OffPos = 1常量[0]Number = 1[静], OffPos = 0[1]Number = 1[静], OffPos = 0[2]Number = 1[静], OffPos = 0[3]Number = 10[静], OffPos = 0方法ID = 1, Name = f1, MethodType = 函数, ParamList = (3), DynaV arList = (4), Addr = 2 ++++++++++++++++++++++++++++++++++++运行状态下:变量:无汇编语句:Goto 0, 171:Return 0, 02:Mov 0, 33:LoadConst 0, 04:<=? 0, 05:IfFalseGoto 0, 96:LoadConst 0, 17:Sto 0, 48:Goto 0, 169:Mov 0, 310:Mov 0, 311:LoadConst 0, 212:Sub 0, 013:Call 0, 114:Mul 0, 015:Sto 0, 416:Return 0, 017:LoadConst 0, 318:Sto 0, 119:Mov 0, 120:Call 0, 121:Sto 0, 222:Mov 0, 223:Call 0, 0 ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――实验二:词法分析(一)实验目的:调试一个词法分析程序,加深对词法分析原理的理解实验内容:(1)设一小型编译程序关于高级语言有如下的规定:高级语言程序具有四种基本结构:顺序结构﹑选择结构﹑循环结构和过程。

编译实验指导

编译实验指导

编译原理课程设计目录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课程设计的基本要求和方法一、目的进一步培养学生编译器设计的思想,加深对编译原理和应用程序的理解,针对编译过程的重点和难点内容进行编程,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。

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

《编译技术》上机实验指导书
实验1:词法分析程序的实现
实验目的:通过完成词法分析程序,了解词法分析的过程,加深对词法分析原理的理解。

实验内容:用C语言或其他高级语言实现对C语言子语言的词法分析程序,将源程序翻译成TOKEN字序列。

实验步骤:1、定义PASCAL语言子集及TOKEN字结构。

2、设计程序结构、算法、和主要数据结构。

3、编码实现。

4、程序调试和实例测试。

5、撰写实验报告。


实验2:LL(1)语法分析程序的实现
实验目的:通过完成程序,了解LL(1)语法分析的过程,加深对语法分析原理的理解。

实验内容:1、针对输入的LL(1)文法及其各产生式预选集,编写程序完成构造LL(1)分析表的功能。

2、设计LL(1)语法分析总控程序,对给定的终级符串进行语法
分析。

实验步骤:1、设计主要数据结构(产生式、预选集、LL(1)分析表、语法分析栈及待分析符号串)。

2、设计程序结构、算法。

3、编码实现。

4、程序调试和实例测试。

5、撰写实验报告。

清明时节雨纷纷,路上行人欲断魂。

借问酒家何处有,牧童遥指兴华春。

相关文档
最新文档