编译实验指导书

合集下载

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

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

编译程序实验指导书解讲.编译程序实验指导书实验目的:用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 词法分析程序的主要算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到的单词符号的第一个字符的种类,拼出相应的单词符号。

编译原理实验指导书

编译原理实验指导书

2010-2011学年第一学期《操作系统原理》实验指导书授课教师:屠菁计算机科学与技术系2010年9月目录《操作系统原理》实验教学大纲(修订)............................................... 错误!未定义书签。

实验考核方式与基本要求........................................................................... 错误!未定义书签。

实验一进程控制描述与控制..................................................................... 错误!未定义书签。

实验二并发与调度..................................................................................... 错误!未定义书签。

实验三存储管理. (31)实验四设备管理......................................................................................... 错误!未定义书签。

实验五文件管理与系统安全..................................................................... 错误!未定义书签。

附录实验报告参考规范............................................................................. 错误!未定义书签。

《操作系统管理》实验指导书1《操作系统原理》实验教学大纲(修订)课程编号:课程名称:操作系统原理实验学时:14一、本实验课的性质、任务与目的操作系统作为计算机专业的一门专业基础课,是计算机专业的核心课程之一,学好与否直接关系到学生是否能更好地学习后续课程。

编译技术--实验指导书

编译技术--实验指导书

《编译技术》实验指导书湘潭大学信息工程学院计算机工程系何春梅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、实验报告格式要求书写要点:概要设计(总体设计思想);详细设计(程序主流程、自动机的存储格式、关键函数的流程图);结果分析(输入与输出结果、存在问题及有待改进善的地方、实验心得)。

编译原理实验指导书

编译原理实验指导书

编译原理实验指导书《编译原理》实验指导书太原科技大学计算机学院 -3-1序《编译原理》是国内外各高等院校计算机科学技术类专业,特别是计算机软件专业的一门重要专业课程。

该课程系统地向学生介绍编译程序的结构、工作流程及编译程序各组成部分的设计原理和实现技术。

由于该课程理论性和实践性都比较强,内容较为抽象复杂,涉及到大量的软件设计和算法,因此,一直是一门比较难学的课程。

为了使学生更好地理解和掌握编译原理和技术的基本概念、基本原理和实现方法,实践环节非常重要,只有经过上机进行程序设计,才能使学生对比较抽象的教学内容产生具体的感性认识,增强学生综合分析问题、解决问题的能力,并对提高学生软件设计水平大有益处。

为了配合《编译原理》课程的教学,考虑到本课程的内容和特点,本指导书设置了七个综合性实验,分别侧重于词法分析、NFA的确定化、非递归预测分析、算符优先分析器的构造、LR分析、语义分析和中间代码的生成、基于DAG的基本块优化,以支持编译程序的各个阶段,基本涵盖了《编译原理》课程的主要内容。

本指导书可作为《编译原理》课程的实验或课程设计内容,在课程教学的同时,安排学生进行相关的实验。

实验平台可选择在MS-DOS或Windows操作系统环境,使用C/C++的任何版本作为开发工具。

学生在做完试验后,应认真撰写实验报告,内容应包括实验名称、实验目的、实验要求、实验内容、测试或运行结果等。

目录实验一词法分析 ........................................................... 错误!未定义书签。

实验二 NFA的确定化.................................................... 错误!未定义书签。

实验三非递归预测分析 ............................................... 错误!未定义书签。

编译原理实验指导书

编译原理实验指导书

编译原理实验指导书计算机学院实验1 词法分析程序一、实验目的构造simple语言的词法分析程序,程序要求能对输入的字符串流进行词法分析。

在实验的过程中,学会应用单词分析的方法——NFA(非确定有穷自动机)和DFA(确定有穷自动机),加深对词法分析原理的理解。

二、实验内容编写为任一正则文法(见实验参考(一)simple惯用的词法)构造非确定有穷自动机NFA并转换成确定有穷自动机DFA,并对任给的一个输入串(见实验参考(二)测试用输入串)进行词法分析的程序,程序的输出为单词的序列(见实验参考(三)程序输出形式)。

三、实验参考(一)simple 惯用的词法1. 下面是语言的关键字:Begin if then while do end所有的关键字都是保留字,并且必须是小写。

2. 下面是专用符号::= + * / < <= <> > >= = ; ( ) #3. 其他单词是标识符(ID)和整型常数(NUM),通过下列正规式定义:ID = letter(letter| digit)*NUM = digit digit*letter = a |…| z | A |…| Zdigit = 0 |…| 9小写和大写字母是有区别的。

思考:构造实数的正规表达式,力争实现对实数的识别及表示。

4. 空格由空白、换行符和制表符组成。

空格一般用来分隔ID、NUM、运算符和关键字,词法分析阶段通常被忽略。

5. 各种单词符号对应的种别码如下表所示:(二)词法分析程序的功能1. 输入为所给文法的源程序字符串。

2. 程序的输出形式为单词串的输出形式。

所输出的每一单词,均按形如(syn,token和sum)的二元式编码。

其中,syn 为单词种别码;token为存放的单词自身字符串;sum为整型常数。

3.测试源程序片断:begin x:=9; if x>0 then x:=2*x+1/3;end #。

《编译原理》实验指导书(吴元斌)

《编译原理》实验指导书(吴元斌)

《编译原理》实验指导书“编译原理”课程是计算机本科专业的必选课程,上机实验是该课程的重要环节,实验学时数为8学时。

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

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

实验一、词法分析(2学时)一、实验目的熟悉正规文法、正规式和有穷自动机,了解词法分析的主要任务,掌握词法分析是如何根据正规文法规则逐一分析词法得到属性字的,即掌握了词法分析过程。

二、实验内容编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。

并依次输出各个单词的内部编码及单词符号自身值。

(遇到错误时可显示“Error”,然后跳过错误部分继续显示)。

三、实验原理词法分析是编译过程的第一步,要想做好该实验,必须熟悉正规文法、正规式和有穷自动机的概念和原理,实验前须先定义语言的正规文法或正规式,构造确定的有穷自动机,然后根椐有穷自动机设计程序模块,源程序的输入。

1四、实验步骤(一)准备:1.阅读课本有关章节,花二天时间明确语言的语法,写出基本保留字、标识符、常数、运算符、分隔符和程序例。

编译方法实验指导书

编译方法实验指导书

少年易学老难成,一寸光阴不可轻- 百度文库目录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)文法的方法及对某一输入串的分析过程。

编译原理compiler-实验-指导书

编译原理compiler-实验-指导书

编译原理compiler-实验-指导书编译原理实验指导书课程名称 : 编译原理英文名称 : Compiler Principle 课程性质 : 必修编写人: 编译原理课程组2013年9月1日计算机学院1. 阅读说明基础实验?、选做实验?、实验中的附加内容★未加标注的实验为参考实验2. 实验要求从以下方案中选一方案A (成绩上限:120%)-完成1个基础实验?: 90%-完成选做实验?或实验中的附加内容★: 30%方案B (成绩上限:150%)-完成综合实验3.1: 150%3. 成绩评定成绩评定依据原创性、工作量(自己编写的代码部分才能得分,参考的部分不得分)代码质量、丰富的测试用例、功能和实现上的独立思考与创新实验验收顺序、主动性评分标准源码、验收、答辩(90%)实验报告、作品及文档提交(10%)4. 验收流程必须携带打印版实验报告进行验收,验收顺序依据实验报告提交的顺序验收分―申优验收‖和―抽查‖两种形式,参加―申优验收‖才能获得B(百分制85%)以上的成绩。

必须当面验收的实验 - 选做内容、选做实验、综合实验5. 设计文档要求设计文档参照模板书写。

所有实验必须提交设计文档的打印版本(A4)6. 作品提交要求参加―申优验收‖的同学需提交作品的电子文档及源码,否则,只需提交打印版实验报告。

将作品打包成 .rar文件发送至指定电子邮箱邮箱地址: ytuCompiler@/doc/d506f661102de2bd960588 c4.html请大家参考以下目录命名与结构提交实验所有文档及源码COMPILER_班级_学号_姓名_本次实验名称(根目录)├ bin 存放可执行程序├ config 存放各种配置文件├ lib 存放类库文件├ doc 存放设计文档及readme.txt├ src 存放源程序及项目工程文件├ test 存放测试程序├ references存放参考文档、代码、其他资源根目录命名举例:COMPILER_0813_200825501101_张三_实验1.1若发现程序或文档雷同,按作弊处理完全雷同,取消参加期末考试资格,本学期理课程总评成绩为0分。

西南大学编译原理实验指导书

西南大学编译原理实验指导书

西南大学编译原理实验指导书
实验目的和内容
编译原理实验的目的是使学生将编译理论运用到实际当中,实现一个简单语言集的词法、语法和语义分析程序,验证实际编译系统的实现方法,并加深对编译技术的认识。

实验内容共需实现编译器的词法、语法和语义分析程序三个组成部分。

要求学生必须完成每个实验的基本要求,并可尝试实验的扩展要求部分。

实验报告
要求每人针对每个实验上交一份实验报告,其中主要包括三方面内容:
1、实验设计:实验采用的实现方法,如描述语言的文法,单词分类码表,状态转换图或状态矩阵等。

具体的设计结果,应包括程序结构的描述,各部分主要功能的说明,以及所用数据结构的介绍等。

2、程序代码:实验实现的源程序,要求符合一般的程序书写风格,并包括必要的注释。

3、实验结果分析:程序的输入及输出,运行结果分析(至少包括一个正确和一个错误单词或语句的分析结果),改进设想等。

编译技术实验指导书

编译技术实验指导书

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

《编译原理》实验指导书

《编译原理》实验指导书

编译原理实验报告班级:计134班姓名:***学号:******实验一词法分析程序设计与实现一、实验目的通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符流形式的源程序转化为一个由各类单词序列的词法分析方法。

二、基本实验内容与要求假定一种高级程序设计语言中的单词主要包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符,试构造能识别这些单词的词法分析程序(各类单词的分类码可参见表1)。

输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件。

输出:把所识别出的每一单词均按形如(CLASS,V ALUE)的二元式形式输出,并将结果放到某个文件中。

对于标识符和无符号常数,CLASS字段为相应的类别码的助记符;V ALUE字段则是该标识符、常数的具体值;对于关键字和运算符,采用一词一类的编码形式,仅需在二元式的CLASS字段上放置相应单词的类别码的助记符,V ALUE字段则为“空”。

表1 语言中的各类单词符号及其分类码表要求:1、上机前完成词法分析程序的程序流图,并选择好相应的数据结构。

2、用于测试扫描器的实例源文件中至少应包含两行以上的源代码。

3、对于输入的测试用例的源程序文件,词法正确的单词分析结果在输出文件中以二元式形式输出,错误的字符串给出错误提示信息。

例如,若输入文件中的内容为:“if myid>=1.5E−2+100 then x:=y”,则输出文件中的内容应为:(IF,)(ID,’myid’)(GE,)(UCON,0.015)(PL,)(UCON,100)(THEN,)(ID,’x’)(IS,)(ID,’y’)三、实现方法1、一般实现方法说明词法分析是编译程序的第一个处理阶段,可以通过两种途径来构造词法分析程序。

其一是根据对语言中各类单词的某种描述或定义(如BNF),用手工的方式(例如可用C语言)构造词法分析程序。

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

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

编译程序实验指导书讲解编译程序实验指导书实验目的:用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 词法分析程序的主要算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到的单词符号的第一个字符的种类,拼出相应的单词符号。

编译技术上机实验指导书

编译技术上机实验指导书

《编译技术》上机实验指导书实验一一、题目编制C语言子集的词法分析程序二、目的通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

三、要求1.根据具体情况,由同学们自己选取C语言的一个适当大小的子集(可取一类典型单词,也可以尽可能使各种类型的单词都兼顾到),如课本表2.1;在上机前一定要制出相应的表。

2.程序功能输入:字符串。

输出:二元式(种别编码,单词自身)构成的序列。

举例:输入:a=$;#输出:(6,a)(12,=)FOUND ERROR(13,;)2.实验时间:2-4学时。

3.检查时间:第13周抽查。

四、步骤1.定义单词表2.完善词法分析器程序(1)定义变量、函数(2)增加程序的输入、输出3.程序验证实验二一、题目编制递归下降法的语法分析程序二、目的通过设计、编制、调试一个典型的语法分析程序,能识别由加+、乘*、括号()、操作数所组成的算术表达式,其文法如下:E→TE'E'→+TE'∣εT→FT'T'→*FT'∣εF→(E)∣i三、要求1.程序功能(举例)输入:# i1*( i2+i3)#输出:SUCCESS输入:# i1*( i2+i3#输出:FOUND ERROR2.实验时间:4-6学时。

3.检查时间:第15周抽查。

四、步骤1.定义递归子程序2.增加主控程序(1)调用E()(2)输入、输出3.程序验证。

实验指导书编译原理

实验指导书编译原理

编译原理实验教学指导书计算机科学与工程学院华南理工大学目录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所有的关键字是程序设计语言保留使用的,并且用小写字母表示,用户自己定义的标识符不能和关键字重复。

编译实验指导书-2012.9.18

编译实验指导书-2012.9.18

编译原理实验指导书实验一词法分析一、实验目的通过实现PL/0语言(一种示例小语言)的词法分析器,理解词法分析过程,掌握程序各部分之间的接口安排。

二、实验要求1、要求每位同学单独完成词法分析器,并接受检查;2、撰写实验报告。

(1) 用有限自动机画出“三、实验内容”中的词法规则;(2) 实验报告不要摘抄全部代码,但需要流程图的形式描述程序结构;(3) 必须书写设计和实现的过程中出现的一些问题以及解决方法。

三、实验内容1、PL/0语言的单词结构关键字(10个):begin, end ,if ,then, while, do, const, var,call,procedure标识符:字母序列,最大长度10常数:整型常数算符和界符(17个):+,-,*,/,odd,=,<>,<,>,<=,>=,:=,(,) ,, ,.,;2、单词的种别SYM_IDENTIFIER, 标识符SYM_NUMBER, 常数SYM_PLUS, +SYM_MINUS, -SYM_TIMES, *SYM_SLASH, /SYM_ODD, oddSYM_EQU, =SYM_NEQ, <>SYM_LES, <SYM_LEQ, <=SYM_GTR, >SYM_GEQ, >=SYM_LPAREN, (SYM_RPAREN, )SYM_COMMA, ,SYM_SEMICOLON, ;SYM_PERIOD, .SYM_BECOMES, :=SYM_BEGIN, beginSYM_END, endSYM_IF, ifSYM_THEN, thenSYM_WHILE, whileSYM_DO, doSYM_CONST, constSYM_V AR, varSYM_CALL,callSYM_PROCEDURE procedure3、PL/0的语言的词法分析器将要完成以下工作:(1)跳过分隔符(如空格,回车,制表符);(2)识别诸如begin,end,if,while等保留字;(3)识别非保留字的一般标识符,此标识符值(字符序列)赋给全局量id,而全局量sym赋值为SYM_IDENTIFIER。

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

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

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

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

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

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

并依次输出各个单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++等。

福建工程学院《编译原理实验指导》

福建工程学院《编译原理实验指导》

编译原理实验指导书指导老师:职称:目录编译原理课程实验指导 (1)实验一源程序预处理 (2)实验二简单程序设计语言的词法分析器 (6)实验三递归下降分析法 (9)实验四预测分析法 (9)实验五LR语法分析 (13)编译原理课程实验指导一、课程实验方案1 实验教学目标与基本要求(1)通过实习具有开发基本的词法分析和语法分析算法的能力。

(2)了解词法分析和语法分析的工作原理和特点(3)掌握课本所介绍的编译算法的原理和实现2 实验环境介绍实验主要以程序设计实现各种教学课堂中讲过的图形算法为主。

程序设计设计语言主要以Visual C++语言为实验平台。

3 课程实验内容实验一源程序预处理实验学时:2学时实验目的:熟悉源程序预处理的任务和要求。

实现源程序输入串中注释、续行符的删除,换行符和Tab的替换,大小写字母变换,得到预处理后的文本串,为单词识别做好准备。

实验内容:1.删除注释2.删除续行符以及后续换行符3.将换行符和TAB统一替换为空格4.将大写字母变换为小写字母,或者相反,以实现不区分大小写5.识别标号区,识别续行标志。

实验步骤:(1)熟悉教材关于词法分析中预处理的原理。

(2)依照教材关于源程序预处理的算法,使用C/C++语言或其它语言实现该算法。

(3)调试、编译、运行程序。

实验要求:在下次实验时提交本次实验的实验报告(实验报告包括实验目的、实验内容、实验实现过程、源程序、实验结果、实验体会)。

实现代码:#include<fstream.h>#include<iostream.h># include<conio.h>void pro_process(char *);void main( ){//定义扫描缓冲区char buf[4048]={'\0'}; //缓冲区清0//调用预处理程序pro_process(buf);//在屏幕上显示扫描缓冲区的内容cout<<buf<<endl;}void pro_process(char *buf){ifstream cinf("source.txt",ios::in);int i=0; //计数器char old_c='\0',cur_c; //前一个字符,当前字符bool in_comment=false; //false表示当前字符未处于注释中while(cinf.read(&cur_c,sizeof(char))) //从文件读一个字符{switch(in_comment){case false:if(old_c=='/' && cur_c=='*') //进入注释{ i--; //去除已存入扫描缓冲区的字符’/’in_comment=true;}else {if(old_c=='\\' && cur_c=='\n') //发现续行i--; //去除已存入扫描缓冲区的字符’\’else {if(cur_c>='A' && cur_c<='Z') //大写变小写cur_c+=32;if(cur_c=='\t' || cur_c=='\n') //空格取代tab换行cur_c+=' ';buf[i++]=cur_c;}}break;case true:if(old_c=='*' && cur_c=='/') //离开注释in_comment=false;}//end of switchold_c=cur_c; //保留前一个字符}//end of whilebuf[i++]='#'; //在源程序词尾加字符# }实验二简单程序设计语言的词法分析器实验学时:2学时实验目的:掌握词法分析器的原理将源程序预处理、状态图转换等结合,建立简单的程序设计语言词法分析器实验内容:要求能对简单程序设计语言进行词法分析,具体内容如下:字符集{…a‟..‟z‟, …0‟..‟9‟,‟+‟,‟=‟,‟*‟,‟,‟,‟;‟,‟(…,‟)‟,‟#‟}若发现字符集之外的字符,即为非法字符,当出现非法字符时终止词法分析器的运行。

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

《编译原理》实验指导书上机实习一:词法分析目的与要求:通过编写并上机调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将其分解后各类单词的词法分析方法。

实验内容:输入:据教学要求和学生具体情况,从具有代表性的高级程序设计语言中,选取一个适当大小的子集,例如可以选取一类典型单词,也可以尽可能使各种类型的单词都能兼顾到。

输出:单词串的输出形式,所输出的每一单词均按形如(CLASS,V ALUE)的二元式编码。

对于变量和常数,CLASS字段为相应的类别码,V ALUE字段则是该标识符、常数的具体值或在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串;常数表登记项中则存放该常数的二进制形式)。

对于关键字和分隔符,采用一词一类的编码形式。

由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,V ALUE字段则为“空”。

不过,为便于查看由词法分析程序所输出的单词串,要求在CLASS字段上直接放置单词符号串本身。

示例:词法分析是编译程序的第一个处理阶段,可以通过两种途径来构造词法分析程序。

其一是根据对语言中各类单词的某种描述或定义(如BNF),用手工的方式构造词法分析程序。

例如,可根据文法或状态转换图构造相应的状态矩阵,该状态矩阵同控制程序便组成了编译程序的词法分析程序;也可以根据文法或状态转换图利用某种语言(汇编语言或高级语言)直接编写词法分析程序。

构造词法分析程序的另外一种途径是所谓的词法分析程序的自动生成,即首先用正规式对语言中的各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程序所应进行的语义处理工作,然后由一个所谓词法分析程序的构造程序对上述信息进行加工。

如美国BELL实验室研制的LEX就是一个被广泛使用的词法分析程序的自动生成工具。

(1)题目:试用手工方式构造具有以下单词的某一语言的词法分析程序。

1 BEGIN2 END3 IF4 THEN5 ELSE6 <7 <=8 =9 <> 10 > 11 >= 12 标识符13 无符号常数其中标识符和无符号数的BNF定义如下:(2)处理过程:在扫描源程序字符串时,一旦识别出关键字、分隔符、标识符、无符号常数中之一,即以单词形式(各类单词均采用相同的结构,即二元式编码形式)输出。

每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。

具体方法如下:(一)单词的分类:构造上述语言中的各类单词符号及其分类码表如下:表Ⅰ语言中的单词符号及其分类码表(二)构造状态转换图(以无符号常数为例):由描述无符号常数的正规文法构造状态转换图如下:其中:非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>分别用编号0,1,2,…,6代表,并用1,2和6代表终态。

在一个程序设计语言中,一般都含有若干类单词符号,我们可首先为每类单词都建立一张状态转换图,然后将这些状态转换图合并成一张统一的状态图,最后再据此构造词法分析程序。

在计算机内实现状态转换图的方法之一,是以状态图中的各个状态为行,以可能输入的各个输入符号为列,组成一个状态矩阵。

其中,矩阵的元素用来指明下一个状态和扫描器应完成的语义动作(如拼接字符、数制转换、查填符号表以及输出单词的内部表示等)。

由于在一个状态矩阵中,通常有许多状态都是出错状态,为了节省存放状态矩阵的存储空间,在具体实现时,常常采用更为紧凑和有效的数据结构。

例如,对于文法G[<无符号数>]的状态转换图,可按下表的形式来存放其状态矩阵。

表中,第一列为各状态Si的偏号,第二列分别列出了在每一状态下可能扫视到的输入符号aj(其中“other”是一个符号集合,用来表示在相应状态所属的那一栏中,除其前所列字符之外的全部其它字符),第三列指出当(Si,aj)出现时应执行的语义动作(通常用若干个语句来实现,若其后空,则表示不进行任何处理),最后一栏用来指明下一状态的偏号(若其后NULL或“结束”则表示无后继状态)。

(三)利用有限自动机:对于给定的包括五个有代表性的关键字、六种关系运算符、标识符及无符号常数组成的语言,还可以通过构造有限自动机的方法实现词法分析程序的设计。

在此为了使词法分析程序结构比较清晰,且尽量避免某些枝节的纠缠,我们现价定要编译的语言中,全部关键字都是保留字,程序员不得将它们作为源程序钟的标识符;在源程序的输入文本中,关键字、标识符、无符号数以关系运算的六重符号之间,至少需用一个空白字符加以分隔。

显然,如果程序员恪守以上这些规定,那么程序中的单词总能得到正确的区分。

另外,由于对语言作了上述限制,因此我们就可以把关键字和标识符的识别统一进行处理。

即每当开始识别一个单词时,若扫视到的第一个字符为字母,则把后继输入的字母或数字字符一次性拼接,直至扫视到非字母、数字字符为止,以期获得一个尽可能长的字母数字字符串,然后以此字符串查表Ⅰ,若查到此字符串,则取出相应的类别码;反之,则表明该字符串为一标识符。

采用上述策略后,可以得到一个如下图所示的有限自动机(以状态转换图表示),并在图中添加了当进行状态转移时,词法分析程序所应执行的语义动作。

(注:为了防止实习量过大,达不到实习的目的,在此将无符号常数简化为无符号整常数)。

据此,可用C语言编出符合以上几项要求的一个相应的词法分析程序,如以下程序所示。

(3)提示:程序所用的若干函数以及主程序有待于具体编写。

另外,事先需建立好保留字表,以备查询。

变量各表和常数表则在词法分析过程中建立。

A. 上机前的准备。

根据实习目的和要求,用C语言编写一个规模适当的词法分析程序以及程序流图,并选择相应的数据结构。

B. 调试。

将各个模块连接成一个整体程序。

C. 测试。

用于调试的例子应有词法正确的,也有错误的字符串。

D. 输出结果。

主要将调试例子与词法分析结果以对照形式输出,必要时给出正误信息。

E. 扩充(任选)。

有余力的学生可适当扩大题目(实验成绩有加分)。

例如:·扩充关键字的数目·允许实型常数·加词法错误检查·增加单词类(如算术运算符等)·处理对象是整个C语言的字符集合F. 编写上机实验报告。

最后提交的结果应该包括:·描述语言的文法。

·单词分类码表。

·状态转换图及状态矩阵。

·源程序。

·源程序说明。

·两个以上的输入字符串的例子及其输出的结果。

注意:不接受没有源程序说明,或者说明和程序不符合的作业。

上机实习二:语法分析目的与要求:通过设计、编制、调试一个典型的语法分析程序(选择有代表性的语法分析方法,如算符优先法、递归下降法、LL(1)、SLR(1)、LR(1)等,作为编制语法分析程序的依据),实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。

实验内容:输入:文法。

选择对各种常见程序语言都通用的语法结构作为分析对象,并且应与所选语法分析方法比较贴近。

输出:如果输入符号串是合法的句子,输出“yes”并且给出每一步归约的过程;如果不是句子,输出“No“,并且输出栈里面已经归约的符号。

示例:(1)题目:对于如下文法,编写与调试一个语法分析程序。

题目一:试采用C语言编制递归下降法的语法分析程序,并用它对FORTRAN语言算术表述式的一个简化子集进行语法分析。

分析过程不嵌入任何的语义动作。

分析对象的BNF定义如下:算法:下图为用递归下降法分析上述算术表达式的框图。

图中(a)为ZC函数,(b)为E函数,(c)为T函数,(d)为F函数,(e)为SYM函数,(f)为ADV ANCE函数。

其中ZC函数为总控程序,主要完成:(1)通知外界键入算术表达式。

(2)控制E函数分析算术表达式。

(3)根据分析结果之正误,分别输出不同的信息。

ZC函数被设计成可以分析无穷多个算术表达式。

E,T,F三个函数分别对应〈算术表达式〉、〈项〉和〈因式〉三个产生式的处理。

它利用到两个公共函数。

一个是函数SYM,它负责从输入字符串ST中取出下一个字符,并存入SYM中等得分析。

另一个是ADV ANCE过程,负责剔除ST中的首字符,可通过挪动字符串指针的办法来实现。

变量TZ之值标志分析的结果(表达式是否有错)。

扩充:有余力的同学,可适当扩大分析对象(试验成绩有加分),例如:●算术表达式中变量还可以是属组元素、函数调用等。

●除算术表达式外,还可进一步分析关系表达式等。

●加强语法检查,尽可能多地、确切地指出各种错误。

题目二:试用C语言编制算符优先文法的语法分析程序。

分析对象为赋值语句。

该赋值语句的左部只限简单变量,右部为一算术表达式的子集,不包括函数,数组元素等。

该赋值语句的BNF定义如下:算法:算符优先分析的算法如下程序所示。

其中,使用了一个分析栈stack,用来在分析过程中存放当前句型的某一前缀,一是句型的最左素短语在栈顶形成,便立即进行归约。

如果我们希望在分析过程中为句子建立一棵“语法树”,则可在每移进一个终结符号时,就建立一个末端结点而在用某一产生式将句型的最左素短语归约为某个费终结符号N时,就建立以N为标记的结点,此结点的各子结点(从左到右)依次是最左素短语的各个符号。

扩充:有余力的同学,可选作以下内容(上机试验成绩有加分):●加强语法检查,对语法有错的语句,给出必要的错误说明信息。

●增加赋值语句的功能。

如左部变量可以是数组元素;右部表达式中可含数组元素、函数调用等。

●输出分析过程的信息。

如分析栈、符号栈、当前应被归约的最左子串、归约后所得的符号等。

提示:●确定文法的机内表示方法。

●分别编写计算布尔矩阵B>,B=及B<的程序,为此,还需要编写计算布尔矩阵的B的闭包B+的子程序,供计算上述各布尔矩阵时调用。

●编制判定优先矩阵是否有多重定义元素的程序,用来判断所给文法是否为算符优先文法。

●输出各优先关系的布尔矩阵以及有关的判定结果的信息。

要求:A.上机前的准备。

结合所选择的题目要求,用C语言编写一个语法分析程序及程序流图,同时考虑相应的数据结构。

B.调试。

改写试验一中的词法分析程序,并将它编写为子程序形式,和语法分析程序一起构成一个完整的程序。

C.测试。

供测试的例子应包括符合语法规则的语句,以及分析程序能够判别的若干错例。

D.结果输出。

对于所输入的字符串,不论对错,都应有明确的信息告诉外界。

E.编写上机实验报告。

最后提交结果应该包括:●输入的文法。

相关文档
最新文档