编译原理课程设计报告(一个完整的编译器)

合集下载

编译原理课程设计报告

编译原理课程设计报告

《编译原理》课程设计报告一、课程设计目的通过课程设计进一步理解高级语言在计算机中的执行过程,了解现代编译器的运作机制,加深对编译原理中重点算法和编译技术的理解,提高自己自学和理解的能力。

学会如何利用已有软件JFLex、Java_cup对词法分析器及语法分析器的构造。

二、设计概述本tiger语言编译器的编译过程涉及到编译五个阶段中的二个,即词法分析器、语法分析器。

其中语法分析后还完成了语法树的打印的构造以及类型检查。

词法分析器由JFLex编译正则式生成,词法分析器编译产生式生成,语法分析器由CUP生成。

结果通过GUI界面呈现在使用者面前。

编译程序需要在单词级别上来分析和翻译源程序,所以首先要识别出单词,而词法分析部分的任务是:从左至右扫描源程序的字符串,按照词法规则(正则文法规则)识别出一个个正确的单词,并转换成该单词相应的二元式(种别码、属性值)交给语法分析使用。

因此,词法分析是编译的基础。

执行词法分析的程序称为词法分析器。

语法分析是编译程序的核心部分,其主要任务是确定语法结构,检查语法错误,报告错误的性质和位置,并进行适当的纠错工作。

三、设计过程(一)设计构思程序主要完成三大功能模块:词法分析器、语法分析器、GUI人机交互界面。

词法分析器由JFLex编译正则式生成,其中必须为外界提供一个获取记号流的接口,实验中定为java_cup.runtime.Symbol next_token。

语法分析器是建立在词法分析器上的,故必须包含词法分析器以便获得记号流,next_token为语法分析器提供TOKEN,语法分析器的对外接口是:java_cup.runtime.Symbol debug_parse(),同时返回语法树的根节点。

GUI 界面是提供人机交互的,它能够依次显示词法分析阶段分析得到的所有TOKEN 的信息,语法阶段生成的语法树,另外对于词法和语法阶段出现的错误在“错误提示”文本框中一一列举出来,提供用户改进代码的信息。

编译原理课程设计报告

编译原理课程设计报告

实验要求✧基本内容1)增加单词:保留字ELSE,REPEAT,DOWHILE,RETURN运算符+=,-=,++,--2)修改单词:不等号# 改为<>3)增加条件语句的ELSE子句4)扩充赋值运算:+= 和-=5)扩充语句(Pascal的FOR语句):①FOR <变量>:=<表达式> TO <表达式> DO <语句>②FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句>其中,语句①的循环变量的步长为2,语句②的循环变量的步长为-2。

✧选做内容1)增加运算:++ 和--。

2)增加类型:①字符类型;②实数类型。

3)扩充函数:①有返回值和返回语句;②有参数函数。

4)增加一维数组类型(可增加指令)。

5)其他典型语言设施。

设计方案1.概述:源、目标语言:编译程序编绎的源程序是PL0,程序产生的目标代码是一个假想栈式计算机的汇编语言.称为类PCODE指令代码 ,指令格式格式如下:F L A其中F代表功能码,L表示层次差,A表示位移量,不同指令其含义有所区别。

PL/0语言是Pascal语言的一个子集,这里分析的PL/0的编译程序包括了对PL/0语言源程序进行分析处理、编译生成类PCODE代码,并在虚拟机上解释运行生成的类PCODE代码的功能。

PL/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。

词法分析和代码生成作为独立的子程序供语法分析程序调用。

语法分析的同时,提供了出错报告和出错恢复的功能。

在源程序没有错误编译通过的情况下,调用类PCODE解释程序解释执行生成的类PCODE代码。

实现工具(平台),运行平台:编译器实现工具和运行平台程序用C++语言编写,在C++ Builder平台下运行。

2.结构设计说明:PL/0的编译过程采用一趟扫描方式,以语法分析为核心,词法分析程序和代码生成程序都作为一个独立的过程,当语法分析需要读入单词时就调用词法分析程序,而当语法分析正确需生成相应的目标代码时,则调用代码生成程序。

编译原理编译器课程设计

编译原理编译器课程设计

编译原理编译器课程设计一、课程目标知识目标:1. 理解编译原理的基本概念,掌握编译器各阶段的工作原理和实现方法;2. 学会使用一种编程语言(如C、Java等)编写简单的编译器程序;3. 掌握词法分析、语法分析、语义分析及目标代码生成的基本技术和策略;4. 了解优化技术在编译器中的应用,提高程序运行效率。

技能目标:1. 能够运用所学知识独立设计并实现一个简单的编译器;2. 培养学生运用编译原理知识解决实际问题的能力;3. 提高学生的编程实践能力和团队协作能力;4. 培养学生查阅资料、分析问题、总结归纳的能力。

情感态度价值观目标:1. 培养学生对编译原理和编译器开发工作的兴趣,激发学生的学习热情;2. 培养学生勇于探索、积极创新的精神,增强克服困难的信心和毅力;3. 培养学生具备良好的编程习惯,遵循职业道德,为我国软件产业的发展贡献自己的力量。

本课程旨在通过编译原理编译器课程设计,使学生掌握编译器的基本原理和技术,提高编程实践能力,培养团队协作精神,激发学生的学习兴趣和创新精神。

课程性质为理论与实践相结合,注重培养学生的实际操作能力。

针对学生的年级特点,课程内容将逐步深入,从基本概念到实际应用,引导学生由浅入深地掌握编译器相关知识。

在教学过程中,教师需关注学生的学习进度,及时调整教学策略,确保课程目标的实现。

通过本课程的学习,学生将具备独立设计和实现简单编译器的能力,为后续相关课程的学习打下坚实基础。

二、教学内容1. 编译原理概述:介绍编译器的基本概念、发展阶段和组成部分,使学生了解编译器在整个软件开发过程中的地位和作用。

教材章节:第一章2. 词法分析:讲解词法分析器的功能、设计方法,以及正则表达式和有限自动机等基本概念。

教材章节:第二章3. 语法分析:介绍语法分析器的作用、设计方法,以及上下文无关文法、LL(1)、LR(1)等分析方法。

教材章节:第三章4. 语义分析:讲解语义分析器的任务、属性文法、语法制导翻译等概念,以及类型检查和符号表管理方法。

编译原理课程设计报告报告

编译原理课程设计报告报告

编译原理课程设计报告一、目的与要求目的:在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。

达到进一步了解程序编译过程的基本原理和基本实现方法的目的。

要求:对PL/0作以下修改扩充:基本内容(成绩范围:“中”、“及格”或“不及格”)(1)扩充赋值运算:+= 和-=(2)扩充语句REPEAT<语句序列>UNTIL <条件>其中,<条件>是循环条件,即条件不成立时,重复执行循环体的< 语句序列>;条件成立时,循环结束。

选做内容(成绩评定范围扩大到:“优”和“良”)(1)增加运算:++ 和--。

(2)增加类型:①字符类型;②实数类型。

(3)扩充函数:①有返回值和返回语句;②有参数函数。

(4)增加一维数组类型(可增加指令)。

(5)其他典型语言设施。

二、实验环境与工具(1)计算机及操作系统:PC机,WindowsXP(2)程序设计语言:C(3)教学型编译程序:PL/0三、设计方案(1)概述:源、目标语言,实现工具(平台),运行平台源语言: PL/0目标语言: 目标代码(生成的文件后缀为*.COD)实现平台: VC++ 6.0运行平台: WindowsXP(2)结构设计说明:各功能模块描述Error()出错处理,打印出错位置和错误编码GetCh()漏掉空格,读取一个字符GetSym()词法分析,读取一个单词GEN()目标代码生成过程,本过程用于把生成的目标代码写入目标代码数组,供后面的解释器解释执行TEST()测试当前单词是否合法过程testENTER()登陆符号表过程enterPOSITION() 在符号表中查找指定符号所在位置的函数position,如果找不到就返回0V ARDECLARATION()变量声明LISTCODE()列出目标代码清单;FACTOR()因子处理过程factorTERM()项处理过程term;EXPRESSION()表达式处理过程CONDITION()条件处理过程STATEMENT()语句处理过程BLOCK()语法分析过程BASE(): 通过静态链求出数据区基地址的函数,INTERPRET ():对目标代码解释运行过程(3)主要成分描述①符号表struct tablestruct{char name[al]; /* 名字*/enum object kind; /* 类型:const ,var ,procedure*/int val; /* 数值,仅const 使用*/int level; /* 所处层,仅const 不使用*/int adr; /* 地址,仅const 不使用*/Int size; /* 需要分配的数据区空间*/};struct tablestruct table[txmax]; /* 名字表*/②运行时存储组织和管理由于编译时目标程序运行的数据空间大小已经规定,所以存储组织属于静态存储。

编译器_编译原理课程设计报告书

编译器_编译原理课程设计报告书

广西大学编译原理课程设计专业:计算机科学与技术姓名:课程:编译原理指导教师:目录一.程序简介与分析---------------------------------------------------------1 二.程序适用围-----------------------------------------------------------1 三.词法分析---------------------------------------------------------------1 四.语法分析---------------------------------------------------------------3 五.语义分析和中间代码生成------------------------------------------------9 六.代码生成--------------------------------------------------------------11 七.流程图----------------------------------------------------------------12 八.实现------------------------------------------------------------------13 九.程序运行结果----------------------------------------------------------13 十.总结------------------------------------------------------------------18 十一.附录(源程序)--------------------------------------------------------19简单的编译程序设计一.程序简介与分析本程序由四个部分组成:词法分析子程序,语法分析子程序,语义分析子程序,目标代码生成程序。

《编译原理》设计方案报告

《编译原理》设计方案报告

《编译原理》课程设计报告设计题目:pl0编译器设计一、PL0程序的文法及,指令及属性翻译简化c语言文法定义(LL(1)文法)C程序::=void main(){函数体}函数体::=变量定义部分语句列变量定义部分::=变量定义变量定义部分| ɛ变量定义::=int 变量表变量表::=标识符|标识符,变量表语句列::=语句语句列| ɛ语句::=条件语句| 循环语句| 读语句| 写语句| 复合语句| 表达式语句| 空语句条件语句::=if(表达式)语句循环语句::=while(表达式)语句读语句::=read(变量表);写语句::=write(表达式表);复合语句::={语句列};表达式语句::=表达式;空语句::=;表达式定义(算符优先文法)表达式::=变量=表达式| 变量+=表达式| 变量-=表达式| 变量*=表达式| 变量/=表达式| 变量%=表达式| 表达式1表达式1::=表达式1 || 表达式2 | 表达式2表达式2::=表达式2&&表达式3 | 表达式3表达式3::=表达式3==表达式4 | 表达式3!=表达式4 | 表达式3>=表达式4 | 表达式3>表达式4 | 表达式3<=表达式4 | 表达式3<表达式4 | 表达式4表达式4::=表达式4+表达式5 | 表达式4-表达式5 | 表达式5表达式5::=表达式5*表达式6 | 表达式5/表达式6 |表达式5/表达式6 |表达式6表达式6::=!表达式7表达式7::=(表达式) | 变量| 常量PL0文法定义《程序》::=《分程序》.《分程序》::=《常量定义》;《常后分程序》|《常后分程序》《常后分程序》::=《变量定义》;《变后分程序》|《变后分程序》《变后分程序》::=《过程定义》;《变后分程序》|《语句》《常量定义》::=const 《常量定义表》《常量定义表》::=id = number | id = number,《常量定义表》《变量定义》::= var 《变量表》《变量表》::=id | id,《变量表》《过程定义》::=procedure id ;《分程序》《语句》::=《赋值语句》|《条件语句》|《循环语句》|《读语句》|《写语名》|《复合语句》| 《过程调用语句》|ε《赋值语句》::=id := 《表达式》《读语句》::=read(《变量表》)《写语句》::=write(《表达式表》)《表达式表》::=《表达式》| 《表达式》,《表达式表》《条件语句》::=if 《条件表达式》then 《语句》《循环语句》::=while 《条件表达式》do 《语句》《复合语句》::=begin 《语句列》end《过程调用语句》::=call id《参量表》::=《有参表》|ε《有参表》::=《表达式》,《有参表》|《表达式》《表达式》::=+《表达式1》|-《表达式1》|《表达式1》《表达式1》::=《表达式1》+《表达式2》|《表达式1》-《表达式2》|《表达式2》《表达式2》::=《表达式2》*《表达式3》|《表达式2》/《表达式3》| 《表达式2》mod 《表达式3》|《表达式3》《表达式3》::=id | number | (《表达式》)《条件表达式》::=《条件表达式》or 《条件表达式1》|《条件表达式1》《条件表达式1》::=《条件表达式1》and 《条件表达式2》| 《条件表达式2》《条件表达式2》::=not 《条件表达式3》|《条件表达式3》《条件表达式3》::=(《条件表达式》)|《关系表达式》《关系表达式》::=《表达式》>《表达式》《关系表达式》::=《表达式》>=《表达式》《关系表达式》::=《表达式》<《表达式》《关系表达式》::=《表达式》<=《表达式》《关系表达式》::=《表达式》=《表达式》《关系表达式》::=《表达式》#《表达式》PL0栈式机指令指令格式:指令码(f) 所在层数差(l),操作数(a)PL0栈式机指令:LIT:将常数a取到栈顶LOD:将位于(当前层-l)层处的变量a取到栈顶STO:将栈顶处值存储到指定位置,l,a同上CALL 调用当前-l层处的过程aINT:为调用过程在栈中开辟数据区,a为单元个数JMP:无条件转移指令,a目标地址JPC:条件转移指令,栈顶值的布尔值为非真时转移到a处,否则执行下面语句OPR:关系运算或算术运算PL0属性翻译MCONST(const:常量定义开始), V AR(var:变量定义开始), PROCEDURE(procedure:过程定义开始),CALL(call:过程调用语句),BEGIN(begon:复合语句开始),END(end:复合语句结束),IF(if:条件语句开始),THEN(then:条件结束),WHILE(while:循环语句开始), DO(do:循环条件结束), READ(read:读语句),WRITE(write:输出语句), ODD(odd:判奇运算),//分隔符、运算符号DOT(点:.),COMMA(逗号:,), SEMICOLON(分号:;), LPAREN(左括号:(), RPAREN(右括号:)), ASSIGNOP(赋值::=), PLUSOP(加法运算符号:+), MINUSOP(减法运算符:-), MULTOP(乘法运算符:*), DIVOP(除法运算符:/),GT(大于:>),GE(大于等于:>=),LT(小于:<),LE(小于等于:<=),EQ(等于:=),NE(不等:#),ENDF(输入结束符),//分析过程中需要的非终结符号SERVERKEY(保留字), FACTOR(因子),ROP(关系运算), CONSTANT(常量部份定义), V ARIABLE(变量部份定义), IDENT(自定义标识符), NUMBER(常数)二、符号表的结构,组织,填写及查找1、符号表结构const char *pName; //符号名称int kind; //符号类别,由上面单词分类确定int val; //符号表中的位置值int level; //符号的层数int parent; //符号的作用域int size; //过程长度char strBuff[MAXLENSTR]; //符号堆2、符号表的组织符号表的组织方式有:线性表、散列表、树结构等,其必须维持源程序中的作用域信息。

计算机编译原理课程设计报告编译器

计算机编译原理课程设计报告编译器

《编译技术》课程设计实验报告实验名称:编译器程序姓名:学号:班级:年月日一、课设要求模仿上学期给定的程序,根据下面具体的内容,用C++语言对下述文法和单词表定义的语言设计编制一个编译器。

设计报告格式撰写报告(1)单词符号及种别表(2)语法结构定义<程序> ::= main()<语句块><语句块> ::= ‘{‘<语句串>’}’ //程序用括号括起来<语句串>::=<语句>{;<语句>};<语句>::=<赋值语句>|<条件语句>|<循环语句><赋值语句>::=ID=<表达式> //赋值语句用”=”号<条件语句>::=if<条件><语句块><循环语句>::=do <语句块>while <条件><条件>::=<表达式><关系运算符><表达式><表达式> ::= <项>{+<项>|-<项>}<项> ::= <因子>{*<因子>|/<因子>}<因子> ::=ID|num|(<表达式>)num::=( +|-|ε ) 数字*(.数字数字* | ε)( e ( +|-|ε ) 数字数字*|ε) ID::=字母(字母|d数字)*字母::=a|b|c…|z|A|B|C…|Z数字::=0|1|2…|9<关系运算符> ::= <|<=|>|>=|==|!=二、总体设计思想采用递归下降(自上而下)的语法制导翻译法。

三、详细算法设计词法分析程序→语法分析程序→语义分析程序→编译器。

不断完善,不断改进。

编译原理课程设计报告

编译原理课程设计报告

实验1:用Lex设计词法分析器1实验目的:学会用lex设计一个词法分析器。

实验内容:使用lex为下述文法语言写一个词法分析器。

实验要求:输入为用该语言所写的源程序文件;输出为记号序列,每个记号显示为二元组(记号名,记号属性值)的形式。

输出可以在屏幕上,也可以输出到文件中。

不要求建立符号表。

在cygwin下用flex和gcc工具将实验调试通过,并能通过例子parser0中testcases 目录下的测试例的测试。

实验参考:和。

语言文法:<程序> PROGRAM <标识符> ; <分程序><分程序> <变量说明> BEGIN <语句表> END.<变量说明> VAR <变量说明表>;<变量说明表><变量表>: <类型> | <变量表>: <类型>; <变量说明表><类型> INTEGER | REAL<变量表> <变量> | <变量>, <变量表><语句表> <语句> | <语句>; <语句表><语句> <赋值语句> | <条件语句> | <WHILE语句> | <复合语句><赋值语句><变量> := <算术表达式><条件语句> IF <关系表达式> THEN <语句> ELSE <语句><WHILE语句> WHILE <关系表达式> DO <语句><复合语句> BEGIN <语句表> END<算术表达式> <项> | <算术表达式> + <项> | <算术表达式> - <项><项> <因式> | <项> * <因式> | <项> / <因式><因式> <变量> | <常数> | (<算术表达式>)<关系表达式> <算术表达式> <关系符> <算术表达式><变量> <标识符><标识符> <标识符><字母> | <标识符><数字> | <字母><常数> <整数> | <浮点数><整数> <数字> | <数字> <整数><浮点数> .<整数> | <整数>.<整数><关系符> < | <= | = | > | >=| <><字母> A | B | …| X | Y | Z | a | b | …| x | y | z<数字>0|1|2|…|9程序代码:%{#include <>#define LT 1#define LE 2#define GT 3#define GE 4#define EQ 5#define NE 6#define PROGRAM 7#define END 13#define VAR 9#define IF 10#define THEN 11#define ELSE 12#define WHILE 18#define DO 19#define ID 20#define NUMBER 21#define RELOP 22#define NEWLINE 23#define ERRORCHAR 24%}delim [ \t \n]ws {delim}+letter [A-Za-z]digit [0-9]id _|{letter}({letter}|{digit})*number {digit}+(\.{digit}+)?(E[+-]?{digit}+)?int1 {digit}|{digit}{int1}*/%s COMMENT%%<INITIAL>"/*" {BEGIN COMMENT;ECHO;} <COMMENT>"*/" {BEGIN INITIAL;ECHO;} <COMMENT>.|\n {ECHO;}/* ECHO是一个宏,相当于 fprintf(yyout, "%s", yytext)*/ <INITIAL>{ws} {;}<INITIAL>while {return (WHILE);}<INITIAL>do {return (DO);}<INITIAL>PROGRAM {return (PROGRAM);}<INITIAL>end {return (END);}<INITIAL>VAR {return (VAR);}<INITIAL>if {return (IF);}<INITIAL>then {return (THEN);}<INITIAL>else {return (ELSE);}<INITIAL>{id} {return (ID);}<INITIAL>{number} {return (NUMBER);}<INITIAL>"<" {return (RELOP);}<INITIAL>"<=" {return (RELOP);}<INITIAL>"=" {return (RELOP);}<INITIAL>"<>" {return (RELOP);}<INITIAL>">" {return (RELOP);}<INITIAL>">=" {return (RELOP);}<INITIAL>"+" {return (RELOP);}<INITIAL>"-" {return (RELOP);}<INITIAL>"*" {return (RELOP);}<INITIAL>"/" {return (RELOP);}<INITIAL>":=" {return (RELOP);}<INITIAL>";" {return (RELOP);}<INITIAL>"." {return (RELOP);}<INITIAL>"," {return (RELOP);}<INITIAL>. {return ERRORCHAR;}%%int yywrap (){return 1;}void writeout(int c){switch(c){case ERRORCHAR: fprintf(yyout, "(ERRORCHAR, \"%s\") ", yytext);break;case RELOP: fprintf(yyout, "(RELOP, \"%s\") ", yytext);break;case WHILE: fprintf(yyout, "(WHILE, \"%s\") ", yytext);break;case DO: fprintf(yyout, "(DO, \"%s\") ", yytext);break;case NUMBER: fprintf(yyout, "(NUM, \"%s\") ", yytext);break;case ID: fprintf(yyout, "(ID, \"%s\") ", yytext);break;case NEWLINE: fprintf(yyout, "\n");break;case PROGRAM: fprintf(yyout, "(PROGRAM, \"%s\") ", yytext);break;case END: fprintf(yyout, "(END, \"%s\") ", yytext);break;case VAR: fprintf(yyout, "(VAR, \"%s\") ", yytext);break;case IF: fprintf(yyout, "(IF, \"%s\") ", yytext);break;case THEN: fprintf(yyout, "(THEN, \"%s\") ", yytext);break;case ELSE: fprintf(yyout, "(ELSE, \"%s\") ", yytext);break;default:break;}return;}int main (int argc, char ** argv){int c,j=0;if (argc>=2){if ((yyin = fopen(argv[1], "r")) == NULL){printf("Can't open file %s\n", argv[1]);return 1;}if (argc>=3){yyout=fopen(argv[2], "w");}}while (c = yylex()){writeout(c);j++;if (j%5 == 0) writeout(NEWLINE);}if(argc>=2){fclose(yyin);if (argc>=3) fclose(yyout);}return 0;}测试文件为:PROGRAM test;VAR i, j, k: INTEGER;f0: REAL;BEGINi := 1;j := 1;k := 0;f0 := ;WHILE k<=100 DOBEGINIF j <20 THENBEGINj := i;k := k+1;f0 := f0*ENDELSEBEGINj := k;k := k-2;f0 := f0/.2ENDENDEND.运行结果:实验2:用Lex设计词法分析器2实验目的:学会用lex设计一个词法分析器,并考虑其与后续语法分析器的链接问题。

编译原理课程设计报告毕业论文

编译原理课程设计报告毕业论文

编译原理课程设计报告一、课程设计目的通过课程设计,可以进一步了解高级语言在计算机中的执行过程,了解现代编译器的运行机制,加深对编译原理中关键算法和编译技术的理解,提高自学和理解能力。

了解如何利用现有软件JFLex和Java_cup构造词法分析器和解析器。

二、设计概述这个tiger语言编译器的编译过程涉及到编译五个阶段中的两个,即词法分析器和语法分析器。

其中,解析后完成语法树打印的构建,以检查类型。

词法分析器由JFLex 编译器正则公式生成,词法分析器由编译器产生式生成,解析器由CUP生成。

结果通过GUI界面呈现给用户。

编译器需要对源程序进行单词级的分析和翻译,所以首先要做的就是识别单词,而词法分析的任务就是从左到右扫描源程序的字符串,根据词法规则(常规语法规则)识别出正确的单词,并转换成单词对应的二进制形式(类别码,属性值)进行语法分析。

所以词法分析是编译的基础。

执行词法分析的程序叫做词法分析器。

语法分析是编译器的核心部分。

它的主要任务是确定语法结构,检查语法错误,报告错误的性质和位置,并进行适当的纠错。

三、设计程序(一)设计构思该程序主要完成三个功能模块:词法分析器、语法分析器和GUI人机界面。

词法分析器由JFLex编译正则公式生成,其中必须为外界提供一个获取令牌流的接口。

实验中命名为Java _ cup . runtime . symbol next _ token。

解析器是建立在词法分析器上的,所以它必须包含词法分析器来获取令牌流。

next_token为解析器提供了令牌。

解析器的对外接口是:Java _ cup . runtime . symbol debug _ parse(),它返回语法树的根节点。

GUI 提供人机交互。

它可以顺序显示词法分析阶段获得的所有标记信息和语法阶段生成的语法树。

此外,词法和语法阶段的错误会在“错误提示”文本框中列出,为用户提供改进代码的信息。

流程图:鲍·阿布辛Print.java//打印出语法树……//Tiger 的抽象语法类数据包错误消息ErrorMsg.java//用于生成包含详细信息的错误消息为cupparser 打包Java _ cup.runtime//support包解析Grm.java//解析分析器MainInterface.java//图形用户界面Sym.java//令牌的十进制表示Yylex.java//莱克斯分析器包装语义Entry.java//用于值环境中的绑定Env.java//保存一个值、类型环境和一个错误打印机ExpTy.java//持有翻译和类型检查的结果FunEntry.java//用于函数绑定程序输入流 词法分析程序 GUI 界面句法分析程序 代币 语法树 标记流 错误的语法和类词汇错误Semant.java//主类型检查模块VarEntry.java//用于变量绑定包装符号Symbol.java//使字符串成为独特的符号对象Table.java//用示波器做环境包翻译包类型//描述tiger _ languagetypes(二)词法分析程序这部分工作主要是通过正则表达式的编写,熟悉使用JFLex正确编写正则表达式,并生成相应的词法分析器。

《编译原理》设计方案报告

《编译原理》设计方案报告

《编译原理》设计方案报告一、项目概述二、课程目标本课程的主要目标是使学生能够掌握编译器的设计与实现原理,理解编译过程中的各个环节,以及掌握常见的编译器构建工具和技术。

具体目标如下:1.理解编译器的基本原理和工作流程;2.掌握常见的编译器构建工具和技术;3.能够独立设计和实现简单的编译器;4.培养学生的系统设计和问题解决能力。

三、课程内容本课程的主要内容包括:1.编译器的概念和基本原理;2.词法分析器和语法分析器的设计与实现;3.语义分析和中间代码生成;4.优化和目标代码生成;5.编译器构建工具和技术。

四、教学方法本课程采用以学生为中心的教学方法,主要包括以下几种教学手段:1.模块化教学:将课程内容分为多个模块,每个模块进行独立的教学和实践;2.理论与实践相结合:通过理论课、实验课等形式,使学生能够将理论知识应用到实际中;3.项目驱动教学:引入编译器设计与实现的实际项目,让学生能够在实践中巩固所学的知识;4.小组合作学习:将学生分成小组,进行协作学习,增强学生的团队合作能力。

五、评价方式为了评价学生对课程内容的掌握程度,本课程采用以下评价方式:1.平时成绩:包括课堂表现、作业和实验成绩等;2.项目成果:针对编译器设计与实现的项目,评价学生的项目成果和实现质量;3.期末考试:以闭卷考试形式对学生的总体掌握情况进行评价。

六、项目进度安排本课程的项目进度安排如下:1.第1-2周:介绍编译器的概念和基本原理;2.第3-6周:词法分析器和语法分析器的设计与实现;3.第7-9周:语义分析和中间代码生成;4.第10-12周:优化和目标代码生成;5.第13-14周:编译器构建工具和技术;6.第15-16周:项目演示和总结。

七、教学资源支持为了支持本课程的教学,我们将提供以下教学资源:1.教材:选用经典的编译原理教材,如《编译原理》(龙书)等;2.课件:编写详细的课件,包括理论知识和实践案例;3.实验指导:编写实验指导书,引导学生进行编译器设计与实现的实践;4. 实验环境:提供编译器构建工具和开发环境,如Lex/Flex、Yacc/Bison等。

编译课程设计报告

编译课程设计报告

编译课程设计报告一、教学目标本课程的教学目标是使学生掌握编译原理的基本概念、方法和算法,培养学生运用编译原理解决实际问题的能力。

具体目标如下:1.知识目标:(1)了解编译原理的基本概念,如编译器、源语言、目标语言等。

(2)掌握编译过程中的各个阶段,如词法分析、语法分析、语义分析、中间代码生成、目标代码生成等。

(3)熟悉常见编译优化技术,如代码简化、死代码消除、循环优化等。

(4)了解编译器实现的基本方法,如递归下降分析、LL分析、LR分析等。

2.技能目标:(1)能够使用编译原理相关工具,如lex、yacc等。

(2)具备简单的编译器设计与实现能力。

(3)能够分析程序的性能,并应用编译优化技术进行优化。

3.情感态度价值观目标:(1)培养学生对编译原理的兴趣,提高学生自主学习的积极性。

(2)培养学生团队合作精神,提高学生解决实际问题的能力。

二、教学内容本课程的教学内容主要包括以下几个部分:1.编译原理基本概念:介绍编译器、源语言、目标语言等基本概念。

2.编译过程及其各个阶段:讲解词法分析、语法分析、语义分析、中间代码生成、目标代码生成等阶段。

3.编译优化技术:介绍代码简化、死代码消除、循环优化等优化技术。

4.编译器实现方法:讲解递归下降分析、LL分析、LR分析等实现方法。

5.编译器工具使用:介绍lex、yacc等工具的使用方法。

6.编译器设计与实现:讲解编译器的设计与实现过程。

三、教学方法本课程采用讲授法、讨论法、案例分析法和实验法等多种教学方法,以激发学生的学习兴趣和主动性。

1.讲授法:用于讲解编译原理的基本概念、方法和算法。

2.讨论法:学生针对编译原理中的重点、难点问题进行讨论,提高学生的理解能力。

3.案例分析法:通过分析实际案例,使学生更好地掌握编译原理的应用。

4.实验法:让学生亲自动手实现简单的编译器,提高学生的实践能力。

四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备等。

1.教材:选用《编译原理》等权威教材,为学生提供系统、科学的学习资料。

编译原理实验报告

编译原理实验报告

编译原理实验报告一、实验目的编译原理是计算机科学中的重要课程,旨在让学生了解编译器的基本工作原理以及相关技术。

本次实验旨在通过设计和实现一个简单的编译器,来进一步加深对编译原理的理解,并掌握实际应用的能力。

二、实验环境本次实验使用了Java编程语言及相关工具。

在开始实验前,我们需要安装Java JDK并配置好运行环境。

三、实验内容及步骤1. 词法分析词法分析是编译器的第一步,它将源代码分割成一系列词法单元。

我们首先实现一个词法分析器,它能够将输入的源代码按照语法规则进行切割,并识别出关键字、标识符、数字、运算符等。

2. 语法分析语法分析是编译器的第二步,它将词法分析得到的词法单元序列转化为语法树。

我们使用自顶向下的LL(1)语法分析算法,根据文法规则递归地构建语法树。

3. 语义分析语义分析是编译器的第三步,它对语法树进行检查和转换。

我们主要进行类型检查、语法错误检查等。

如果源代码存在语义错误,编译器应该能够提供相应的错误提示。

4. 代码生成代码生成是编译器的最后一步,它将经过词法分析、语法分析和语义分析的源代码翻译为目标代码。

在本次实验中,我们将目标代码生成为Java字节码。

5. 测试与优化完成以上步骤后,我们需要对编译器进行测试,并进行优化。

通过多个测试用例的执行,我们可以验证编译器的正确性和性能。

四、实验心得通过完成这个编译器的实验,我收获了很多。

首先,我对编译原理的知识有了更深入的理解。

在实验过程中,我深入学习了词法分析、语法分析、语义分析和代码生成等关键技术,对编译器的工作原理有了更系统的了解。

其次,我提高了编程能力。

实现一个完整的编译器需要处理复杂的数据结构和算法,这对我的编程能力是一个很好的挑战。

通过实验,我学会了合理地组织代码,优化算法,并注意到细节对程序性能的影响。

最后,我锻炼了解决问题的能力。

在实验过程中,我遇到了很多困难和挑战,但我不断地调试和改进代码,最终成功地实现了编译器。

编译原理课设实验报告

编译原理课设实验报告

《编译技术》课程设计报告实验名称编译器设计学号班级本课设的任务是达成一个完好的编译器,办理用户提交的切合所定文法的源程序代码,生成四元式中间代码,从而翻译成等价的X86 平台上汇编语言的目标程序。

编译程序的工作过程区分为以下 5 个过程:词法剖析,语法剖析,语义剖析和中间代码生成,代码优化,目标代码生成。

此中,词法剖析阶段的基本任务是从以字符串表示的源程序中辨别出拥有独立意义的单词符号,并以二元组的形式输出,以作为语法剖析阶段的输入。

语法剖析阶段的基本任务是将词法剖析阶段产生的二元组作为输入,依据语言的语法例则,辨别出各样语法成分,并判断该单词符号序列是不是该语言的一个句子。

语义剖析的任务是第一对每种语法单位进行静态的语义审察,而后剖析其含义,并用另一种语言形式(本课设采纳四元式 ) 来描绘这类语义。

代码优化的任务是对前阶段产生的中间代码进行等价变换或改造,以期获取更为高效即省时间和空间的目标代码。

目标代码生成的任务是将中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码(本课设生成汇编指令代码)。

在词法剖析阶段,经过 DOS环境手动输入字符串序列(以’#’作为结束标记)作为带剖析的源程序,调用词法扫描子程序将字符串以二元组的形式输出(如有不属于该语言单词符号出现,则进行犯错办理),词法扫描子程序包含了对源程序的预办理(忽视多余空格、回车换行符等空白字符),以及对单词的辨别和分类,以形成(单词种别,单词自己的值)形式的二元组,并将用户自定义变量信息存入程序变量信息表。

在语法剖析阶段,采纳自上而下的递归降落剖析法,从文法的开始符号出发,依据文法例则正向推导出给定句子。

依据递归降落剖析函数编写规则来编写相应的函数,在各个函数的剖析过程中调用词法剖析程序中的扫描程序,发出“取下一个单词符号”的命令,以获得下一个单词符号作语法剖析。

单词符号词语字符法法字符串表示的源程序分分析析器器取一下个单词符号在语义剖析和中间代码生成阶段,采纳语法制导翻译法,使用属性文法为工具来描绘程序设计语言的语义。

编译原理课程设计报告(一个完整的编译器)

编译原理课程设计报告(一个完整的编译器)

编译原理程序设计报告一个简单文法的编译器的设计与实现专业班级:计算机1406班组长姓名:宋世波组长学号: ******** 指导教师:肖桐2016年12月设计分工组长学号及姓名:宋世波20143753 分工:文法及数据结构设计词法分析语法分析(LL1)基于DAG的中间代码优化部分目标代码生成组员1学号及姓名:黄润华20143740 分工:中间代码生成(LR0)部分目标代码生成组员2学号及姓名:孙何奇20143754 分工:符号表组织部分目标代码生成摘要编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。

编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。

一.编译器的概述1.编译器的概念编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。

编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。

源代码一般为高阶语言如Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。

2.编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。

另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。

交叉编译器在生成新的硬件平台时非常有用。

“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。

例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。

3.本编译器概述编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。

每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。

编译原理课程设计报告

编译原理课程设计报告

编译原理课程设计报告编译原理课程设计——简单编译器的设计与实现班级:组长:组员:指导教师:设计时间: 12月摘要....................................... 错误!未定义书签。

1.概述 ..................................... 错误!未定义书签。

2.课程设计任务及要求 ....................... 错误!未定义书签。

2.1 设计任务............................ 错误!未定义书签。

2.2 设计要求............................ 错误!未定义书签。

3.算法及数据结构 ........................... 错误!未定义书签。

3.1算法的总体思想(流程)............... 错误!未定义书签。

3.2词法分析模块......................... 错误!未定义书签。

3.2.1功能........................... 错误!未定义书签。

3.2.2数据结构 ....................... 错误!未定义书签。

3.2.3算法........................... 错误!未定义书签。

3.3语法分析(含语义分析和中间代码生成)模块错误!未定义书签。

3.3.1功能........................... 错误!未定义书签。

3.3.2数据结构 ....................... 错误!未定义书签。

3.3.3算法........................... 错误!未定义书签。

3.4中间代码优化模块..................... 错误!未定义书签。

3.4.1功能........................... 错误!未定义书签。

3.4.2数据结构 ....................... 错误!未定义书签。

编译原理编译器课程设计

编译原理编译器课程设计

编译原理编译器课程设计经过一个星期的编译原理课程设计,本人在刘贞老师的指导下,顺利完成该课程设计。

通过该课程设计,收获颇多。

一、对实验原理有更深的理解通过该课程设计,掌控了什么就是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟识了编译程序总流程框图,介绍了编译程序的分解成过程、结构工具及其有关的技术对课本上的科学知识存有了更深的`认知,课本上的科学知识师机械的,表面的。

通过把该算法的内容,算法的继续执行顺序在计算机上同时实现,把原来以为很深奥的书本知识变小的更为直观,对实验原理存有更深的认知。

二、对该理论在实践中的应用有深刻的理解通过把该算法的内容,算法的继续执行顺序在计算机上同时实现,晓得和认知了该理论在计算机中就是怎样继续执行的,对该理论在实践中的应用领域存有深刻的认知。

三、激发了学习的积极性通过该课程设计,全面系统的认知了编程原理程序结构的通常原理和基本同时实现方法。

把死板的课本科学知识显得生动有趣,唤起了自学的积极性。

把段小宇的计算机编程原理的科学知识加强,能把课堂上学的科学知识通过自己设计的程序则表示出,增进了对理论知识的认知。

以前对与计算机壮作系统的认识是模糊的,概念上的,现在通过自己动手做实验,从实践上认识了操作系统是如何处理命令的,如何协调计算机内部各个部件运行,对计算机编译原理的认识更加深刻。

课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意指针,将不必要的命令去除。

在这次课程设计中,我就是按照实验指导的思想去顺利完成。

增进了认知文件系统的内部功能及内部同时实现,培育课堂教学动手能力和程序开发能力的目的。

四、理解了该知识点以及学科之间的融合渗透本次课程设计程序部分就是用c语言撰写的,把《计算机操作系统》,《编程原理》,《算法分析与设计》《c语言》四门学科联系出来,把各个学科之间的科学知识融合出来,把各门课程的科学知识联系出来,对计算机整体的重新认识更加深刻。

编译原理课程设计报告

编译原理课程设计报告

编译原理课程设计报告文档仅供参考编译原理课程设计——简单编译器的设计与实现班级:组长:组员:指导教师:设计时间:12 月文档仅供参考姓名分工组长:语法分析部分,语义分析和中间代码生成部分,符号表的管理,目标代码的生成,数据结构的设计和总体框架的设计。

组员:中间代码优化部分,负责从DAG图中获得优化后的四元式代码,以及将中间变量填写入符号表内。

组员:中间代码优化部分,负责优化DAG图的建立。

组员:词法分析部分,词法分析部分的符号表和错误表的记录。

文档仅供参考摘要 .......................................1.概述 .....................................2.课程设计任务及要求 .......................2.1 设计任务 ............................2.2 设计要求 ............................3.算法及数据结构 ...........................3.1算法的总体思想(流程) . ..............3.2词法分析模块 . ........................3.2.1功能 ...........................3.2.2数据结构 .......................3.2.3算法 ...........................3.3语法分析(含语义分析和中间代码生成)模块签。

3.3.1功能 ...........................3.3.2数据结构 .......................3.3.3算法 ...........................3.4中间代码优化模块 . ....................3.4.1功能 ...........................3.4.2数据结构 .......................3.4.3算法 ...........................3.5目标代码生成模块 . ....................3.5.1功能 ...........................错误 ! 未定义书签。

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

编译原理程序设计报告一个简单文法的编译器的设计与实现专业班级:计算机1406班组长姓名:宋世波组长学号: ******** 指导教师:肖桐2016年12月设计分工组长学号及姓名:宋世波20143753 分工:文法及数据结构设计词法分析语法分析(LL1)基于DAG的中间代码优化部分目标代码生成组员1学号及姓名:黄润华20143740 分工:中间代码生成(LR0)部分目标代码生成组员2学号及姓名:孙何奇20143754 分工:符号表组织部分目标代码生成摘要编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。

编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。

一.编译器的概述1.编译器的概念编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。

编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。

源代码一般为高阶语言如Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。

2.编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。

另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。

交叉编译器在生成新的硬件平台时非常有用。

“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。

例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。

3.本编译器概述编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。

每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。

由编译程序的五个阶段就对应了编译系统的结构,这五个对应阶段分为编译器的前段,中间代码以及后端。

其中词法分析器利用超前搜索、状态转换等方法,将源程序转化成为一个一个的单词符号二元式。

一般程序语言的单词符号包括关键字、运算符、常数、标识符和界符。

语法分析器将这些单词符号作为输入,对它进行语法分析。

语法分析采用LL1分析法,语法分析器把语法单元作为输入供语义分析器使用。

在语法分析的同时进行语法分析,并产生一定的语义动作,来生成中间代码。

优化和目标代码生成是针对某一种处理器而言的。

代码优化是将语义分析生成的中间代码进行优化,产生执行效率更高的代码。

目标代码生成最终生成可以在某种机器上运行的机器语言或者汇编语言。

还要有符号表可供查询。

在整个编译过程中还包括对表格的操作和对错误的处理,这些也都是非常重要的环节。

环境:编译器整体全部使用visual studio2015编写目标代码在8086指令集机器上运行关键词:编译原理,前端,中间代码生成,后端,目录设计分工 (2)摘要 (3)1. 概述 (7)2. 课程设计任务及要求 (9)2.1 设计任务 (9)2.2 设计要求 (10)2.3设计的文法结构 (11)3. 算法及数据结构 (17)3.1 算法的总体思想(流程) (17)3.2 词法分析器模块 (18)3.2.1 功能 (18)3.2.2 数据结构 (19)3.2.3 流程图 (20)3.2.4 算法 (20)3.2.5 运行截图 (22)3.3 语法分析器模块 (23)3.3.1 功能 (23)3.3.2 数据结构 (24)3.3.3 流程图 (25)3.3.4 算法 (26)3.3.5 运行截图 (33)3.4符号表生成模块 (34)3.4.1 功能 (34)3.4.2 数据结构 (35)3.4.3 流程图 (37)3.4.4 算法 (38)3.4.5 运行截图 (39)3.5中间代码生成模块 (39)3.5.1 功能 (40)3.5.2 数据结构 (40)3.5.3 流程图 (43)3.5.4 算法 (43)3.5.5 运行截图 (44)3.6中间代码优化模块 (44)3.6.1 功能 (44)3.6.2 数据结构 (45)3.6.3 流程图 (46)3.6.4 算法 (47)3.6.5运行截图 (49)3.7目标代码生成模块 (50)3.7.1 功能 (50)3.7.2 数据结构 (51)3.7.3 流程图 (51)3.7.4 算法 (52)3.7.5 运行截图 (54)这里不得不提到目标代码生成中存在的一些问题, (55)4. 程序设计与实现 (58)4.1 程序说明 (58)4.2 实验结果 (61)5. 结论 (63)5.1组长:宋世波 (63)5.2组员:孙何奇 (64)5.3组员:黄润华 (64)6. 收获、体会和建议。

(66)6.1组长:宋世波 (66)6.2组员:孙何奇 (66)6.3组员:黄润华 (67)7.附录 (69)源代码: (69)7.1可执行文件链接 (69)8、参考文献 (70)1. 概述本程序实现的数据类型有整型(int)、浮点型(float)、char(字符型)、字符串型(string),同时在最后的目标代码生成部分允许出现布尔(bool)类型,实现的操作有if,else以及while循环,和输入输出语句,能做到直接生成目标代码并运行。

做到了类型检查和重定义的判断,同时也有优化部分。

词法分析部分构建得到的词法序列为二元式,二元式由两部分组成,其种别码和类型组成,其中关键字和界符记录其数字,用到时只需查其对应的关键字表和界符表即可,而字符类型、字符串类型、数字类型、以及标识符类型的值一律用字符串存储,其中数字类型存储时对其使用atoi 和itoa函数进行数字转字符串即可,要使用到其数字时只需要将对其使用字符串转数字函数再获得即可。

语法分析部分采用的是LL1分析方法,这是一种自上而下的语法分析法,又称为预测分析法,语法分析器部分实现了自动求first集合和follow集合,采用的是递归程序获得select集合,在实现对产生式完全扫描以后,便可以获得一张完整的分析表,表中标注了是否为预测以及对应的产生式序列,而后进行语法分析,通过于获得的分析表进行比对,进行入栈出栈,匹配到相同的则认为匹配成果,当文法匹配成功,同时单词也匹配成功的时候,认为语法分析完成,语法无错误,否则报错。

在符号表生成部分,程序对获取的单词序列中的标识符进行再分析,确定每一个标识符的存储范围,同时从此之中获取函数的参数表,函数表部分,构建出编译器全局可用的活动记录表,以供目标代码生成使用,同时也为编译器增添新内容做准备。

中间代码生成部分,在此之前需注意到,由于再语法分析部分已经生成了一个具体可理解的动作序列,所以中间代码生成部分的所用方法并非语法制导,其本身也与语法分析相割裂开来,中间代码生成采取的是自底向上进行分析,不过是基于单词序列进行的分析,其操作等于是使用已获得的伪动作序列,与源程序去作比较,找出伪动作序列的实际含义,将其顺序填好,最后便完成了整个中间代码(四元式)的生成,并将其重新输出到文件中。

中间代码优化部分是对填装完毕的中间代码的再处理,也就是减少无用式子,给目标代码的生成提供便利,先进行基本块划分,而后采取的是DAG图优化,即无环有向图优化,顺序是构建DAG图(无环有向图),减少无用分支,或删改部分同义分支,完成DAG图改造后便又重新由树组装四元式,组装好的四元式又再次重新输出到文件中。

目标代码生成部分较长,也并不仅仅包含目标代码生成部分,在这个部分文件中,同时需要对前述获得的符号表,中间代码进行再处理,以得到符号目标代码生成所用的符号表和中间代码,再进行预处理完成之后,具体为根据四元式动作,按顺序依次生成目标代码,需要依据不同的四元式动作每个采取不同的操作方法,生成相应目标代码。

测试部分采用的emu8086软件,这个软件支持的指令集为8086指令集,由于64位机器上对汇编的支持并不算好,所以在8086机上最后进行的是对目标代码的正确性检验以及运行,运行通过且符合源程序实际操作即认为编译器任务完成。

2. 课程设计任务及要求2.1 设计任务1.一个简单文法的编译器前端的设计与实现①定义一个简单程序设计语言文法(包括变量说明语句、算术运算表达式、赋值语句;扩展包括逻辑运算表达式、If语句、While语句等);②扫描器设计实现;③语法分析器设计实现;④中间代码设计;⑤中间代码生成器设计实现。

2.难度相当的自选题目, 如:①一个简单文法的编译器后端的设计与实现。

②一个简单文法的编译器的设计与实现。

③自选一个感兴趣的与编译原理有关的问题加以实现以下为本组选择部分:一个简单文法的编译器的设计与实现。

1.定义一个简单程序设计语言文法(包括变量说明语句、算术运算表达式、赋值语句;扩展包括逻辑运算表达式、If语句、While语句等);2.扫描器设计实现3.语法分析器设计实现;4.符号表设计5.符号表生成器设计实现6.中间代码设计;7.中间代码生成器设计实现。

8.中间代码优化9.中间代码优化实现10.目标代码设计11.目标代码生成器设计实现2.2 设计要求1、在深入理解编译原理基本原理的基础上,对于选定的题目,以小组为单位,先确定设计方案;2、设计系统的数据结构和程序结构,设计每个模块的处理流程。

要求设计合理;3、编程序实现系统,要求实现可视化的运行界面,界面应清楚地反映出系统的运行结果;4、确定测试方案,选择测试用例,对系统进行测试;5、运行系统并要通过验收,讲解运行结果,说明系统的特色和创新之处,并回答指导教师的提问;6、提交课程设计报告。

以下为本组设计要求:给出一个源程序文件,作为编译器前端的输入,输出相关编译阶段的运行结果。

词法分析阶段:Token序列;关键字表、界符表、符号表系统。

语法分析阶段:LL1型产生式、分析表、语法分析所用栈符号表生成阶段:符号表系统中间代码生成阶段:四元式序列;符号表系统。

中间代码优化阶段:四元式序列、DAG图、优化完成的四元式序列目标代码生成阶段:符号表系统、四元式序列、目标代码(8086指令集) 2.3设计的文法结构产生式中文对照:1. <函数定义> -> <类型> <标识符> ( <参数声明> ) { <函数块> }2. <类型> ->int|float|char|void|$3. <因式> -> ( <表达式> ) | <标识符> | <数字> |<字符>4. <表达式> -> <因子> <项>5. <因子> -> <因式> <因式递归>6. <因式递归> -> * <因式> <因式递归> | / <因式> <因式递归> | $7. <项> -> + <因子> <项> | - <因子> <项> | $8. <参数声明> -> <声明> <声明闭包> | $9. <声明> -> <类型> <标识符> <赋初值> |<标识符><赋初值>10. <赋初值> -> = <右值> | $11. <右值> -> <表达式>12. <声明闭包> -> , <声明> <声明闭包> | $13. <函数块> -> <声明语句闭包> <函数块闭包>14. <声明语句闭包> -> <声明语句> <声明语句闭包> | $15. <声明语句> -> <声明> ;16. <函数块闭包> -> <赋值函数> <函数块闭包> | <while循环> <函数块闭包> | <条件语句> <函数块闭包> | <函数返回> <函数块闭包> |<cout语句><函数块闭包>|<cin语句><函数块闭包>| $17. <赋值函数> -> <标识符> <赋值或函数调用>18. <赋值或函数调用> -> = <右值> ; | ( <参数列表> ) ;19. <参数列表> -> <参数> <参数闭包>20. <参数闭包> -> , <参数> <参数闭包> | $21. <参数> -> <标识符> | <数字> | <字符串>22. <While循环>->while(<逻辑表达式>){<函数块>}23. <逻辑表达式> -> <表达式> <逻辑运算符> <表达式>24. <逻辑运算符> -> < | > | == |>=|<=25. <条件语句> -> if ( <逻辑表达式> ) { <函数块> } <否则语句>26. <否则语句> -> else { <函数块> } | $27. <函数返回> -> return <因式> ;28. <cout语句>->cout<< <标识符>;|cout<< <数字>;|cout<< <字符>;29. <cin语句>->cin>><标识符>;产生式如下:funcdef%type&id&(&parastate&)&{&funcblock&}&#type%int|float|char|void&#factor%(&exp&)|id|number|ch&#exp%divi&item&#divi%factor&faccycle&#faccycle%*&factor&faccycle|/&factor&faccycle|$&#item%+&divi&item|-&divi&item|$&#parastate%state&stateclo|$&#state%type&id&init|id&init&#init%=&rvalue|$&#rvalue%exp&#stateclo%,&stateclo|$&#funcblock%staclo&funcbloclo&#staclo%statement&staclo|$&#statement%state&;&#funcbloclo%opera&funcbloclo|whilecycle&funcbloclo|condistate &funcbloclo|funcend&funcbloclo|coutstate&funcbloclo|cinstate &funcbloclo|$&#opera%id&callstate&#callstate%=&rvalue&;|(&paralist&)&;&#paralist%para&paraclo&#paraclo%,&para&paraclo|$&#para%id|number|string&#whilecycle%while&(&logicexp&)&do&{&funcblock&}&we&# logicexp%exp&logicopera&exp&#logicopera%>|<|==|>=|<=&#condistate%if&(&logicexp&)&{&funcblock&}&nor&ie&#nor%else&{&funcblock&}|$&#funcend%return&factor&;&# coutstate%cout&<&<&id&;&# cinstate%cin&>&>&id&;&# do%$&#we%$&#ie%$&#词法分析序列表:标识符表i常数表 C关键字表K IntFloatCharStringVoidIfElseSwitchCaseForDo 1 2 3 4 5 6 7 8 91011While Continue Break Default Sizeof Return Cout Cin 1213141516171819界符表P >=<====><+-*/{},;() 1 2 3 4 5 6 7 8 910111213141516[ ] 1718字符表Ch 字符串表st3. 算法及数据结构3.1 算法的总体思想(流程)开始词法分析语法分析(LL1)符号表生成中间代码生成(LR0)中间代码优化目标代码生成结束算法总体思想文字解释如下:1.从文件中读取代码,调入词法分析,生成词法序列。

相关文档
最新文档