扬州大学编译原理课程设计报告题目简单的编译器班级计科0802班学号081202427姓名张俊指导教师姜卯生成绩扬州大学信息工程学院2011年6月10日一、课程设计题目实现一个简单的编译器二、课程设计目的通过编译原理课程设计,加深对课堂中所讲授的内容的理解,设计一个具有词法分析、语法、语义分析、错误处理的综合程序。
进一步掌握编译程序常用实现的方法和技术,使学生初步具有研究、设计、编制和调试编译程序的能力。
三、课程设计要求1.实现一个C语言子集或Pascal语言子集的编译器,工具任选。
2.要求实现的功能:翻译 +,-,*, / 四则运算表达式及布尔表达式,翻译包含if语句,while语句及do-while语句及相互间的嵌套。
四、课程设计语言及选用工具选用语言:Java工具 Eclipse五、课程设计方法设计过程中用到的数据结构://关键字数组public static List<Eryuanshi> keyWord= new ArrayList<Eryuanshi>();//自定义符号串数组p ublic static Eryuanshi[] valueAndClass = new Eryuanshi[100];//目标代码数组public static List<Siyuanshi> siyuanshi= new ArrayList<Siyuanshi>();//目标代码类,存放四元式的另外一种形式class Siyuanshi{String op;String str1;String str2;}//二元式类,存放词法分析后的标志符,关键字及其类号class Eryuanshi{String word;int classID;}Stack<Integer> stateStack = new Stack<Integer>(); //状态栈Stack<String> symStack = new Stack<String>(); //符号栈Stack<String> semanticStack = new Stack<String>(); //语义栈编译器主要分为两个模块:(1)词法分析程序:主要功能是从文件逐个单词读取源程序,进行次词法分析,并输出源程序的二元式列表,二元式列表保存在keyWord对象数组中。
关键字、自定义标识符和数字对应的类号列表+ 3 || 15 int 27- 4 = 16 float 28* 5 ( 17 char 29/ 6 ) 18 if 30< 7 [ 19 else 31<= 8 ] 20 while 32== 9 { 21 do 33!= 10 } 22 main 34> 11 : 23 !35>= 12 ;24 数字 2& 13 , 25 自定义1标识符&& 14 void 265空格13字母72非字母或数字字母或数字数字4数字或小数点(并设置小数点的标记数)非数字6+-其他.......主要函数:1、wordAnalys(String s):对源代码进行词法分析,在其中调用lookup ()函数。
2、lookup(String s):对词法分析函数中分析出的各字符串在关键字和符号 表中查找。
(2)语法分析及生成目标代码程序:采用LR表分析程序,LR表具有ACTION和GOTO 两部分。
主要采用两个LR分析表:算术表达式LR表和布尔表达LR表。
根据查询LR表,判断所要采取的动作。
若得到值temp=-1,则表达式识别错误,若temp=0,则表达式识别成功,若0<temp<100,则转相应z状态,若temp>=100,则采取用对应表达式归约。
算术表达式文法:0) S→E1) E→E+E2)E→E--E3) E→E*E4)E→E/E5) E→(E)6) E→i根据算术表达式文法构造算术表达式LR分析表:int[][] E_LR = new int[][]{{ -1, -1, 2, -1, 3, -1, 1},{ 4, 5, -1, -1, -1, 0, -1},{ -1, -1, 2, -1, 3, -1, 6},{104,104, -1,104, -1,104, -1},{ -1, -1, 2, -1, 3, -1, 7},{ -1, -1, 2, -1, 3, -1, 8},{ 4, 5, -1, 9, -1, -1, -1},{101, 5, -1,101, -1,101, -1},{102,102, -1,102, -1,102, -1},{103,103, -1,103, -1,103, -1}};布尔表达式文法:0)E→i1)E→i r i2)E→(E)3)E→!E4)A→E&&5)E→AE6)O→E||7)E→OE布尔表达式LR分析表:int[][] EB_LR = new int[][]{{ 1, 1, 4, -1, 5, -1, -1, -1, 13, 7, 8},{ -1, 2, -1,101, -1,101,101,101, -1, -1, -1},{ 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},{ -1, -1, -1,102, -1,102,102,102, -1, -1, -1},{ 1, -1, 4, -1, 5, -1, -1, -1, 11, 7, 8},{ 1, -1, 4, -1, 5, -1, -1, -1, 6, 7, 8},{ -1, -1, -1,104, -1,104,104,104, -1, -1, -1},{ 1, -1, 4, -1, 5, -1, -1, -1, 14, 7, 8},{ 1, -1, 4, -1, 5, -1, -1, -1, 15, 7, 8},{105, -1,105, -1,105, -1, -1, -1, -1, -1, -1},{107, -1,107, -1,107, -1, -1, -1, -1, -1, -1},{ -1, -1, -1, 12, -1, 9, 10, -1, -1, -1, -1},{ -1, -1, -1,103, -1,103,103,103, -1, -1, -1},{ -1, -1, -1, -1, -1, 9, 10, 0, -1, -1, -1},{ -1, -1, -1,106, -1,106,106,106, -1, -1, -1},{ -1, -1, -1,108, -1, 9,108,108, -1, -1, -1}};主要函数:1、public static void readAndAnalysis():对得到的关键语句进行分析。
2、public static int ifAnalysis():对if语句进行分析。
3、public static int whileAnalysis():对while语句进行分析。
4、public static int doAnalysis():对do-while语句进行分析。
5、public static int E():对算术表达式采用LR分析法进行语法分析,在其中调用codeGen()函数,并采用语法制导直接产生相应的目标代码,6、public static int EB()::对布尔表达式采用LR分析法进行语法分析,在其中调用codeGen()函数在布尔表达式中可能嵌套算术表达式,此时要调用E()函数进行分析,并采用语法制导直接产生目标代码。
7、public static void codeGen(String op,String str1,Stringstr2,String str3):产生目标代码8、public static String merge(String str1,String str2): 并链。
六.课程设计体会本课程设计是一个编译器的设计,包括词法分析部分、语法分析部分、和目标代码生成。
词法分析是编译的基础,执行词法分析的程序称为词法分析器,也就是说编译程序中完成词法分析任务段就是词法分析器。
语法分析部分为语法分析器的设计,采用LR(1)分析方法进行语法分析,判断给出的符号串是否为该文法识别的句子,是否符合if、while等的语法规则。
目标代码是利用语法制导直接生成的。
通过此次课程设计,我对编译原理课程的整个内容有了较深的理解,对实现简易编译器的整个过程有了清晰的认识,总的来说,很好的将理论和实践联系起来。
在整个设计过程中,最大的收获就是切身体会了编程语言在具体分析方法下进行翻译的实现机制和步骤.其次是对简单优先分析方法的理解和运用以及对堆栈的操作原理的掌握。
因为之前学理论的时候,感觉和实际的编程语言联系不是很大,也不知道所学理论如何在语句的翻译过程中发挥作用.而在具体语句翻译的设计实践过程中,才真正体会了该步骤是如何一步步实现的,这些都是以往单纯理论知识学习所感触不到的.在翻译布尔表达式的过程和翻译if、else,while,do- while语句的过程中,遇到了一些编程方面的困难,并且翻译布尔表达式也是编译器实现过程中最复杂的一部分,在调试的时候也出现了问题,而且经常会出现无限循环的情况,这是因为嵌套的方面没有调试好,但是还好有DeBug,一步一步终于调试好了,感觉编程能力还是要一步一步来,总是看书是不行的,要学会敲代码,要动手,这样才能一步步的提高,自己以后一定要勤加练习,代码量多才是王道啊!七.实验结果与分析源代码:词法分析:目标代码生成:整个编辑器界面:八.部分源代码算术表达式分析:public static int E(int tempcol){int entry = tempcol;Stack<Integer> stateStack = new Stack<Integer>(); //状态栈Stack<String>symStack = new Stack<String>(); //符号栈Stack<String> semanticStack = new Stack<String>(); //语义栈String analyceString = new String("");String E_Place = new String("");String E1_Place = new String("");String E2_Place = new String("");String symbol = new String("");tempcol+=2;//不等于";","<","<=","==","!=",">",">=","&","&&","||"while(valueAndClass[tempcol].getClassID() != 24 && valueAndClass[tempcol].getClassID() != 7 &&valueAndClass[tempcol].getClassID() != 8 &&valueAndClass[tempcol].getClassID() != 9 &&valueAndClass[tempcol].getClassID() != 10 &&valueAndClass[tempcol].getClassID() != 11 &&valueAndClass[tempcol].getClassID() != 12 &&valueAndClass[tempcol].getClassID() != 13 &&valueAndClass[tempcol].getClassID() != 14 &&valueAndClass[tempcol].getClassID() != 15){//等于变量或者数字if(valueAndClass[tempcol].getClassID() == 1 ||valueAndClass[tempcol].getClassID() == 2)analyceString += "i";//等于 "+","-"else if(valueAndClass[tempcol].getClassID() ==3 || valueAndClass[tempcol].getClassID() == 4)analyceString += "+";//等于 "*","/"else if(valueAndClass[tempcol].getClassID() ==5 || valueAndClass[tempcol].getClassID() == 6)analyceString += "*";elseanalyceString += valueAndClass[tempcol].getWord();tempcol++;}analyceString += "#";char[] analyceChar = analyceString.toCharArray();stateStack.push(0);symStack.push("#");int loc;for(int i = 0; i < analyceChar.length; i++){int temp = 0;for(loc = 0; loc < 7; loc++)if(analyceChar[i] == sym[loc]){temp = E_LR[stateStack.peek()][loc];break;}switch(temp){case -1:{System.out.printf("error position: %d",i).println();System.exit(0);}case 0:{System.out.println("Analysis Successful!!!");}case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:{stateStack.push(temp);symStack.push(String.valueOf(analyceChar[i]));semanticStack.push(valueAndClass[entry+2+i].getWord());break;}case 101:{ //E->E+E E->E-EstateStack.pop();stateStack.pop();stateStack.pop();symStack.pop();symStack.pop();symStack.pop();E1_Place = semanticStack.pop();symbol = semanticStack.pop();E2_Place = semanticStack.pop();E_Place = newTemp();codeGen(symbol,E1_Place,E2_Place,E_Place);symStack.push("E");stateStack.push(E_LR[stateStack.peek()][6]);semanticStack.push(E_Place);i--;break;}case 102:{ //E->E*E E->E/EstateStack.pop();stateStack.pop();stateStack.pop();symStack.pop();symStack.pop();symStack.pop();E1_Place = semanticStack.pop();symbol = semanticStack.pop();E2_Place = semanticStack.pop();E_Place = newTemp();codeGen(symbol,E1_Place,E2_Place,E_Place);symStack.push("E");stateStack.push(E_LR[stateStack.peek()][6]);semanticStack.push(E_Place);i--;break;}case 103:{ //E->(E)stateStack.pop();stateStack.pop();stateStack.pop();symStack.pop();symStack.pop();symStack.pop();semanticStack.pop();E1_Place = semanticStack.pop();semanticStack.pop();symStack.push("E");stateStack.push(E_LR[stateStack.peek()][6]);semanticStack.push(E1_Place);i--;break;}case 104:{ //E->istateStack.pop();symStack.pop();symStack.push("E");stateStack.push(E_LR[stateStack.peek()][6]);E_Place = semanticStack.peek();i--;break;}}}codeGen("=",valueAndClass[entry].getWord(),"_",E_Place);return tempcol;}。