编译技术上机实验指导书
编译程序实验指导书讲解教学提纲
编译程序实验指导书解讲.编译程序实验指导书实验目的:用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)根据文法的产生式规则消除左递归,提取公共左因子构造出相应的递归下降分析器。
二、实验内容根据课堂讲授的形式化算法,编制程序实现递归下降分析器,能对常见的语句进行分析。
编译技术--实验指导书
《编译技术》实验指导书湘潭大学信息工程学院计算机工程系何春梅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; } }
编译方法实验指导书
少年易学老难成,一寸光阴不可轻- 百度文库目录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)文法的方法及对某一输入串的分析过程。
C语言上机实训指导书
C语言上机指导书C语言上机实验的目的主要是在深入理解和掌握课程中的基本概念和原理的基础上培养学习者用计算机解决实际问题的意识,训练和提高学习者的程序设计能力和程序调试能力。
上机实验一般经历上机前的准备(编程)、上机调试运行和实验后的总结三个步骤。
上机前的准备一个C语言源程序总是在一定的硬件和软件环境支持下进行编辑、编译、连接和运行的,而这其中的每一步都直接影响程序调试的效率。
所以初学者必须了解所使用的计算机系统的基本操作方法,学会使用该系统,了解在该系统上如何编辑、编译、连接和运行一个C语言程序。
根据问题,进行分析,选择适当算法并编写程序。
上机前一定要仔细检查程序(称为静态检查)直到找不到错误(包括语法和逻辑错误)。
分析可能遇到的问题及解决的对策。
准备几组测试程序的数据和预期的正确结果,以便发现程序中可能存在的错误。
上机前没有充分的准备,到上机时临时拼凑一个错误百出的程序,宝贵的上机时间白白浪费了;如果抄写或复制一个别人编写的程序,到头来自己一无所获。
二、上机输入和编辑程序,并调试运行程序首先调用C语言集成开发环境,输入并编辑事先准备好的源程序;然后调用编译程序对源程序进行编译,查找语法错误,若存在语法错误,重新进入编辑环境,改正后再进行编译,直到通过编译,得到目标程序(扩展名为OBJ)。
下一步是调用连接程序,产生可执行程序(扩展名为EXE)。
使用预先准备的测试数据运行程序,观察是否得到预期的正确结果。
若有问题,则仔细调试,排除各种错误,直到得到正确结果。
在调试过程中,要充分利用C语言集成开发环境提供的调试手段和工具,例如单步跟踪、设置断点、监视变量值的变化等。
整个过程应自己独立完成。
不要一点小问题就找老师,学会独立思考,勤于分析,通过自己实践得到的经验用起来更加得心应手。
三、整理上机实验结果,写出实验报告实验结束后,要整理实验结果并认真分析和总结,根据教师要求写出实验报告。
实验报告一般包括如下内容:1、实验内容实验题目与要求。
编译技术实验指导书
编译技术实验指导书计算机科学与工程学院前言《编译技术》是计算机科学与技术、软件工程等专业的一门理论性较强的专业课,旨在培养大学生的计算机专业素质和基本编译程序设计的能力。
通过实验教学,使学生加深对所学知识的理解,掌握编译程序构造原理和实现技术。
它的目的和任务是:让学生掌握编译程序的基本原理和实现技术,提高学生对程序设计语言的理解,让学生了解将高级程序设计语言源程序翻译成计算机能处理的目标代码语言的整个过程,培养学生的编译程序设计的能力。
编译程序的设计包括词法分析程序的设计、语法分析程序的设计、语义分析程序的设计和中间代码生成程序的设计等。
本实验指导书是金成植编著的《编译程序构造原理和实现技术》的配套教材。
编者根据计算机课程实践性强等特点,编写了本实验教程,帮助学生有计划地系统地上机实践。
根据教学内容和教学目标,实验指导书设计了八次实验,实验学时16学时,每个实验2学时。
学生应按照实验指导书的要求,完成指定的实验任务,并及时提交实验报告。
要求学生在每次实验之前做好预习,实验后按要求写出实验报告。
在每次实验过程中教师要考核学生每次实验的完成情况。
一、为保证实验效果学生应做到:1、遵守实验室的规章制度,爱护教学设备。
2、学生必须按时上机下机。
3、禁止做与实验无关的内容,禁止利用实验学时玩计算机游戏;4、每次实验前学生应做好预习,实验后按时提交实验报告。
二、实验报告的要求:1、明确实验的目的及要求;2、记录下相应编译阶段的程序设计的思想、程序代码及运行的结果;3、说明实验中出现的问题和解决过程;4、写出实验的体会和实验过程中没解决的问题。
由于编者水平有限,书中难免有错,敬请大家批评指正。
辽宁科技大学计算机学院科学系2009年2月目录实验一词法分析器的手工构造...................................................... . (3)实验二词法分析器的自动生成........................................... . (10)实验三递归下降语法分析程序设计 (18)实验四LL(1)语法分析程序设计..................................... ....... . (22)实验五LR语法分析器程序设计....................................... .. (27)实验六说明语句的语法制导翻译........................................... ...... .. (32)实验七中间代码生成程序设计............................................. (35)实验八微小编译器的设计............................................ (37)实验一词法分析器的手工构造实验类型:验证性实验要求:必修一、实验目的:通过本次实验,使学生掌握词法分析的构造原理及实现技术,会编写简单程序设计语言的词法分析器。
编译程序实验指导书讲解教学提纲
编译程序实验指导书讲解编译程序实验指导书实验目的:用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所有的关键字是程序设计语言保留使用的,并且用小写字母表示,用户自己定义的标识符不能和关键字重复。
《编译原理》科学实验指导说明书
《编译原理》实验指导书实验一词法分析器的设计一、实验目的和要求加深对状态转换图的实现及词法分析器的理解。
熟悉词法分析器的主要算法及实现过程。
要求学生掌握词法分析器的设计过程,并实现词法分析。
二、实验基本内容给出一个简单语言的词法规则,画出状态转换图,并依据状态转换图编制出词法分析程序,能从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单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++等。
最新编译原理课程实验指导书-PL0语言及其编译器打印版.doc
《编译原理》课程实验指导书(Compiler Principle)目录序言 (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 生成的代码(片段) (28)2.PL语言编译器源程序 (28)序言本《编译原理》实验,其目的是让大家动手设计和实现一个规模适中的语言的编译器,该编译器不仅涉及编译程序的各个阶段,而且也强调了编译的总体设计、各个阶段的接口安排等等。
通过上机实践,来设计这个相对完整的编译器,一方面可以使同学们增加对编译程序的整体认识和了解——巩固《编译原理》课程所学知识,另一方面,通过上机练习,学生也可以学到很多程序调试技巧和设计大型程序一般的原则,如模块接口的协调,数据结构的合理选择等等。
为了使学生能尽早动手实践,我们建议把实践分成三部分,首先阅读本教程第一部分,在这部分就PL语言的语法及其编译程序的各个阶段作了简单介绍,以便对PL编译程序有个初步的印象。
其次要认真阅读理解第三部分所给出的PL编译器源程序及示例,使上一阶段的初步印象得以加深、具体化。
最后按照第二部分的实验要求扩充PL语言的功能并加以实现。
具体操作时分成三个阶段:词法分析、语法分析及代码生成。
最后再统一组装成一个完整的PL编译器,并适当进行改进、补充。
编译技术课程设计指导书 (2) (1)
百度文库- 让每个人平等地提升自我!编译技术课程设计指导书题目:L语言编译器的设计与实现院系:计算机学院2010年11月1日第一节概述1课程设计的目的和任务编译技术是一门实践性很强的课程,只有通过实践,才能真正掌握。
实际的编译程序是十分复杂的,有时由多达十几万条指令组成。
为此,编译原理的实践教学,采用简化高级程序设计语言文法的办法,重点针对词法分析、语法分析、语义分析和中间代码生成以及目标代码生成等几个关键环节进行编程和调试训练。
每个环节可作为一个独立的实践课题,分别编程调试,然后再连接在一起总调,从而实现一个完整的编译器。
2实践方法任何一个实用的高级语言,其语法都比较复杂,如选其作为源语言,很难实践全过程,故本实践将定义一个简化的类PASCAL语言——L语言作为源语言,设计调试出它的编译程序。
因任务具有一定的难度和工作量,且时间有限,因此,分组进行实验,每组2人,分别承担词法分析/目标代码生成以及语法/语义分析两部分中的一个,具体分工由组内协商进行,并且整个代码的链接工作由承担词法分析任务的同学完成。
可使用C、VC++等语言编程实现。
3实践报告的规范和要求每位学生完成承担任务后写出格式规范的实验报告,包括封面、任务说明、程序设计时考虑的算法和方法、流程图、主要代码说明、运行结果分析等。
4L语言定义程序定义:〈程序〉→ program〈标识符〉〈程序体〉.〈程序体〉→〈变量说明〉〈复合句〉变量定义:〈变量说明〉→ var〈变量定义〉|ε〈变量定义〉→〈标识符表〉:〈类型〉;|〈标识符表〉:〈类型〉;〈变量定义〉〈标识符表〉→〈标识符〉,〈标识符表〉|〈标识符〉语句定义:〈复合句〉→ begin〈语句表〉end〈语句表〉→〈执行句〉;〈语句表〉|〈执行句〉〈执行句〉→〈简单句〉|〈结构句〉〈简单句〉→〈赋值句〉〈赋值句〉→〈变量〉:=〈表达式〉〈变量〉→〈标识符〉〈结构句〉→〈复合句〉|〈if句〉|〈WHILE句〉〈if句〉→ if〈布尔表达式〉then〈执行句〉| if〈布尔表达式〉then〈执行句〉else〈执行句〉〈while句〉→ while〈布尔表达式〉do〈执行句〉表达式定义:〈表达式〉→〈算术表达式〉|〈布尔表达式〉〈算术表达式〉→〈算术表达式〉+〈项〉|〈算术表达式〉-〈项〉|〈项〉〈项〉→〈项〉*〈因子〉|〈项〉/〈因子〉|〈因子〉〈因子〉→〈算术量〉|(〈算术表达式〉)〈算术量〉→〈标识符〉|〈整数〉|〈实数〉〈布尔表达式〉→〈布尔表达式〉or〈布尔项〉|〈布尔项〉〈布尔项〉→〈布尔项〉and〈布尔因子〉|〈布尔因子〉〈布尔因子〉→ not〈布尔因子〉|〈布尔量〉〈布尔量〉→〈布尔常数〉|〈标识符〉|(〈布尔表达式〉)|〈关系表达式〉〈关系表达式〉→〈标识符〉〈关系运算符〉〈标识符〉〈关系运算符〉→〈|〈=| =| 〉=| 〉|〈〉类型定义:〈类型名〉→ integer|bool | real单词定义:〈标识符〉→〈字母〉|〈标识符〉〈字母〉|〈标识符〉〈数字〉〈整数〉→〈数字〉|〈整数〉〈数字〉〈实数〉→〈整数〉.|〈实数〉〈数字〉〈布尔常数〉→ true|false字符定义:〈字母〉→A│B│C│D│E│F│G│H│I│J│K│L│M│N│O│P│Q│R│S│T│U│V│W│X│Y│Z│a│b│c│d│e│f│g│h│i│j│k│l│m│n│o│p│q│r│s│t│u│v│w│x│y│z〈数字〉→0│1│2│3│4│5│6│7│8│95源程序书写格式规定(1)单词必须在一行内写完,即:一个单词不能分两行写;(2)源程序语句的书写采用自由格式,即:一行可写多个语句,一个语句也可分多行写;(3)源程序不含注释;(4)语句以“;”结束,“end”前的一个语句的“;”不可以省略。
编译技术实验(New)
(工·软件学院)编号___ 编译技术实验课程名称:编译技术实验实验总学时:30英文名称:Experiment of Techniques for Compiler Construction 实验学分:4(包括理论课)课程编号:面对专业:软件工程一.教学目标与基本要求通过本课程实验,巩固和加深理解所学过的理论知识,训练实验技能,树立工程实际观点和严谨的科学作风,使之能独立地进行实验,提高他们分析问题和解决问题的能力。
熟练掌握编译理论和方法方面的基本知识,通过设计、编写、调试、运行一个较完整的编译程序(至少包括词法分析、语法分析、语义分析和翻译),进一步加深对编译程序结构和编译工作过程的理解和把握,具有设计、实现、分析和维护编译系统等大中型软件方面的初步能力。
二.原理与课程介绍编译技术是计算机类专业的一门重要专业基础课,为软件学院软件工程专业的必修课程。
内容包括编译系统的结构、工作流程及编译程序各组成部分的设计原理和实现技术。
尽管“编译程序”是特指将高级程序设计语言翻译成低级语言的软件,但编译程序构造的基本原理和技术也广泛应用于一般软件的设计和实现。
“编译技术”是一门理论性和实践性都比较强的课程。
其特点是概念多、较抽象,算法多且实现技术较复杂,难于理解,需要大量的上机实践。
四.考核办法1. 实验成绩: 占总成绩20%。
2. 检查实验操作;3. 检查实验报告和程序。
五.教科书与参考书(一)教科书张素琴,吕映芝等:“编译原理(第2版)”,清华大学出版社,2005年。
(二)参考书:[1]陈火旺,刘春林等:“程序设计语言编译原理(第3版)”,国防工业出版社,2000年。
[2]金成植:“编译程序构造原理和实现技术”,高等教育出版社,2000年。
[3]蒋立源,康慕宁:“编译原理(第2版)”,西北工业大学出版社,2001年。
编译技术课程设计大纲及指导书
《编译技术》课程设计大纲及指导书实验名称:根据给定的文法完成一个小型编译器。
实验目的:本课程设计实验项目的目标是通过实际构造一个完整的编译器,加深对编译器实现原理的理解,了解完整编译系统的构造方法。
实验类型:验证型、提高型实验学时: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. 检查文档内容是否齐全、正确。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《编译技术》上机实验指导书
实验一
一、题目
编制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 ERROR
2.实验时间:4-6学时。
3.检查时间:第15周抽查。
四、步骤
1.定义递归子程序
2.增加主控程序
(1)调用E()
(2)输入、输出
3.程序验证。