编译原理课程设计报告

合集下载

编译原理课程设计报告

编译原理课程设计报告

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

学会如何利用已有软件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的编译过程采用一趟扫描方式,以语法分析为核心,词法分析程序和代码生成程序都作为一个独立的过程,当语法分析需要读入单词时就调用词法分析程序,而当语法分析正确需生成相应的目标代码时,则调用代码生成程序。

编译原理课程设计报告

编译原理课程设计报告

2011-2012学年第二学期《编译原理》课程设计报告学院:计算机科学与工程学院班级:学生姓名:学号:成绩:指导教师:时间:2012年5 月目录一、课程设计的目的 ---------------------------------------------------------------- - 1 -二、课堂实验及课程设计的内容 -------------------------------------------------- - 1 -2.1、课堂实验内容-------------------------------------------------------------- - 1 -2.2、课程设计内容-------------------------------------------------------------- - 1 -三、visual studio 2008 简介------------------------------------------------------- - 2 -四、问题分析及相关原理介绍 ----------------------------------------------------- - 3 -4.1、实验部分问题分析及相关原理介绍 ---------------------------------- - 3 -4.1.1、词法分析功能介绍及分析------------------------------------- - 3 -4.1.2、语法分析功能介绍及分析------------------------------------- - 3 -4.1.3、语义分析功能介绍及分析------------------------------------- - 4 -4.2、课程设计部分问题分析及相关原理介绍 ---------------------------- - 5 -4.2.1、编译程序介绍 ----------------------------------------------------- - 5 -4.2.2、对所写编译程序的源语言的描述(C语言) -------------- - 6 -4.2.3、各部分的功能介绍及分析 -------------------------------------- - 7 -4.3、关键算法:单词的识别-------------------------------------------------- - 8 -4.3.1、算法思想介绍 ----------------------------------------------------- - 8 -4.3.2、算法功能及分析 -------------------------------------------------- - 8 -五、设计思路及关键问题的解决方法 ------------------------------------------ - 10 -5.1、编译系统------------------------------------------------------------------ - 10 -5.1.1、设计思路 --------------------------------------------------------- - 10 -5.2、词法分析器总控算法--------------------------------------------------- - 12 -5.2.1、设计思路 --------------------------------------------------------- - 12 -5.2.2、关键问题及其解决方法 --------------------------------------- - 13 -六、结果及测试分析-------------------------------------------------------------- - 14 -6.1、软件运行环境及限制--------------------------------------------------- - 14 -6.2、测试数据说明------------------------------------------------------------ - 14 -6.3、运行结果及功能说明--------------------------------------------------- - 16 -6.4、测试及分析说明--------------------------------------------------------- - 16 -七、总结及心得体会 --------------------------------------------------------------- - 17 -7.1、设计过程------------------------------------------------------------------ - 17 -7.2、困难与收获 ------------------------------------------------------------- - 17 -八、参考文献 ------------------------------------------------------------------------ - 18 -一、课程设计的目的通过设计、编写和调试词法分析程序(又称扫描器),了解扫描器的组成结构,不同种类单词的识别方法,加深了对词法分析作用的理解。

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

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

编译原理课程设计报告一、目的与要求目的:在分析理解一个教学型编译程序(如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)2 报告主体 (1)2.1 设计目的: (1)2.2设计内容及要求: (1)2.2.1 设计符号表 (1)2.2.2 设计词法分析器 (1)2.2.3 语法分析与中间代码产生器 (2)2.2.4 优化器(选做) (2)2.2.5目标代码生成器(选做) (2)2.2.6 测试范例: (2)2.3 实现原理 (3)2.3.1 符号表的设计 (3)2.3.2 词法分析器的设计 (4)2.3.3 语法/语义分析 (5)2.4 算法实现流程图 (8)2.5 测试数据 (17)2.6结果输出及分析 (19)2.7 软件运行环境及限制 (28)2.8 心得体会 (29)2.9参考文献 (30)3 结论 (30)1 前言在网络世界中,我们往往对功能强大的程序叹为观止。

而这些强大程序的背后是编译这些程序的编译软件,是这些编译软件承托起了这些功能强大的运行程序。

我们有不少的同志致其自身于无尽的运行程序上。

而只有很少的人搞编译程序。

这就是为什么中国的可运行程序满天飞,而编译程序却很少。

本课程设计就是在这方面的探索,为你解读编译程序的奥秘。

课程设计题目选择9个题目中的一个,要求根据自己的兴趣和能力,选择一个对自己意义甚大的题目。

课程设计基本原理是在实践上,实现我们在课程上学习到的理论知识。

通过理论联系实践,更好的掌握课本上的理论知识。

2 报告主体2.1设计目的:本次课程设计是作一个集词法分析、语法分析、语义分析和中间代码生成于一体的编译器,它集中了《编译原理》里的几乎所有的思想。

不但加深了学生对编译方法的理解,而且能对学生的编程能力起到进一步提高的作用,培养学生的程序设计风格。

通过某种可视化编程语言的应用,具备初步的Windows环境下的编程思想。

2.2设计内容及要求:2.2.1 设计符号表确定符号表的组织方式,一般应包括名字栏和信息栏,其中名字栏作为关键字。

要考虑能够存储有关名字的信息,并可以高效地完成如下操作:1.查找:根据给定的名字,在符号表中查找其信息。

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

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

《编译原理》课程设计报告设计题目: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、符号表的组织符号表的组织方式有:线性表、散列表、树结构等,其必须维持源程序中的作用域信息。

编译原理课程设计报告

编译原理课程设计报告

实验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设计一个词法分析器,并考虑其与后续语法分析器的链接问题。

编译原理课设报告ll0

编译原理课设报告ll0

编译原理课设报告ll0编译原理课设报告LL(0)。

一、引言。

编译原理是计算机科学与技术领域的重要课程之一,它研究如何将高级程序语言翻译成机器语言。

LL(0)是一种重要的语法分析方法,它是一种自顶向下的分析方法,通过构建语法树来实现对程序语言的分析和翻译。

本报告将介绍LL(0)语法分析的原理、算法以及课设的设计与实现。

二、LL(0)语法分析原理。

LL(0)语法分析是一种基于预测分析表的自顶向下语法分析方法。

它通过预测下一个输入符号,根据文法规则进行推导,最终构建出语法树。

LL(0)的意思是“左侧扫描、左推导、0个向前看符号”。

LL(0)语法分析的关键是构建预测分析表,该表包含了文法的非终结符和终结符的组合,以及对应的产生式。

通过分析输入串和预测分析表,可以确定下一个推导所使用的产生式,从而构建语法树。

三、LL(0)语法分析算法。

1. 构建First集和Follow集。

在LL(0)语法分析中,需要先构建每个非终结符的First集和Follow集。

First集表示该非终结符能够推导出的终结符集合,Follow集表示在该非终结符的右侧能够出现的终结符集合。

2. 构建预测分析表。

根据文法的产生式和First集、Follow集,构建预测分析表。

预测分析表的行表示文法的非终结符,列表示文法的终结符。

表中的每个格子填写对应的产生式。

3. 进行语法分析。

根据输入串和预测分析表,进行语法分析。

从左到右扫描输入串,根据当前输入符号和栈顶符号,在预测分析表中查找对应的产生式。

将产生式右侧的符号入栈,并将输入串向右移动一个位置。

重复这个过程,直到输入串为空或者出现错误。

四、课设设计与实现。

1. 文法设计。

根据课设要求,设计符合LL(0)语法分析方法的文法。

文法应该满足左递归消除、左因子消除等要求,以便于构建预测分析表。

2. 构建预测分析表。

根据设计的文法,构建预测分析表。

根据文法的非终结符和终结符,填写预测分析表中的产生式。

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

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

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

了解如何利用现有软件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等。

编译原理课程设计报告

编译原理课程设计报告

编译技术课程设计——表达式的小型编译器专业:计算机1201学生姓名:贺茂纯指导教师:年轶完成时间:2015年7月2日一、目的 _________________________________________________ 1二、题目 _________________________________________________ 1三、要求 _________________________________________________ 11.词法分析___________________________________________ 12.语法分析___________________________________________ 13.代码生成___________________________________________ 24.错误处理___________________________________________ 2四、实验环境 _____________________________________________ 2五、系统实现 _____________________________________________ 21.词法分析___________________________________________ 22.语法分析___________________________________________ 43.中间代码___________________________________________ 64.错误处理___________________________________________ 8六、程序运行结果 _________________________________________ 91.准确的语句分析______________________________________ 92.错误的算术表达式___________________________________ 13七、总结 ________________________________________________ 16一、目的<<编译技术>>是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。

编译课程设计报告

编译课程设计报告

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

具体目标如下: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.教材:选用《编译原理》等权威教材,为学生提供系统、科学的学习资料。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

编译原理教程实验报告

编译原理教程实验报告

一、实验目的本次实验旨在使学生通过编译原理的学习,了解编译程序的设计原理及实现技术,掌握编译程序的各个阶段,并能将所学知识应用于实际编程中。

二、实验内容1. 词法分析2. 语法分析3. 语义分析4. 中间代码生成5. 代码优化6. 目标代码生成三、实验步骤1. 词法分析(1)设计词法分析器,识别输入源代码中的各种词法单元;(2)使用C语言实现词法分析器,并进行测试。

2. 语法分析(1)根据文法规则设计语法分析器,识别输入源代码的语法结构;(2)使用C语言实现语法分析器,并进行测试。

3. 语义分析(1)设计语义分析器,检查语法分析后的语法树,确保语义正确;(2)使用C语言实现语义分析器,并进行测试。

4. 中间代码生成(1)设计中间代码生成器,将语义分析后的语法树转换为中间代码;(2)使用C语言实现中间代码生成器,并进行测试。

5. 代码优化(1)设计代码优化器,对中间代码进行优化,提高程序性能;(2)使用C语言实现代码优化器,并进行测试。

6. 目标代码生成(1)设计目标代码生成器,将优化后的中间代码转换为特定目标机的汇编语言;(2)使用C语言实现目标代码生成器,并进行测试。

四、实验结果与分析1. 词法分析实验结果:成功识别输入源代码中的各种词法单元,包括标识符、关键字、运算符、常量等。

2. 语法分析实验结果:成功识别输入源代码的语法结构,包括表达式、语句、程序等。

3. 语义分析实验结果:成功检查语法分析后的语法树,确保语义正确。

4. 中间代码生成实验结果:成功将语义分析后的语法树转换为中间代码,为后续优化和目标代码生成提供基础。

5. 代码优化实验结果:成功对中间代码进行优化,提高程序性能。

6. 目标代码生成实验结果:成功将优化后的中间代码转换为特定目标机的汇编语言,为程序在目标机上运行做准备。

五、实验心得1. 编译原理是一门理论与实践相结合的课程,通过本次实验,我对编译程序的设计原理及实现技术有了更深入的了解。

编译原理课设报告最终版

编译原理课设报告最终版

一、设计目的研究、改进或自行设计、开发一个简单的编译程序或其部分功能,加深对编译理论和编译过程的理解。

编程语言不限。

二、设计任务扩展 PL/0 编译程序功能目的: 扩充 PL/0 编译程序功能要求: (1)阅读、研究 PL/0 编译程序源文件。

(2)在上述工作基础上,可有选择地补充、完善其中词法分析、语法分析、语义分析、目标代码生成、目标代码解释执行等部分的功能。

如以语法分析部分为例,则可以增加处理更多语法成分的功能,如可处理一维数组、++、--、+=、-=、*=、/=、%(取余)、!(取反)、repeat、for、else、开方、处理注释、错误提示、标示符或变量中可以有下划线等。

还可以增加类型,如增加字符类型、实数类型; 扩充函数如有返回值和返回语句的,有参数函数等;(3)设计编制典型的运行实例,以便能反映出自己所作的改进。

三、设计思想:PL/0 语言可以看成PASCAL 语言的子集,它的编译程序是一个编译解释执行系统。

PL/0 的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。

PL/0的编译程序和目标程序的解释执行程序都是用PASCAL语言书写的,因此PL/0 语言可在配备PASCAL 语言的任何机器上实现。

其编译过程采用一趟扫描方式,以语法分析程序为核心,词法分析和代码生成程序都作为一个独立的过程,当语法分析需要读单词时就调用词法分析程序,而当语法分析正确需要生成相应的目标代码时,则调用代码生成程序。

用表格管理程序建立变量、常量和过程表示符的说明与引用之间的信息联系。

当源程序编译正确时,PL/0 编译程序自动调用解释执行程序,对目标代码进行解释执行,并按用户程序的要求输入数据和输出运行结果。

四、设计内容:1扩充语句for(<语句>;<条件>;<语句>)<语句>;2扩充语句if <条件> then <语句> else <语句>;3扩充语句repeat <语句>;until <条件>;4增加自增自减运算++和—和+=,-=运算;5修改不等号#,为!=;6增加一维数组声明格式:<ident>[<ident>/<number>:<ident>/<number>]; 赋值格式:<ident>[<index>]:=<表达式>; 调用格式:<ident>[<index>]五、程序结构:PL/0源程序图1 编译程序结构 图2功能模块调用1.功能模块作用如下:Pl0.c :主程序Error :出错处理,打印出错位置和错误编码 Getsym :词法分析,读取一个单词 Getch :漏掉空格,读取一个字符Gen :生成目标代码,并送入目标程序区 Test :测试当前符号是否合法Block :分程序分析处理过程,词法语法分析 Enter :登陆名字表Position :查找标识符在名字表中的位置Constdeclaration:常量定义处理Vardeclaraction:变量说明处理Listcode:列出目标代码清单Statement:语句处理Expression:表达式处理Term:项处理Factor:因子处理Condition:条件处理Interpret:对目标代码的解释执行程序Base:通过静态链求出数据取得基地址增加两个功能:Arraydeclaration:数组声明处理Arraycoef:数组索引计算和“虚拟机”动作生成2.保留字:enum symbol {nul, ident, number, plus, minus, times, slash, oddsym, eql, neq,lss, leq, gtr, geq, lparen,rparen, comma, semicolon, period, becomes,beginsym, endsym, ifsym, thensym,elsesym,forsym, inc, dec, whilesym, writesym,readsym, dosym, callsym, constsym,varsym,procsym, repeatsym, untilsym, plusbk, minusbk,lbrack, rbrack, colon,}共43个,其中补充保留字为:else, for, repeat, until, plusbk, minusbk,Lbrack, rbrack, colon3.名字表中的类型enum object{ constant, variable, procedure, arrays, }共4个,扩充arrays,以便实现数组4.虚拟机代码enum fct { lit, opr, lod, sto, cal, inte, jmp, jpc, lda, sta, }共10个,补充的lda,sta用于数组操作6.错误信息(1)const,var,procedure后应为标识符(2) 常数说明中的=后应是数字(3)常数说明中的标识符后应是=(4)常数说明中的=写成了:=(5)漏掉了,或;(6)过程说明后的符号不正确(应是语句开始符,或过程定义符)(7)应是语句开始符(8)标识符未说明(9)程序结尾丢了句号。

编译原理课程设计报告

编译原理课程设计报告

LL(1) 语法分析器一、课程设计的目的通过课程设计进一步理解高级语言在计算机中的执行过程,加深对编译原理中重点算法和编译技术的理解,提高自己的编程能力,培养好的程序设计风格。

同时通过某种可视化编程语言的应用,具备初步的Windows环境下的编程思想。

解和掌握LL(1)语法分析方法的基本原理;根据给出的LL(1)文法,掌握LL(1)分析表的构造及分析过程的实现。

二、课程设计的要求及其方法语法分析程序要求实现sample语言中几种最常见的、基本的语法单位的分析:算术表达式,逻辑表达式,赋值语句,if语句,for语句,while语句,repeat 语句等,各个语法单位的定义如下:Sample语言的定义<字符>::=<字母>|<数字>|<界符><字母>::=a|b|c…|z|A|B|C…|Z<数字>::=0|1|2|3…|9<单界符>::=+|-|*|/|=|<|>|(|)|[|]|:\;|,|’|_|.单词集的定义(1) <单词集>::=<保留字>|<双界符>|<标识符>|<常数>|<单界符>(2) <保留字>::=and|array|begin|bool|call|case|case|char|const|do|dlse|end|false|for|if|input|integer|not |of|or|output|program|read|real|repeat|set|then|to|true|until|var|while|write(3)<双界符>::=/*|*/|<=|>=|<>|:=(4)<标识符>::=<字母>|<标识符><数字>|<标符><字母>(5)<常数>::=<整数>|<布尔常数>|<字符常数>|常数标识符>|<实数>(6)<整数>::=<数字>|<整数><数字>(7)<布尔常数>::=true|false(8)<字符常数>::=’除’以外的任意字符串’(9)<常数标识符>::=<标识符>(10)<实数>::=<整数>.<整数>数据类型的定义(1)<简单类型>:==integer|bool|char|real表达式的定义(1)<表达式>::=<算术表达式>|<逻辑表达式>(2)<算术表达式>::=<项>+-<算术表达式>|+-<项>|<项>(3)<项>:==<项>*<因子>|<项>/<因子>|<因子>(4)<因子>::=<算术量>(5)<算术量>::=<标识符>|<整数>(6)<逻辑表达式>::=<布尔项>or<逻辑表达式>|<布尔项>(7)<布尔项>::=<布尔因子>and<布尔项>|<布尔因子>(8)<布尔因子>::=<布尔量>|not<布尔因子>(9)<布尔量>::=<逻辑表达式>|<布尔常数>|<标识符>|<算术表达式><关系符><算术表达式>(10)<关系符>::=<|>|<>|<=|>=|=语句的定义(1)<语句>::=<说明语句>|<执行语句>(2)<说明语句>::=<常数说明><变量说明>(3)<常量说明>::=const<常数定义>|ε(4)<常数定义>::=标识符=<常数>;<常数定义>|标识符=<常数>;<变量说明>::=var<变量定义>|ε<变量定义>::=<标识符表>:<类型>;|<标识符表>:<类型>;<变量定义><标识符表>::=<标识符>,<标识符表>|<标识符><执行语句>::=<简单句>|<结构句><简单句>::=<赋值句><赋值句>::=<变量>:=<表达式><变量>::=<标识符><结构语句>::=<复合句>|<if语句>|<while语句>|<for语句>|<repeat语句><复合句>::=begin<语句表>end<语句表>::=<执行句>;<语句表>|<执行句><if语句>::=if<布尔表达式>then<执行句><if语句>::=if<布尔表达式>then<执行句1>else<执行句2><while语句>::=while<布尔表达式>do<执行句><for语句>::=for<标识符>::=<算术表达式1>to<算术表达式2>do<执行句> <repeat语句>::=repeat<执行句>until<布尔表达式>程序定义(1)<程序>::=program<标识符>;<分程序>(2)<分程序>::=<常量说明><变量说明><复合句>本次语法分析器课程设计采用LL(1)自顶向下析法来实现。

编译原理课程设计报告

编译原理课程设计报告

编译原理课程设计报告一、分析通过设计,编制,调试一个语法及语义分析程序,加深对语法及语义分析原理的理解。

IF 〈布尔表达式〉THEN 〈赋值语句〉ELSE 〈赋值语句〉其中(1)、可以选择递归下降法、LL(1)、算符优先分析法、LR法完成以上任务,中间代码选用四元式。

(2)、写出符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。

(3)、编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

二、算法设计程序要求有三部分组成,即词法分析、语法分析、以及语义分析。

其中词法分析部分要求完成对输入程序的关键字、标识符、常数、运算符进行识别;并分析词法分析的结果,检查程序输入的关键字是否为符合设计文法的关键字,检查标志符是否是合法标志符,识别运算符的种类。

语法分析部分主要是以算符优先文法的设计思想和步骤完成对词法分析结果的的语法分析工作,判断输入的程序是否符合设计的IF-THEN-ELSE文法。

在语法分析通过的基础上进行语义分析,其主要任务是完成对语法分析后的程序的语义分析,根据语法制导翻译去翻译输入的程序,从而得到程序的中间代码表示形式——四元式。

词法分析、语法分析和语义分析的流程图如下:(1)词法分析A 词法分析器的功能和输出形式输入:所给文法的源程序字符串输出:二元组(单词种别,单词符号的属性值)构成的序列B. 待分析的简单语言的词法因为是模拟简单编译器, 所以就以C语言的小型子集作为模拟编译器的词法.模拟程序语言的单词符号可分为下列五种;关键字: { (相当于Pascal语言中的begin) , if ,else , while , }(相当于Pascal语言中的end ) 所有的关键字都是小写字母 .运算符: + , - , * , / , = , < , <= , == , > , >= ,<> , && ,|| , !界符: 逗号 ,分号 ,左圆括号 , 右圆括号 , #常数: 在这里只涉及到int型常量其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义:ID = letter(letter|digit)*NUM = digit digit *空格由空白,制表符和换行符组成,空格一般用来分隔ID,NUM,运算符,界符和关键字,词法分析阶段通常会被过滤掉。

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

《编译原理》课程设计报告姓名:熊齐超(1208060220)姓名:刘畅(1208060221)姓名:袁青伟(1208060222)姓名:张文(1208060223)班级:软件121班专业:软件工程指导教师:陈晓明时间:2015/6/14项目名称:算术表达式的语法及语义分析贵州大学计算机科学与信息学院目录一、课程设计目的 (3)二、课程设计题目描述和要求 (3)1、算术表达式的文法的描述: (3)2、课程设计的要求描述: (3)3、实现的功能描述: (4)4、分析器的使用描述 (4)三、课程设计实现描述 (4)1、实现平台 (4)2、课程设计的基本思路描述 (5)3、自顶向下与递归下降分析方法的基本原理描述 (5)4、程序运行的最后界面 (6)5、演示分析 (8)四、课程设计总结 (8)五、参考文献及小组分工 (9)六、核心代码 (10)一、课程设计目的通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。

加深对文法分析器的知识的掌握,掌握计算机语言的语法分析的过程。

以及掌握计算机语言的语法分析程序设计与文法应用的实现方法。

能够熟练运用一种分析方法,自上而下或自下而上的方法分析一个给定的文法,我使用的是自上而下的分析方法。

以及通过思考以及动手制作分析器的过程来锻炼自己的编程能力和逻辑思维能力,体会计算机编译器的奥妙之处。

二、课程设计题目描述和要求1、算术表达式的文法的描述:〈无符号整数〉∷=〈数字〉{〈数字〉}〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉}〈表达式〉∷=〈项〉{〈加法运算符〉〈项〉}〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉}〈因子〉∷=〈标志符〉|〈无符号整数〉〈加法运算符〉∷=+|-〈乘法运算符〉∷=*|/〈字母〉∷= a | b | … | z〈数字〉∷= 0 | 1 | … | 92、课程设计的要求描述:1)在递归下降法、LL(1)、算符优先分析法或者LR法中选择其中一种方法完成以上任务,中间代码选用四元式。

2)编制分析程序,设计若干用例,并上机测试。

3)书写课程设计报告。

4)要求提供单步运行,让用户跟踪分析器工作的每一个步骤。

3、实现的功能描述:1)选定一种分析方法,本分析器采用递归下降分析方法进行语法分析2)允许用户手动输入算术表达式(每个项的长度不大于10)3)对输入的算术表达式进行词法、语法、语义分析4)分别对词法、语法、语义分析输出相应的执行结果5)对语法分析可输出递归下降分析的步骤,以及相应步骤所使用的产生式,对语义分析采用自顶向下分析方法,可输出四元式表示的中间代码。

4、分析器的使用描述对于一个给定的算术表达式,在此分析器中可直接点击词法分析按钮,得到结果如左下角的第一个显示框所示。

在运行分析器的过程中,输入的是相对应于文法所能够产生的算术表达式进行分析,如果是不符合文法的输入串,那么就会提示错误信息。

首先在输入表达式所对应的编辑框中输入所要分析的表达式,单击词法分析,在词法分析输出结果中可以查看算术表达式中使用的符号是否正确。

之后单击语法分析按钮,在语法分析框中会出现相应的递归下降分析步骤(包括分析过程中所使用的产生式)。

单击语义分析按钮,在分析结果栏中,显示以四元式表示的中间代码。

分析结束时,如果所输入的算术表达式是属于该文法的,那么语法分析输出结果框中显示:“输入串是该文法的一个句子!语法分析结束”若不属于该文法,那么语法分析输出结果框中显示:“输入串不是该文法的一个句子!语法分析结束”。

如果所输入的算术表达式中接有错误的字符,那么词法分析输出结果框中显示:“接错误后缀,出错”。

三、课程设计实现描述1、实现平台Microsoft Windows 7 / Microsoft Visual C++ 6.02、课程设计的基本思路描述首先应该把用文字表示的文法改写为数学符号。

(其中关于无符号整数和标识符,由于可以在词法分析的过程中给以确定,所以就不必抽象其表达式。

)设:indentifer :标识符 digit : 无符号整数E:表达式 T:项 F:因子则一个简单的术表达式的文法G1中包含以下产生式:E -> E+E | E-E | E*E | E/E | (E) | indentifer | digit为了明确运算符的优先权(括号的优先权高于乘除法,乘除法的优先权高于加减法),可改写文法G1如下:改写后的文法G2:E -> E+T | E-T | TT -> T*F | T/F | FF -> (E) | indentifer | digit为了避免左递归的发生,可进一步将文法改成:文法G[E]:(1)E -> [+|-]TG(2)G -> +TG|—TG(3)G -> ε(4)T -> FS(5)S -> *FS|/FS(6)S -> ε(7)F -> (E)(8)F -> indentifer | digit3、自顶向下与递归下降分析方法的基本原理描述自顶向下分析原理:自顶向下分析就是从文法的开始符号出发,向下推导,推出句子。

分为:带“回溯”的分析方法、不带回溯的递归子程序(递归下降)分析方法。

自顶向下分析的主旨:对任何输入串,试图用一切可能的办法,从文法开始符号(根结点)出发,自上而下、从左到右地为输入串建立一棵分析树。

或者说,为输入串寻找一个最左推导。

其分析是一种试探的过程,是反复使用不同产生式谋求与输入序列匹配的过程。

递归下降分析原理:递归的预测分析是为每一个非终结符写一个分析过程,这些过程可能是递归的在处理输入串时,首先执行的是对应开始符号的过程,然后根据产生式右部出现的非终结符,依次调用相应的过程,这种逐步下降的过程调用序列隐含地定义了输入串的分析树。

4、测试1. 当测试用例的算术表达式为1+4*(3+4*2+9/3)+7时,测试结果截图如下:当测试用例的算术表达式为6+!时,测试结果截图如下:当测试用例的算术表达式为2+(3+*)^时,测试结果截图如下:5、对句子的分析例如:对句子a+a+a*a的分析:设计该分析器的基本思路:输入算术表达式→给出词法分析结果→给出语法分析结果→给出语义分析结果由于程序在执行的过程中分为词法、语法、语义,故在程序设计的时候也按照这种方式,把整个程序分成三个大的部分,即词法分析部分,语法分析部分和语义分析部分。

而且在各个部分的内部采用模块化设计,再分成各个小块,各自完成其相对应的功能。

四、课程设计总结每一次课程设计,都有不一样的感受,通过课程设计,对我而言,得到的不仅仅是知识,更是获得知识的方法,这显得更加的重要。

通过本次对算术表达式的语法分析及语义分析器的设计,使我加深了对文法分析器的知识的掌握,掌握了计算机语言的语法分析的过程。

以及掌握了计算机语言的语法分析程序设计与文法应用的实现方法。

能够熟练运用递归下降分析方法,我使用的是自上而下的分析方法。

以及通过思考以及动手制作分析器的过程锻炼了自己的编程能力和逻辑思维能力。

并通过设计、编制、调试一个算术表达式的语法及语义分析程序,使我加深了对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。

我认为做好一个可视化的程序首先要做的工作是设计它界面,应为一个好的界面设计好了,那么在设计界面的过程中可能会激发起编程的思路。

做好一个项目的最主要的是要有恒心,虽然在做分析器的过程中遇到了很多的问题,刚开始做的时候没有什么头绪,经过和同学讨论和在网上搜集相关问题的答案,终于基本的问题都能够解决。

在课程设计的过程中,曾遇到过很多的问题,如对表达式的处理,单词的识别,还有很多细节的问题。

在遇到问题时,首先想到的是自己思考,分析过程,查找资料,上网百度,通过自己的努力还没有解决时,这是首先需要问的是自己旁边的同学,和同学讨论,有时还争得面红耳赤,如果最后将此不下,就再百度。

这课程设计的过程中,我几乎所有的问题处理流程就是这个样子的。

我感觉这就是一种学习的方法,在学习中遇到难题时的学习方法,要把这种学习的方法变成一种习惯,这才是每次课程设计应达到的一种效果。

课程设计提供了这样一种学习的机会,可以随时随地向同学请教,和老师交流的一个机会,和同学互相讨论的机会。

课程设计教会了我,如何用计算机程序来处理现实中的实际问题。

将现实中的实际问题先转化为数学模型,然后将数学模型用程序解决的一种能力。

经过这次课程设计,对语法分析有了更深入的了解,巩固了上课期间所学的知识。

对编译原理的基本原理也有了一定的了解。

五、参考文献及小组分工【1】编译原理………………………… Alfred.Aho(哥伦比亚大学) 、Monica m(斯坦福大学)、Ravi Sethi(Avaya实验室) Jeffrey D.Ullman……………机械工业出版社组长:熊齐超(1208060220)主要负责程序的组织、调试和语法分析和部分词法分析。

组员:刘畅(1208060221)主要负责词法分析部分组员:袁青伟(1208060222)主要负责收集资料和撰写实验报告组员:张文(1208060223)主要负责语义分析六、核心代码a.词法分析代码:int Bds::cifa_main() //词法分析主函数{int f;cifa_head = new cifa;cifa_head -> type = -1;cifa_head -> next = NULL;cifa_end = cifa_head;((CMATHDlg*)m_pWnd)->InfoAdd4("单词种类定义如下:");((CMATHDlg*)m_pWnd)->InfoAdd4("");((CMATHDlg*)m_pWnd)->InfoAdd4("标识符的种类编码 1 :");((CMATHDlg*)m_pWnd)->InfoAdd4("");((CMATHDlg*)m_pWnd)->InfoAdd4("常数的种类编码 2 :");((CMATHDlg*)m_pWnd)->InfoAdd4("");((CMATHDlg*)m_pWnd)->InfoAdd4("运算的种类编码 3 :+ ,- ,* ,/ ");((CMATHDlg*)m_pWnd)->InfoAdd4("");((CMATHDlg*)m_pWnd)->InfoAdd4("界限符的种类编码 4 : (,),;");GetChar();notock();//空格跳过((CMATHDlg*)m_pWnd)->InfoAdd1("词法分析结果如下:");while ( nn < 100 && ch != '^'){if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ) f=alph(); //字母串else if (ch >= '0' && ch <= '9') f=number(); //数字串else f=test();//其他符号if (f == 0) return (0);}cifa_disp(cifa_head);((CMATHDlg*)m_pWnd)->InfoAdd1("词法分析结束.");return (1);}int Bds::test() //识别相关符号{char temp[3];int i=0;int type;switch (ch){case ';' : //识别 ';'{temp[i++] = ch;GetChar();if (ch ==' ' ) temp[i++] =' ';temp[i] = '\0';type = 4;break;}case '+' : //识别 '+'{temp[i++] = ch;GetChar();if (ch ==' ' ) temp[i++] =' ';temp[i] = '\0';type = 3;break;}case '-' : //识别 '-'{temp[i++] = ch;GetChar();if (ch ==' ' ) temp[i++] =' ';temp[i] = '\0';type = 3;break;}case '*' : //识别 '*'{temp[i++] = ch;GetChar();if (ch ==' ' )temp[i++] =' ';temp[i] = '\0';type = 3;break;}case '/' : //识别 '/'{temp[i++] = ch;GetChar();if (ch ==' ' )temp[i++] =' ';temp[i] = '\0';type = 3;break;}case '(' : //识别 '('{temp[i++] = ch;GetChar();if (ch ==' ' )temp[i++] =' ';temp[i] = '\0';type = 4;break;}case ')' : // 识别')'{temp[i++] = ch;GetChar();if (ch ==' ' )temp[i++] =' ';temp[i] = '\0';type = 4;break;}default :{CString report;report.Format("%c",ch);((CMATHDlg*)m_pWnd)->InfoAdd1(report);((CMATHDlg*)m_pWnd)->InfoAdd1("无法识别,出错!");GetChar();if (ch == ' ')notock();return (0);}}if (ch == ' ') notock(); // 空格跳过cifa *p;p = new cifa;p -> next = NULL;p -> type = type;strcpy(p->word,temp);cifa_add(p);return (1);}int Bds::number() //识别数字{int type=2;int i=0;char temp[10];while('0'<= ch && ch <= '9'){temp[i] = ch;i++;GetChar();}temp[i]='\0';if (ch == ' ') notock(); //空格跳过else if (ch != '^' && ch != '+' && ch != '-' && ch != ';' && ch != '*' && ch != '/' && ch != '('&& ch != ')'){((CMATHDlg*)m_pWnd)->InfoAdd1("接错误后缀,出错");return (0);}if (ch == ' ') notock();cifa *p;p = new cifa;p -> next = NULL;p -> type = type;strcpy(p->word,temp);cifa_add(p);return (1);}int Bds::alph() //识别标识符{int i=0;char temp[10];int type = 1;temp[i] = ch;i++;GetChar();while ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >='0' && ch <= '9')){temp[i] = ch;i++;GetChar();}temp[i] = '\0';if (ch == ' ') notock();else if (ch != '^' && ch != '+' && ch != '-' && ch != ';' &&ch != '*' && ch != '/' && ch != '('&& ch != ')'){((CMATHDlg*)m_pWnd)->InfoAdd1("接错误后缀,出错");return 0;}cifa *p;p = new cifa;p -> next = NULL;p -> type = type;strcpy(p->word,temp);cifa_add(p);return (1);}cifa * Bds::cifa_add(cifa *p) //在分析结果列表尾添加一个新接点{cifa_end -> next = p;cifa_end = cifa_end -> next;return cifa_head;}void Bds::cifa_disp(cifa *cifa_head) //输出词法分析结果{cifa *p;p = cifa_head -> next ;while ( p != NULL){CString report;report.Format("(%2d , %s)",p->type,p->word);((CMATHDlg*)m_pWnd)->InfoAdd1(report);p = p ->next;}}void Bds::GetChar() //取字符{ch = str[nn];nn++;void Bds::notock() //去掉空格{if ( ch == ' ' )while ( ch == ' ' )GetChar();}void Bds::SetWnd(CDialog *pWnd){//设置窗口指针m_pWnd=pWnd;}b.语法分析代码:int Bds::yufa_main() //语法分析主程序{int n;cifa *p = new cifa;strcpy(p -> word ,"#"); //对词法分析产生的结果链表进行处理p -> type =-1;p -> next = NULL;cifa_add(p);cifa_p = cifa_head;((CMATHDlg*)m_pWnd)->InfoAdd2("算术表达式的递归分析过程如下:");((CMATHDlg*)m_pWnd)->InfoAdd2("步骤产生式");advance();n = E();if (n == 0){CString report;report.Format("%2d 输入串不是该文法的一个句子!",f);((CMATHDlg*)m_pWnd)->InfoAdd2(report);((CMATHDlg*)m_pWnd)->InfoAdd2("语法分析结束.");return (0);}else if (n == 1){CString report;report.Format("%2d 输入串是该文法的一个句子!",f);((CMATHDlg*)m_pWnd)->InfoAdd2(report);((CMATHDlg*)m_pWnd)->InfoAdd2("语法分析结束.");return (1);}void Bds::advance() //取词法分析产生列表中的结点作语法分析{cifa_p = cifa_p -> next;}int Bds::E() // E -> [+|-]TG 子函数{int t,g;if ((strcmp(cifa_p->word,"+") == 0)|| (strcmp(cifa_p->word,"-") == 0)) advance();CString report;report.Format("%2d E -> [+|-]TG",f++);((CMATHDlg*)m_pWnd)->InfoAdd2(report);t = T();if (t == 0) return (0);g = G();if (g == 0) return (0);else return (1);}int Bds::F() // F -> (E) | 标识符 | 无符号整数子函数{int m;if ((strcmp(cifa_p->word,"(") == 0 ) ){CString report;report.Format("%2d F -> (E)",f++);((CMATHDlg*)m_pWnd)->InfoAdd2(report);advance();m =E();if (m==0) return (0);if ((strcmp(cifa_p->word,")") == 0 ) ){advance();return (1);}else{((CMATHDlg*)m_pWnd)->InfoAdd2("ERROR.");return (0);}}else if ( cifa_p->type == 1 || cifa_p->type == 2) //数字或是标识符{CString report;report.Format("%2d F -> 标识符|无符号整数",f++);((CMATHDlg*)m_pWnd)->InfoAdd2(report);advance();return (1);}else return 0;}int Bds::S() // S -> *FS | /FS |ε子函数{int t,g;if (strcmp(cifa_p->word,"*") == 0){CString report;report.Format("%2d S -> *FS",f++);((CMATHDlg*)m_pWnd)->InfoAdd2(report);advance();t = F();if (t== 0) return 0;g = S();if (g == 0) return 0;return(1);}else if (strcmp(cifa_p->word,"/") == 0){CString report;report.Format("%2d S -> /FS",f++);((CMATHDlg*)m_pWnd)->InfoAdd2(report);advance();t = F();if (t== 0) return 0;g = S();if (g == 0) return 0;return(1);}else if (strcmp(cifa_p->word,"+") == 0 ||(strcmp(cifa_p->word,"-") == 0)||(strcmp(cifa_p->word,"#") == 0)||(strcmp(cifa_p->word,")") == 0)){CString report;report.Format("%2d S -> ε",f++);((CMATHDlg*)m_pWnd)->InfoAdd2(report);return(1);}return (0);}int Bds::T() // T -> FS 子函数{int t,g;CString report;report.Format("%2d T -> FS",f++);((CMATHDlg*)m_pWnd)->InfoAdd2(report);t = F();if (t== 0) return 0;g = S();if (g == 0) return 0;return(1);}int Bds::G() // G -〉+TG | -TG |ε子函数{int t,g;if (strcmp(cifa_p->word,"+") == 0){CString report;report.Format("%2d G -> +TG",f++);((CMATHDlg*)m_pWnd)->InfoAdd2(report);advance();t=T();if (t == 0) return(0);g=G();if ( g== 0) return (0);return (1);}else if (strcmp(cifa_p->word,"-") == 0){CString report;report.Format("%2d G -> -TG",f++);((CMATHDlg*)m_pWnd)->InfoAdd2(report);advance();t=T();if (t == 0) return(0);g=G();if (g == 0) return (0);return(1);}else if (strcmp(cifa_p->word,")") == 0 || strcmp(cifa_p->word,"#") == 0){CString report;report.Format("%2d G -> ε",f++);((CMATHDlg*)m_pWnd)->InfoAdd2(report);return(1);}return (0);}c.语义分析代码:void Bds::yuyi_main(){cifa_p = cifa_head;yuyi_head = new yuyi;yuyi_head -> next = NULL;yuyi_end = yuyi_head;((CMATHDlg*)m_pWnd)->InfoAdd3("语义分析产生的四元式如下:");advance();E1();yuyi_sys_disp();((CMATHDlg*)m_pWnd)->InfoAdd3("语义分析结束.");}yuyi *Bds::yuyi_add(yuyi *p) //在四元式链表末添加一个结点{yuyi_end->next = p ;yuyi_end = p;return yuyi_head;}void Bds::yuyi_sys_disp() //输出四元式链表{yuyi *p;p = yuyi_head->next;while(p!=NULL){CString report;report.Format("(%c ,%s ,%s ,%s)",p->op,p->op1,p->op2,p->result );((CMATHDlg*)m_pWnd)->InfoAdd3(report);p = p->next;}//cout<<endl;}int Bds::E1() //E -> T+E | T-E | T{yuyi *p = new yuyi;T1();strcpy(p->op1,T_name);if (strcmp(cifa_p->word,"+") == 0){advance();E1();p->next =NULL;p->op = '+';strcpy(p->op2,E_name);E_name[0] = 't';E_name[1] = ++count;E_name[2] = '\0';strcpy(p->result,E_name);yuyi_add(p);return (1);}else if (strcmp(cifa_p->word,"-") == 0){advance();E1();p->next =NULL;p->op = '-';strcpy(p->op2,E_name);E_name[0] = 't';E_name[1] = ++count;E_name[2] = '\0';strcpy(p->result,E_name);yuyi_add(p);return(1);}else{strcpy(E_name,T_name);return(1);}}int Bds::F1() //F -> (E) | 标识符 | 无符号整数{if ((strcmp(cifa_p->word,"(") == 0 ) ){advance();strcpy(F_name,cifa_p->word);strcpy(E_name,F_name);E1();if ((strcmp(cifa_p->word,")") == 0 ) ){advance();strcpy(F_name,E_name);return (1);}else{((CMATHDlg*)m_pWnd)->InfoAdd2("ERROR.");return (0);}}else if ( cifa_p->type == 1 || cifa_p->type == 2) {strcpy(F_name,cifa_p->word);advance();return (1);}else return 0;}int Bds::T1() //T -> F*T | F/T | F{yuyi *p = new yuyi;F1();strcpy(p->op1,F_name);if (strcmp(cifa_p->word,"*") == 0){advance();T1();p->next =NULL;p->op = '*';strcpy(p->op2,T_name);T_name[0] = 't';T_name[1] = ++count;T_name[2] = '\0';strcpy(p->result,T_name);yuyi_add(p);return(1);}else if (strcmp(cifa_p->word,"/") == 0) {advance();T1();p->next =NULL;p->op = '/';strcpy(p->op2,T_name);T_name[0] = 't';T_name[1] = ++count;T_name[2] = '\0';strcpy(p->result,T_name);yuyi_add(p);return(1);}else{strcpy(T_name,F_name);return(1);}}。

相关文档
最新文档