编译原理课程设计报告

合集下载

编译原理课程设计报告

编译原理课程设计报告

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

学会如何利用已有软件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. 构建预测分析表。

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

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

  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);}}。

相关文档
最新文档