中间代码生成实验报告doc

合集下载

中间代码生成实验报告

中间代码生成实验报告

一、实验目的1. 理解编译原理中中间代码生成的基本概念和作用。

2. 掌握中间代码生成的常用算法和策略。

3. 提高对编译器构造的理解和实际操作能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:Java3. 开发工具:Eclipse三、实验内容1. 中间代码生成的基本概念2. 中间代码的表示方法3. 中间代码生成算法4. 实现一个简单的中间代码生成器四、实验步骤1. 了解中间代码生成的基本概念中间代码生成是编译过程中的一个重要环节,它将源程序转换成一种中间表示形式,便于后续的优化和目标代码生成。

中间代码生成的目的是提高编译器的灵活性和可维护性。

2. 研究中间代码的表示方法中间代码通常采用三地址代码(Three-Address Code,TAC)表示。

TAC是一种低级表示,由三个操作数和一个操作符组成,例如:(t1, t2, t3) = op,其中t1、t2、t3为临时变量,op为操作符。

3. 学习中间代码生成算法中间代码生成算法主要包括以下几种:(1)栈式中间代码生成算法(2)归约栈中间代码生成算法(3)递归下降中间代码生成算法4. 实现一个简单的中间代码生成器本实验采用递归下降中间代码生成算法,以一个简单的算术表达式为例,实现中间代码生成器。

(1)定义语法规则设表达式E由以下语法规则表示:E → E + T | E - T | TT → T F | T / F | FF → (E) | i(2)设计递归下降分析器根据语法规则,设计递归下降分析器,实现以下功能:①识别表达式E②识别项T③识别因子F(3)生成中间代码在递归下降分析器中,针对不同语法规则,生成相应的中间代码。

例如:当遇到表达式E时,生成以下中间代码:(t1, t2, t3) = op1(t1, t2) // op1表示加法或减法(t4, t5, t6) = op2(t4, t5) // op2表示乘法或除法(t7, t8, t9) = op3(t7, t8) // op3表示赋值(4)测试中间代码生成器编写测试用例,验证中间代码生成器的正确性。

中间代码生成实验报告

中间代码生成实验报告

中间代码生成实验报告《中间代码生成实验报告》摘要:本实验旨在通过编写中间代码生成程序,实现将高级语言源代码转换为中间代码的功能。

通过实验,我们掌握了中间代码的生成过程和相关算法,并对编译器的工作原理有了更深入的理解。

本实验采用了C语言作为源语言,通过词法分析、语法分析和语义分析,生成了对应的中间代码。

一、实验目的1. 理解编译器的工作原理,掌握中间代码生成的基本概念和方法;2. 掌握中间代码的表示方法和生成算法;3. 通过实践,提高编程能力和对编译原理的理解。

二、实验环境1. 操作系统:Windows 10;2. 编程语言:C语言;3. 开发工具:Visual Studio 2019。

三、实验内容1. 设计并实现中间代码生成程序,将给定的C语言源代码转换为中间代码;2. 实现词法分析、语法分析和语义分析,生成对应的中间代码;3. 测试程序,验证中间代码的正确性和有效性。

四、实验步骤1. 设计中间代码的表示方法,包括四元式、三地址码等;2. 实现词法分析器,将源代码转换为词法单元序列;3. 实现语法分析器,将词法单元序列转换为语法树;4. 实现语义分析器,对语法树进行语义检查并生成中间代码;5. 测试程序,验证中间代码的正确性和有效性。

五、实验结果经过测试,中间代码生成程序能够正确地将C语言源代码转换为中间代码,并且生成的中间代码能够正确地表达源代码的语义和逻辑结构。

通过实验,我们成功地掌握了中间代码的生成过程和相关算法,加深了对编译器工作原理的理解。

六、实验总结通过本次实验,我们深入了解了编译器的工作原理和中间代码生成的基本概念和方法。

通过实践,我们提高了编程能力和对编译原理的理解,为进一步深入学习编译原理和设计编译器打下了良好的基础。

希望通过不断的实践和学习,能够更加熟练地掌握编译原理的知识,为今后的学习和工作打下坚实的基础。

编译原理实验整体(4)语义及中间代码

编译原理实验整体(4)语义及中间代码

编译原理目标代码生成实验报告班级:11203105学号:1120310528姓名:陈向军一、实验目的:通过上机实习,将前面生成的中间代码转化成汇编代码二、实验要求:将前面生成的中间代码转化成汇编代码三、算法思想:与语法制导翻译相结合,将生成的中间代码转化成汇编代码四、语法制导翻译S' -> S ;S -> void main ( ) { decls stmts } ;S -> fun S ;fun -> fun fun ;fun -> funtype function id ( fundecls ) { decls stmts } ;fundecls -> fundecls , fundecl ;fundecls -> fundecl ;fundecl -> type id ;decls -> decls decl ;decls -> decl ;decl -> type ids @ ;type -> float ;type -> int ;funtype -> float ;funtype -> int ;ids -> ids , N6 id ;ids -> id ;ids -> id [ num ] = { nums } ;nums -> nums , num ;nums -> num ;nums -> xiao ;stmts -> stmts stmt ;stmts -> stmt ;stmt -> return expr @ ;stmt -> asgn @ ;stmt -> iter ;stmt -> { stmts } ;stmt -> continue ;stmt -> break ;expr -> E ;E -> E + T ;E -> E - T ;E -> T ;T -> T * F ;T -> T / F ;T -> T % F ;T -> F ;F -> ( E ) ;F -> num ;F -> xiao ;F -> id ;F -> id [ expr ] ;asgn -> left = expr ;asgn -> left = funid ( funcs ) ;funid -> id ;funcs -> funcs , func ;funcs -> func ;func -> id ;func -> num ;left -> id ;left -> id [ expr ] ;iter -> for ( asgn @ M1 rel @ N4 inc ) N2 stmt ; iter -> while M1 ( rel ) M2 stmt ;M1 -> $ ;M2 -> $ ;N1 -> $ ;N2 -> $ ;N3 -> $ ;N4 -> $ ;N5 -> $ ;N6 -> $ ;rel -> expr op expr ;rel -> ! rel ;rel -> rel o N3 rel ;op -> < ;op -> > ;op -> <= ;op -> >= ;op -> == ;o -> && ;o -> || ;inc -> left ++ ;slct -> if ( rel ) M1 stmt N1 else M2 stmt ;stmt -> printf ( str ) @ ;stmt -> printf ( str , N5 ids ) @ ;stmt -> scanf ( str , & id ) @ ;补充说明:$表示空,@表示语义说明,详见代码。

编译原理中间代码生成实验报告

编译原理中间代码生成实验报告

竭诚为您提供优质文档/双击可除编译原理中间代码生成实验报告篇一:编译原理-分析中间代码生成程序实验报告课程名称编译原理实验学期至学年第学期学生所在系部年级专业班级学生姓名学号任课教师实验成绩计算机学院制开课实验室:年月日篇二:编译原理实验中间代码生成实验四中间代码生成一.实验目的:掌握中间代码的四种形式(逆波兰式、语法树、三元式、四元式)。

二.实验内容:1、逆波兰式定义:将运算对象写在前面,而把运算符号写在后面。

用这种表示法表示的表达式也称做后缀式。

2、抽象(语法)树:运算对象作为叶子结点,运算符作为内部结点。

3、三元式:形式序号:(op,arg1,arg2)4、四元式:形式(op,arg1,arg2,result)三、以逆波兰式为例的实验设计思想及算法(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。

(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。

(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。

(4)如果不是数字,该字符则是运算符,此时需比较优先关系。

做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。

如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。

倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。

(5)重复上述操作(1)-(2)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。

四、程序代码://这是一个由中缀式生成后缀式的程序#include#include#include#include#definemaxbuffer64voidmain(){chardisplay_out(charout_ch[maxbuffer],charch[32]);//intcaculate_array(charout_ch[32]);staticinti=0;staticintj=0;charch[maxbuffer],s[maxbuffer],out[maxbuffer];cout cin>>ch;for(i=0;i {out[i]=ch[i];}cout while(out[j]!=#)cout j++;}cout display_out(s,out);//caculate_array;}chardisplay_out(charout_ch[32],charch[]) {inttop=-1;inti=0,data[maxbuffer],n;intj=0;charsta[20];while(ch[i]!=#){if(isalnum(ch[i])){while(isalnum(ch[i])){out_ch[j]=ch[i];j++;i++;}out_ch[j]=;j++;else{switch(ch[i]){case+:case-:if(sta[top]==(||top==-1) {top++;sta[top]=ch[i];i++;}else{//j--;out_ch[j]=sta[top];j++;top--;//i++;}break;//break;case*:case/:if(sta[top]==*/) {out_ch[j]=sta[top];j++;//i++;top--;}else{top++;sta[top]=ch[i];i++;}break;//break;case(:top++;sta[top]=ch[i];i++;break;case):if(sta[top]==() {top--;i++;}if(top==-1){//cout }else{//while(sta[top]!=?(?){ out_ch[j]=sta[top];top--;j++;//}break;}break;/*case?#?:out_ch[j]=?#?; j++;break;*/default:cout ch[i]=#;j=0;break;}}}while(top!=-1){out_ch[j]=sta[top];j++;top--;}out_ch[j]=#;n=0;co(:编译原理中间代码生成实验报告)utwhile(out_ch[n]!=#){cout n++;}cout j=0;returnout_ch[maxbuffer];}五、实验结果:要求:自己给出3个测试用例,观察结果。

编译语言-中间代码生成

编译语言-中间代码生成

实验四中间代码生成一、实验内容设计一个程序,该程序能够将形如x = y op z 的简单赋值语句翻译为对应的四元式序列,其中op 可为+、-、*、/等二元运算符。

(可参考实验指导书P163 至P164)。

要求用JA V A语言编程。

例如:若输入赋值语句 a = b + c,则输出如下四元式序列。

二、程序代码InToPost.JAVApackage zlf;import java.io.IOException;public class InToPost {private Stack theStack;private String input;private String output = "";public InToPost(String in) {input = in;int stackSize = input.length();theStack = new Stack(stackSize);}public String doTrans() {for (int j = 0; j < input.length(); j++) {char ch = input.charAt(j);switch (ch) {case'+':case'-':gotOper(ch, 1);break;case'*':case'/':gotOper(ch, 2);break;case'(':theStack.push(ch);break;case')':gotParen(ch);break;default:output = output + ch;break;}}while (!theStack.isEmpty()) {output = output + theStack.pop();}// System.out.println(output);return output;}public void gotOper(char opThis, int prec1) { while (!theStack.isEmpty()) {char opTop = theStack.pop();if (opTop == '(') {theStack.push(opTop);break;}else {int prec2;if (opTop == '+' || opTop == '-')prec2 = 1;elseprec2 = 2;if (prec2 < prec1) {theStack.push(opTop);break;}elseoutput = output + opTop;}}theStack.push(opThis);}public void gotParen(char ch){while (!theStack.isEmpty()) {char chx = theStack.pop();if (chx == '(')break;elseoutput = output + chx;}}class Stack {private int maxSize;private char[] stackArray;private int top;public Stack(int max) {maxSize = max;stackArray = new char[maxSize];top = -1;}public void push(char j) {stackArray[++top] = j;}public char pop() {return stackArray[top--];}public char peek() {return stackArray[top];}public boolean isEmpty() {return (top == -1);}}}package zlf;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.Stack;public class extends JFrame{ private static Stack<String> number = new Stack<String>();private int n = 1;private JButton jbt = new JButton("生成");private JTextArea jta = new JTextArea();private JTextField jtf = new JTextField("A=B+C*D+E",20);private boolean hasError = false;public QuaternaryTypeOfAlgorithm(){JPanel p1 = new JPanel();p1.add(jtf);p1.add(jbt);add(p1,BorderLayout.NORTH);add(new JScrollPane(jta),BorderLayout.CENTER);jbt.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){String equation = jtf.getText().trim();create(equation);number.clear();hasError = false;repaint();}});}public void create(String input){String output;InToPost theTrans = new InToPost(input);output = theTrans.doTrans();try{for(int i = 0 ; i < output.length(); i++){String t = output.substring(i, i+1);if(t.equals("+")){String n1 = number.pop();String n2 = number.pop();String n3 = "T"+n;n++;number.push(n3);jta.append(n-1+": (+,"+n2+","+n1+","+n3+")"+'\n');}else if(t.equals("-")){String n1 = number.pop();String n3 = "T"+n;n++;number.push(n3);jta.append(n-1+": (-,"+n1+","+" "+","+n3+")"+'\n');}else if(t.equals("*")){String n1 = number.pop();String n2 = number.pop();String n3 = "T"+n;n++;number.push(n3);jta.append(n-1+": (*,"+n2+","+n1+","+n3+")"+'\n');}else if(t.equals("/")){String n1 = number.pop();String n2 = number.pop();String n3 = "T"+n;n++;number.push(n3);jta.append(n-1+": (/,"+n2+","+n1+","+n3+")"+'\n');}else if(t.matches("[a-zA-Z0-9=]")){number.push(t);//System.out.println("number:"+t);}}String last2 = number.pop();number.pop();String last1 = number.pop();n++;jta.append(n-1+":(=,"+last2+", ,"+last1+")"+'\n'+'\n'+'\n');}catch(Exception e){hasError = true;}if(hasError||!number.empty()){JOptionPane.showMessageDialog(null, "你输入的算式表达式有错!请重新输入");n umber.clear();}}public static void main(String[] args){QuaternaryTypeOfAlgorithm q = new QuaternaryTypeOfAlgorithm();q.setSize(400,200);q.setTitle("生成四元式序列");q.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);q.setVisible(true);q.setLocationRelativeTo(null);}}三、实验结果。

编译原理实验三:中间代码生成

编译原理实验三:中间代码生成

编译原理——语义分析成员:杨霞 030802107王日日 030802139方艳丽 030802102实验三:语义分析:生成中间代码一、实验目的通过语法制导或翻译模式生成中间代码。

二、实验内容在自底向上语法分析基础上设计语义规则(语法制导翻译),将源程序翻译为四元式输出.三、实验环境Windows microsoft visual c++ 6.0四.实验原理三地址码的几种常见指令:1.X=Y OP Z 的赋值指令,其中OP 是一个双目运算符或逻辑运算符。

2.X= Y 的复制指令。

3.无条件转移指令 GOTO L 把下一步要执行的带有标号L的三地址指令4.IF X GOTO L 或 IF FALSE X GOTO L的条件转移指令5.IF X RELOP Y GOTO L的条件转移指令。

三地址码四元式实验环境:windows microsoft visual c++语法制导定义:控制流语句的语法制导定义:实验代码分析:struct midcode//四元式结构;{int label;//存放标号;char op;//存放操作符;char arg1;//存放操作数1;char arg2;//存放操作数2;char result;//存放目的操作数(转移标号)}m_midcode[100];如何实现语句的跳转:主要利用了语义规则与规约过程的结合;例如:Label为四元式产生的新标号;Mnew 为四元式中最新的标号;case 9:tab1=t-1;while(tab1--){if(m_midcode[tab1].op=='>'&& (int)(m_midcode[tab1].result)==0){m_midcode[tab1].result=(char)m_midcode[tab1+2].label;/E.true=newlabelm_midcode[tab1+1].result=(char)(m_midcode[tab1+2].label+1);/E.false=newlabeltab2=tab1;for(;tab2<t;tab2++)if(m_midcode[tab2].op=='g'&&(int)m_midcode[tab2].result==0)m_midcode[tab2].result=(char)(mnew-1);//S1.next=s2.next=S.nextbreak ;}实验结果:心得体会:四元式序列是编译原理最后一个实验,最后的实验也要建立在之前两个实验的基础上。

哈工大威海编译原理实验三语义分析与中间代码生成(DOC X页)

哈工大威海编译原理实验三语义分析与中间代码生成(DOCX页)哈尔滨工业大学(威海)计算机学院编译原理实验报告姓名院系计算机学院学号 090410任课教师指导教师实验地点宋健二楼机房实验时间实验三语义分析及中间代码生成实验名称同组人无预习报告(对实验主要内容的认识) 得分(1) 通过本次试验,我应该加深对于编译原理制导方案的理解,并且加深对于语法变换的所起到的作用;(2) 对于试验中要用到得中间代码的格式规范,也应该进一步的分析和掌握(3) 能够很好的使用到前面开发出来的词法分析器和语法分析器,将它们与语义分析器结合起来,跟好的更系统的掌握编译原理这门专业技能 (4) 关于符号表以及token串表的维护,现在终于使其有所作用实验内容(问题,思路,程序,结果) 得分(1)开发环境:vs2010(2)输入:在运行打开的软件下(win32格式),输入相应的代码(即要进行词法分析的字符串)(比如:int a;)(3)输出:在输入字符串后,按回车键后,既可以得到相应的词法分析的结果(比如:int a 的输入对应的输出如下:int a;首先对于词法分析打印出:Int --- key //关键字A ---str //字符串; ---bor //边界符号对于语法分析:Accept //编译语句分析成功对于输入字符串的语义分析和中间代码的生成如下中间代码:)(4)在相应的运行程序的文件夹中生成一个txt文件,用来存储生成的Token 链表(5)系统功能:(2) 开发平台(操作系统、设计语言):1、操作系统:windows 72、设计语言:c++3、编译器:vs2010(3) 设计方案;1) 主数据流图开始词法分析Token表的生成及修改语法分析修改token表语义分析语句是否为变量声明对语句按照文法的action表进行归约加一个四元式结点向下进行语义分析生成中间代码结束2) 主要数据结构:符号表、TOKEN串表等。

实验 6 简单中间代码生成

实验 6 简单中间代码生成1、实验目的:综合运用所学知识,集成词法分析、符号表管理等程序的成果,在语法分析和文法属性计算的基础上,完成中间代码的生成工作。

让学生全面了解一个编译器工作的全过程,真正全面掌握编译的思想和方法。

2、实验的基本原理对于一个给定文法,通过改写文法,使其满足LR(1)文法的要求,根据语义确定文法符号的属性,确定语义规则或翻译方案;根据文法特点构造LR(1)分析表,进而构造语法分析和属性计算程序。

分析程序在分析表的驱动下,完成对给定的句子进行语法分析和属性计算工作,最后生成三地址中间代码序列。

3、实验内容及要求a.实验所用文法如下。

statmt → id = expexp → exp addop term | termaddop →+ | -term→ term mulop factor | factormulop → * | /factor → ( exp ) | id | num其中id和num为实验二中定义的标识符和常数,因此这里还需要一个小的词法分析器来得到id和num。

b.构造文法LR(1)项目集,构造ACTION和GOTO矩阵,确认文法满足LR(1)文法要求。

c.按一般高级语言赋值语句的计算要求定义文法的属性和语义规则,属性计算的结果是将给定赋值语句翻译成三地址代码序列,并输出此序列。

d.从数据文件中读出赋值语句,并对其进行语法分析,对合法语句,输出其翻译结果。

e.实验数据文件中应该有多个语句,可能有正确的也应该有错误的语句;语句中的表达式有形式简单的也应该有复杂的。

每个表达式写在一行,以$结束。

4、实验步骤准备好用于实验的赋值语句序列,并存储在文件中。

a.编写单词分析子程序,能从源程序中分离出单词(包括标识符和常数);词法分析器以子程序形式出现,当需要进行词法分析时进行调用;b.构造分析表,确认上述文法为LR(1)文法,定义属性和语义规则。

c.确定临时变量生成方案,构造其生成程序。

中间代码生成具体实验过程含代码

实验三中间代码生成学号:;姓名:马小军实验目的1.了解并掌握中间代码的生成过程和作用2.了解并掌握四元式3.体会属性文法在中间代码生成过程中的作用。

实验环境Windows7操作系统vs2010编程环境实验内容从文件中读入表达式,输出其四元式的结果序列本程序只能生成赋值语句及算数表达式中间代码的四元式不能生成逻辑表达式及其他复杂语句中间代码的四元式实验原理三、以逆波兰式为例的实验设计思想及算法(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。

(2)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符数字,则分析到该数字串的结束并将该数字存入数组。

(3)如果不是数字,该字符则是运算符,此时需比较优先关系。

做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。

如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。

倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。

(4)重复上述操作(2)-(3)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为四元式。

下面给出算法流程图实验步骤打开并运行软件根据提示输入要分析的源程序(文件目录下有写好的文件源文件1.txt输入即可)运行输出结果例如将以下源文件放入test.txt运行结果a:=b*c+b*d思考同样的思路对算法进行适当改动就可以生成其它形式的中间代码【其他部分】设计原理和算法思想参考《程序设计语言编译原理》第三版国防工业出版社作者陈火旺等附录代码#include<stdlib.h>#include<fstream>#include<iostream>#include<stdio.h>using namespace std;#define MAX 100int m=0,sum=0;//sum用®?于®¨²计?算?运?算?符¤?的Ì?个?数ºy//m用®?于®¨²标À¨º记?输º?入¨?表À¨ª达ä?式º?中D字Á?符¤?的Ì?个?数ºychar JG='A';char str[MAX];//用®?于®¨²存ä?输º?入¨?表À¨ª达ä?式º?int token=0;//左Á¨®括¤¡§号?的Ì?标À¨º志?/***********用®?于®¨²更¨¹改?计?算?后¨®数ºy组Á¨¦中D的Ì?值¦Ì**************/void change(int e){int f=e+2;char ch=str[f];if(ch>='A'&&ch<='Z'){for(int l=0;l<m+10;l++){if(str[l]==ch)str[l]=JG;}}if(str[e]>='A'&&str[e]<='Z'){for(int i=0;i<m;i++){if(str[i]==str[e])str[i]=JG;}}}void chengchuchuli(int i,int m){i++;for( ;i<=m-1;i++)//处ä|理¤¨ª乘?除y运?算?{if(str[i]=='*'||str[i]=='/'){cout<<"("<<str[i]<<" "<<str[i-1]<<" "<<str[i+1]<<" "<<JG<<")"<<endl;change(i-1);str[i-1]=str[i]=str[i+1]=JG;sum--;JG=(char)(int)JG++;}}}void jiajianchuli(int j,int m){j++;for( ;j<=m-1;j++)//处ä|理¤¨ª加¨®减?运?算?{if(str[j]=='+'||str[j]=='-'){cout<<"("<<str[j]<<" "<<str[j-1]<<" "<<str[j+1]<<" "<<JG<<")"<<endl;change(j-1);str[j-1]=str[j]=str[j+1]=JG;sum--;JG=(char)(int)JG++;}}}/*扫¦¡§描¨¨一°?遍À¨¦从䨮文?件t中D读¨¢入¨?表À¨ª达ä?式º?*/void scan(FILE *fin){int p[MAX];char ch='a';int c=-1,q=0;while(ch!=EOF){ch=getc(fin);while(ch==' '||ch=='\n'||ch=='\t') ch=getc(fin);//消?除y空?格?和¨ª换?行D 符¤?str[m++]=ch;if(ch=='='||ch=='+'||ch=='-'||ch=='*'||ch=='/') sum++;else if(ch=='('){p[++c]=m-1;}else if(ch==')'){q=m-1;chengchuchuli(p[c],q);//从䨮左Á¨®括¤¡§号?处ä|理¤¨ª到Ì?又®?括¤¡§号?jiajianchuli(p[c],q);JG=(char)(int)JG--;str[p[c]]=str[m-1]=JG;c--;JG=(char)(int)JG++;}}}void sanyuanshi(){for(int i=0;i<=m-1;i++)//处ä|理¤¨ª乘?除y运?算?{if(str[i]=='*'||str[i]=='/'){cout<<"("<<str[i]<<" "<<str[i-1]<<" "<<str[i+1]<<" "<<JG<<")"<<endl;change(i-1);str[i-1]=str[i]=str[i+1]=JG;sum--;JG=(char)(int)JG++;}}for(int j=0;j<=m-1;j++)//处ä|理¤¨ª加¨®减?运?算?{if(str[j]=='+'||str[j]=='-'){cout<<"("<<str[j]<<" "<<str[j-1]<<" "<<str[j+1]<<" "<<JG<<")"<<endl;change(j-1);str[j-1]=str[j]=str[j+1]=JG;sum--;JG=(char)(int)JG++;}}for(int k=0;k<=m-1;k++)//处ä|理¤¨ª赋3值¦Ì运?算?{if(str[k]=='='){JG=(char)(int)--JG;cout<<"("<<str[k]<<" "<<str[k+1]<<" "<<" "<<" "<<str[k-1]<<")"<<endl;sum--;change(k+1);str[k-1]=JG;}}}void main(){char in[MAX]; //用®?于®¨²接¨®收º?输º?入¨?输º?出?文?件t名?FILE *fin; //用®?于®¨²指?向¨°输º?入¨?输º?出?文?件t的Ì?指?针?cout<<"请?输º?入¨?源¡ä文?件t名?(ê¡§包㨹括¤¡§后¨®缀Áo名?)ê?"<<endl;// scanf("%s",in);cin>>in;;if ((fin=fopen(in,"r"))==NULL) //判D断?输º?入¨?文?件t名?是º?否¤?正y确¨¡¤{cout<<"打䨰开a词䨺法¤¡§分¤?析?输º?入¨?文?件t出?错䨪!"<<endl;}cout<<"*********三¨y元a式º?如¨?下?:êo*********"<<endl;scan(fin);//调Ì¡Â用®?函¡¥数ºy从䨮文?件t中D读¨¢入¨?表À¨ª达ä?式º?sanyuanshi();if(sum==0) printf("成¨¦功|!ê?");else printf("有®D错䨪误¨®!ê?");//关?闭À?文?件tfclose(fin);system("pause");}。

(精品)编译方法实验报告(中间代码生成器的设计)

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

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

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

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

三、实验原理及基本步骤
●算术表达式文法:
G(E): E →E ω0 T | T
T →T ω1 F | F
F → i | (E)
●文法变换:
G’(E) E →T {ω0 T}
T →F {ω1 F}
F → i | (E)
●属性翻译文法:
E →T {ω0“push(SYN,w)” T “QUAT”}
T →F {ω1“push(SYN, w)” F “QUAT”}
F →i “push(SEM, entry(w))” | (E)
其中:
push(SYN, w) —当前单词w入算符栈SYN;
push(SEM, entry(w)) —当前w在符号表中的入口值压入语义栈SEM;
QUAT —生成四元式函数
i.T = newtemp;
ii.QT[j] =( SYN[k], SEM[s-1], SEM[s], T); j++;
iii.pop( SYN, _ ); pop( SEM, _ ); pop( SEM, _ );
push( SEM, T );
●递归下降子程序:
数据结构:SYN —算符栈;
SEM —语义栈;。

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

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

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

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

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

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

二、实验方法实验程序由c语言完成,在Turboc 2.0环境中调试通过。

语义分析程序的基本做法是对文法中的每个产生式分别编写一个语义分析子程序,当程序语法部分进行推倒或规约时,就分别调用各自的语义分析程序。

当语法分析结束时,语义分析也就结束了。

在本实验程序中,当语法分析部分识别出语法正确的句子时,就进入content函数(当语法分析识别出不正确的句子时,不进入content函数,也就是不进行语义分析),然后根据句子的类型进行分类,进入不同的语义处理部分。

对于赋值语句,关键是产生正确的处理算术表达式E的四元式。

程序中的ec函数的功能就是产生算术表达式的四元式,在ec函数中使用了两个栈idshed,opshed,分别是算术表达式的数据栈和符号栈。

每次提取一个数字和一个算符,然后将算符与与栈顶算符进行优先级比较,优先级高则将单前数字和算符进栈,低或者相等的话则将当前栈顶元素进行合并,产生四元式。

直至整个算术表达式结束。

其中还有一些细节问题,具体的做法可以参看程序。

对于实验给定的if语句的文法格式,条件判断式C只中可能是>或者通过ec函数可以产生条件判断式C中的E的四元式,然后只要加上转向四元式就可以了。

本实验程序中只给出真出口的转向四元式,没有给出假出口的转向四元式,这在实际中是不可以的,但在本实验中,实际上是对每条独立的语句进行语法分析,给出假出口转向四元式实际上意义不大,而且假出口转向语句的转移目标必须要到整个语句分析结束以后才可以知道,这样就要建立栈,然后回填,这样会使程序复杂很多,所以没有加上假出口转向四元式。

对于while语句,具体的做法和if语句差不多,所不同的是当while语句结束时,要多出一条无条件转向四元式,重新转到条件判断式C的第一条四元式。

当要产生无条件转向四元式时,它的转向目标C的第一条四元式已经产生了,所以具体的做起来是不太困难的。

只要记下当前while中的C的第一条四元式的位置,填上就可以了。

整个程序的结束是当读入“ . ”时,程序就中止。

程序中还有很多细节问题,具体的可以后面的附录:程序的完整代码。

三、测试程序ff:=6+6*6-;if sl>89+56*67then f:=7*7+4;ff:=6+6*6-6%4+8;if sl+78*76>89*56+67then while a-7>98+45*45 do f:=7*7+4;.四、运行结果首先对测试程序进行语法分析,识别出正确的句子,当识别出正确的句子时,就对当前句子进行语义分析,而语法不正确的句子不进行语义分析。

ff:=6+6*6-Error(4):Except ID or NUM ; Error(2):Syntax errorif sl>89+56*67thenf:=7*7+4; success!!!(1)[ *, 56, 67, T1 ](2)[ +, 89, T1, T2 ](3)[j>, sl, T2, (4) ](4)[ *, 7, 7, T3 ](5)[ +, T3, 4, T4 ](6)[ :=, T4, -, f ]ff:=6+6*6-6%4+8; success!!!(7)[ *, 6, 6, T5 ](8)[ +, 6, T5, T6 ](9)[ %, 6, 4, T7 ](10)[ -, T6, T7, T8 ](11)[ +, T8, 8, T9 ](12)[ :=, T9, -, ff ]if sl+78*76>89*56+67thenwhile a-7>98+45*45dof:=7*7+4; success!!!(13)[ *, 78, 76, T10 ](14)[ +, sl,T10, T11 ](15)[ *, 89, 56, T12 ](16)[ +,T12, 67, T13 ](17)[j>, T11, T13, (18) ](18)[ -, a, 7, T14 ](19)[ *, 45, 45, T15 ](20)[ +, 98,T15, T16 ](21)[j>, T14, T16, (22) ](22)[ *, 7, 7, T17 ](23)[ +,T17, 4, T18 ](24)[ :=, T18, -, f ](25)[j, _, _,(18)].Error(2):Syntax error五、实验小结终于完成了编译原理的三次实验,这几次实验使我们更彻底地巩固了编译原理。

相关文档
最新文档