文档库 最新最全的文档下载
当前位置:文档库 › 编译技术课程设计报告书-L语言编译器的设计与实现

编译技术课程设计报告书-L语言编译器的设计与实现

编译技术课程设计报告书-L语言编译器的设计与实现
编译技术课程设计报告书-L语言编译器的设计与实现

课程设计报告

( 2010 – 2011 年度第1学期)

名称:编译技术课程设计A

题目:L语言编译器的设计与实现院系:计算机系

班级:软件0802

学号: 2

学生姓名:

指导教师:

设计周数: 2 周

成绩:

日期:2011 年1 月14 日

《编译技术》课程设计

任务书

一、课程设计的目的与要求

1.任务:实现一个简单的编译程序,能够对指定程序设计语言进行编译。

2.目的:加深对课堂讲授知识的理解,熟练掌握编译程序设计原理及常用的技术,建立编译程序的整体概念,使得学生初步具有研究、设计、编制和调试编译程序的能力。

3.要求:熟悉有关定义、概念和实现算法,设计出程序流程框图和数据结构,编写出完整的源程序,进行静态检查,设计出输入数据、显示输出数据;基本功能完善,方便易用,操作无误;通过课程设计学会编译程序设计与实现的常用技术,具备初步分析、设计和开发编译程序的能力,具备分析与检查软件错误、解决和处理实验结果的能力。

4.学生要求人数:2人,1人负责扫描器和目标代码生成器的设计和实现,另1人负责语法分析器和语法制导翻译程序的设计和实现。

二、主要内容

下面是课程设计主要内容的简介,详细内容请见《编译技术课程设计指导书》。

1.扫描器设计

该扫描器是一个子程序,其输入是源程序字符串,每调用一次输出一个单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设计,假设程序设计语言中,基本字不能用作一般标识符,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。

2.语法分析器设计

以算法优先分析方法为例,设计一个算符优先语法分析程序。算符优先分析属于自下而上的分析方法,该语法分析程序的输入是终结符号串(即单词符号串,以一个“#”结尾),如果输入串是句子则输出“YES”,否则输出“NO”和错误信息。当然,也可采用预测分析等方法设计语法分析器,具体方法自定。

3.语法制导翻译程序设计

采用语法制导翻译方法,实现算术表达式、赋值语句和基本控制语句等的翻译。本语法制导翻译程序的输入是终结符号串(即单词符号串,以一个“#”结尾),如果输入符号串是句子,则按照其语义进行翻译,输出等价的四元式序列。

4.目标代码生成器设计

将程序设计语言的中间代码翻译为目标代码,输入是四元式序列,输出是汇编代码文件。

三、进度计划

四、设计成果要求

1.完成规定的课程设计任务,所设计软件功能符合要求;

2.完成课程设计报告,要求格式规范,内容具体而翔实,应体现自身所做的工作,注重对设计思路的归纳和对问题解决过程的总结。

五、考核方式

1.平时成绩+验收答辩+实验报告;

2.五级分制。

学生姓名:

指导教师:鲁斌李莉

2011 年1 月4 日

本组组员:龚泽滢(200809020205)

邵婧婕(200809020224)

其中我负责语法/语义分析部分。

语法/语义分析

目 的

通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序

任采用如下四元式:

实验正文

数据结构 1输入

token 文件、符号表文件,其数据结构与词法分析产生的文件相同。 2输出

四元式序列文件,其纪录结构如下:

typedef struct equ {

int op; //四元式操作码

int op1; //操作数在符号表中的入口地址

int op2; //操作数在符号表中的入口地址

int result; //结果变量在符号表中的入口地址

} equ;

●程序中可用数组Equ存放四元式序列,定义为:equ Equ[EQU_LEN]

●可用变量int LineOfEqu做指针,指向下一个即将产生的四元式

●符号表文件的结构与输入相同,语法分析中对于符号表不做操作,只是在文件头

部增加一个记录变量多少的数据。

程序结构说明

为方便编程,将语言文法整理如下:

?L→S | S ; L

S→id := E

S→if B then S

S→if B then S else S

S→while B do S

S→begin L end

变量说明语句的文法:

S→var D|ε

D→L : K ; | L : K ; D

L→i , L | i

K→integer | bool | real

其中,B

parser为主程序模块,Declear为说明语句分析模块,L_begin为复合语句分析模块。其中L_begin结构图如下:

?

经常使用的过程和函数:

● gen(int op,int a,int b, int r):生成一个四元式

● NewTemp():产生一个临时变量,返回其在符号表中的入口地址 ●

BackPatch(int addr, int addr2):回填函数,完成四元式转移目标的回填 ● void getbuf():获取文件中的一组数据

● void program():程序由程序首部、程序体和;组成 ● void proghead():程序首部:program+标识符+;

● void block():程序体部分,常量说明、变量说明、语句部分 ? 实验算法思想(包含主程序的示意图) (1)主程序的示意图如下图所示:

(2)递归下降分析程序示意图如下图所示:

(3)语法串分析过程示意图如下图所示:

(4)statement语句分析函数示意图如下图所示:

(5)expression表达式分析函数如下图所示:

(6)term分析函数示意图如下图所示:

(7)factor分析过程示意图如下图所示:

(8)语义分析器:

设置语义过程

1、emit(char *result,char *ag1,char *op,char *ag2)

该函数的功能是生成一个三地址语句送到四元式表中。

四元式表的结构如下:

struct

{ char result[8];

char ag1[8];

char op[8];

char ag2[8];

}quad[20];

(2) char *newtemp()

该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,…

char *newtemp(void)

{ char *p;

char m[8];

p=(char *)malloc(8);

k++;

itoa(k,m,10);

strcpy(p+1,m);

p[0]=’t’;

return(p);

}

2、设计思想

函数lrparser 在语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。分析程序可知,需要进行四元式翻译的只有赋值语句、表达式和if语句、while语句等控制语句。在实现时,我采用这样的方法:先建立一个关于四元式的结构体,并建立一个存放这样的结构体的向量。当遇到赋值号:=时,声明一个结构体,并把这个结构体插入向量中。由于在赋值号前必然是一个变量ID,可以在遇到一个变量ID时,就把这个ID的值存入临时变量tmp。由于在后面可能要用到也可能用不到,所以不用担心tmp值覆盖的问题。在向量中插入结构体变量后,需要将ID 填入对应的项中,然后可以继续遍历。遇到下一个ID则写入。若:=后面是一个表达式,则可以在再新建一个结构体变量,在其中处理表达式的四元式生成。然后把所得的地址存入上一层的对应位置。

?实验总结

这次的实验比较难。刚刚拿到手的时候感觉无从下手,找不到一个突破点。其主要

难点在于如何实现回填技术。

在实现语法分析器时,整体采用模块化编程的思想。将一个程序拆分成各个部分,分别实现。在实现各个子模块时需要注意的地方就是在实现语法分析时要考虑到各种情况,比如同时定义多个变量等。对此我采用了后缀的处理方式。后缀可有可无。这样就能解决在顺序分析程序时出现多条相同类型的语句以及在一条语句中出现多个变量定义等情况。还有就是在处理语义分析时如何处理表达式和控制语句回填位置这样的问题。

本次实验虽然比较大,但不得不说,它在很大程度上锻炼了我们分析、处理问题的能力。由于我采用的是模块化编程的方式。这样编程的好处在于程序的结构清晰,紧密相连。但是带来的负面结果是程序的函数多。无论在写函数还是在调试程序的时候需要极大的耐心。

实验中也遇到了不少小问题。比如读文件时如何才能使指针回退等。这些都通过自己的努力和同学的帮助,不仅仅是克服了这些问题,更重要的意义在于我又学会了一些以前不懂的知识。

同时我也感受到了理论与实现之间的差距。那些平时上课时觉得很容易懂的知识,要通过自己在计算机上进行实现并不像想象中的那么容易。我们能理解的知识用计算机语言表述成计算机能理解的语言,这不仅需要很扎实的编程基础,更要彻彻底底的搞懂所学的理论知识,并达到将所学知识融会贯通的程度。这样才能自由的应付实现时出现的细节问题。

总之,这次的课程设计让我收获颇多。

?参考资料

【1】陈火旺、刘春林、谭庆平、赵克佳、刘越,编译原理(第三版).北京:国防工业出版社

【2】黄贤英、王柯柯,编译原理及实践教程。北京:清华大学出版社

【3】马知行、曹启君,编译方法。机械工业出版社

附录一:程序代码

#include

#include

#include

using namespace std;

#define AND 1

#define BEGIN 2

#define BOOL 3

#define DO 4

#define ELSE 5

#define END 6

#define FALSE 7

#define IF 8

#define INTEGER 9

#define NOT 10

#define OR 11

#define PROGRAM 12

#define REAL 13

#define THEN 14

#define TRUE 15

#define VAR 16

#define WHILE 17

#define ID 18

#define整数19

#define实数20

#define LBR 21

#define RBR 22

#define ADD 23

#define SUB 24

#define MUL 25

#define DIV 26

#define DOT 27

#define COM 28

#define COL 29

#define SEM 30

#define ASS 31

#define EQU 32

#define LEQ 33

#define LAB 34

#define NEQ 35

#define RAB 36

#define GEQ 37

#define ODD 38

#pragma once

typedef struct token

{

int label; //单词序号

char name[30]; //单词本身

int code; //单词的机内码

int addr; //地址,单词为保留字时为-1,为标识符或常数时为大于的数值,即在符号表中的入口地址。

token() {label=0;code=0;addr=0;}

}token;

void getbuf();

void program();

void proghead();//程序首部由program 标识符组成

void block();//程序体部分

void error(int n);

void consdefi();

void consexpl();

void conssuff();

void varexpl();

void vardefi();

void varsuff();

//void procdefi();

//void procedh();

//void procsuff();

void typeil();

void assipro();

void sentence();

void suffix();

void ifsent();

void read();

void whilesent();

void idsuff();

void write();

void compsent();

void exprsuff();

void sentsuff();

void conditio();

void termsuff();

void express();

void term();

void factsuff();

void factor();

void addoper();

void muloper();

void respoper();

void argument();

token t;

FILE *opt=fopen("token.txt","r");

bool flag=true;//还能否读

void main()

{

getbuf();

program();

printf("the program is right!\n");

/*Sleep(5000);*/

fclose(opt);

}

void getbuf()

{

if(opt==NULL)

{

cout<<"can't open the file!\n";

exit(0);

}

if(feof(opt))

{

flag=false;//到了结尾不可再读

cout<<"file ends\n";

}

else

{

fscanf(opt,"%d %s %d %d\n",&https://www.wendangku.net/doc/fa1514683.html,bel,https://www.wendangku.net/doc/fa1514683.html,,&t.code,&t.addr);

}

}

void program()//程序由程序首部、程序体和;组成

{

proghead();

block();

if(t.code==SEM)

{

getbuf();

}

else

{

cout<<"miss ';'\n";

exit(0);

}

void proghead()//程序首部:program+标识符+;

{

if(t.code==PROGRAM)

{

getbuf();

if(t.code==ID)

{

getbuf();

if(t.code==SEM)

{

getbuf();

}

else

{

cout<<"miss ';'\n";

exit(0);

}

}

else

{

cout<<"error of ID\n";

}

}

else

{

cout<<"miss keyword program\n";

exit(0);

}

}

void block()//程序体部分,常量说明、变量说明、语句部分{ //变量说明、复合句

consexpl();

varexpl();

/*procdefi(t);*/

compsent();

}

void consexpl()//常量说明部分:整数||实数

{

if(t.code==整数||t.code==实数)

{

getbuf();

consdefi();

if(t.code==SEM)

getbuf();

else

{

cout<<"miss ';'\n";

exit(0);

}

}

}

void consdefi()//常量定义:标识符+等号+无符号数{

if(t.code==ID)

{

getbuf();

if(t.code==EQU)

{

getbuf();

if(t.code==INTEGER)

getbuf();

else

{

cout<<"miss INTEGER\n";

exit(0);

}

}

else

{

cout<<"miss '='";

exit(0);

}

}

else

{

cout<<"miss ID\n";

exit(0);

}

}

void conssuff()//常量定义后缀:,+常量定义后缀{

if(t.code==COM)

{

getbuf();

consdefi();

if(t.code==SEM)

{

getbuf();

}

else

{

cout<<"miss ';'\n";

exit(0);

}

}

}

void varexpl()//变量说明部分,var+变量定义+变量定义后缀

{

if(t.code==VAR)

{

getbuf();

vardefi();

varsuff();

}

}

void vardefi()//变量定义:标识符+标识符后缀+:+类型+;||标识符+标识符后缀+:+类型+;+变量定义{

if(t.code==ID)

{

getbuf();

idsuff();

if(t.code==COL)

{

getbuf();

typeil();

if(t.code==SEM)

{

getbuf();

}

else

{

cout<<"miss ';'\n";

exit(0);

}

}

else

{

cout<<"miss ':'\n";

exit(0);

}

}

}

void varsuff()//变量后缀:变量定义+变量后缀||空

{

if(t.code==ID)

{

vardefi();

varsuff();

}

}

void typeil()//类型:real||bool||integer

{

if(t.code==REAL||t.code==BOOL||t.code==INTEGER) {

getbuf();

}

else

{

cout<<"wrong tyoe of define\n";

exit(0);

}

}

//void procdefi(token t)//过程定义:程序首部+分程序+ //{

// if(https://www.wendangku.net/doc/fa1514683.html,==

//}

void compsent()//复合句:begin+语句表+end

{

if(t.code==BEGIN)

{

getbuf();

sentence();

sentsuff();

if(t.code==END)

{

getbuf();

}

}

else

{

cout<<"miss BEGIN as the start\n";

exit(0);

}

}

void sentence()//赋值语句、if语句、while语句、复合句{

if(t.code==ID)

{

assipro();

}

else if(t.code==IF)

{

ifsent();

}

else if(t.code==WHILE)

{

whilesent();

}

else if(t.code==BEGIN)

{

compsent();

}

}

void sentsuff()//语句后缀:;+语句+语句后缀

{

if(t.code==SEM)

{

getbuf();

sentence();

sentsuff();

}

}

void assipro()//赋值语句

{

if(t.code==ID)

{

getbuf();

suffix();

}

else

{

cout<<"赋值语句错误\n";

exit(0);

}

}

void suffix()//赋值号的后缀为赋值语句,否则为过程调用语句{

if(t.code==ASS)

{

getbuf();

express();

}

else if(t.code==LBR)

{

getbuf();

express();

if(t.code==RBR)

{

getbuf();

}

else

{

cout<<"缺少右半边括号\n";

exit(0);

}

}

}

void express()//表达式:正负号+项+项后缀

{

if(t.code==SUB)

{

getbuf();

term();

termsuff();

}

else if(t.code==整数||t.code==实数||t.code==ID)

{

term();

termsuff();

}

}

void exprsuff()//表达式后缀:,+表达式+表达式后缀

{

if(t.code==COM)

{

getbuf();

express();

exprsuff();

}

编译原理课程设计

《编译原理》课程设计大纲 课程编号: 课程名称:编译原理/Compiler Principles 周数/学分:1周/1学分 先修课程:高级程序设计语言、汇编语言、离散数学、数据结构 适用专业:计算机科学与技术专业、软件工程专业 开课学院,系或教研室:计算机科学与技术学院 一、课程设计的目的 课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,设计题中的问题比平时的练习题要复杂,也更接近实际。编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构表示问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的动手能力。 要求学生在上机前应认真做好各种准备工作,熟悉机器的操作系统和语言的集成环境,独立完成算法编制和程序代码的编写。 设计时间: 开发工具: (1) DOS环境下使用Turbo C; (2) Windows环境下使用Visual C++ 。 (3) 其它熟悉语言。 二、课程设计的内容和要求 设计题一:算术表达式的语法分析及语义分析程序设计。 1.目的

通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词 法检查和分析。 2.设计内容及要求: 算术表达式的文法: 〈无符号整数〉∷= 〈数字〉{〈数字〉} 〈标志符〉∷= 〈字母〉{〈字母〉|〈数字〉} 〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉} 〈项〉∷= 〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷= 〈标志符〉|〈无符号整数〉|‘(’〈表达式〉‘)’ 〈加法运算符〉∷= +|- 〈乘法运算符〉∷= *|/ (1) 分别选择递归下降法、算符优先分析法(或简单优 先法)完成以上任务,中间代码选用逆波兰式。 (2) 分别选择LL(1)、LR法完成以上任务,中间代码选 用四元式。 (3) 写出算术表达式的符合分析方法要求的文法,给出 分析方法的思想,完成分析程序设计。 (4) 编制好分析程序后,设计若干用例,上机测试并通 过所设计的分析程序。 设计题二:简单计算器的设计 1.目的 通过设计、编制、调试一个简单计算器程序,加深对语法及语 义分析原理的理解,并实现词法分析程序对单词序列的词法检 查和分析。 2.设计内容及要求 算术表达式的文法:

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

编译原理程序设计报告 一个简单文法的编译器的设计与实现专业班级:计算机1406班 组长姓名:宋世波 组长学号: 20143753 指导教师:肖桐 2016年12月

设计分工 组长学号及姓名:宋世波20143753 分工:文法及数据结构设计 词法分析 语法分析(LL1) 基于DAG的中间代码优化 部分目标代码生成 组员1学号及姓名:黄润华20143740 分工:中间代码生成(LR0) 部分目标代码生成 组员2学号及姓名:孙何奇20143754 分工:符号表组织 部分目标代码生成

摘要 编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。 一.编译器的概述 1.编译器的概念 编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。源代码一般为高阶语言如Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。 2.编译器的种类 编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语

编译原理课程设计报告

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 -

编译实验报告+源代码

课程设计报告 ( 2013-- 2014年度第1学期) 名称:编译技术课程设计B 题目:简单编译程序的设计与实现院系:计算机系 班级:XXX 学号:XXX 学生姓名:XXX 指导教师:XXX 设计周数:XXX 成绩: 日期:XX 年XX 月

实验一.词法分析器的设计与实现 一、课程设计(综合实验)的目的与要求 1.1 词法分析器设计的实验目的 本实验是为计算机科学与技术专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。通过这个实验,使学生应用编译程序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。能使得学生在设计和调试编译程序的能力方面有所提高。为将来设计、分析编译程序打下良好的基础。 1.2 词法分析器设计的实验要求 设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序设计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。 单词符号及其内部表示如表1-1所示,单词符号中标识符由一个字母后跟多个字母、数字组成,常数由多个十进制数字组成。单词符号的内部表示,即单词的输出形式为二元式:(种别编码,单词的属性值)。 表1-1 单词符号及其内部表示

二、设计(实验)正文 1.词法分析器流程图 2.词法分析器设计程序代码 // first.cpp : 定义控制台应用程序的入口点。// #include"stdafx.h" #include #include using namespace std; int what(char a) { if((int(a)>=48)&&(int(a)<=57)) {

编译原理课程设计报告_LL(1)分析过程模拟

课程设计(论文)任务书 软件学院学院软件工程专业07-1班 一、课程设计(论文)题目LL(1)分析过程模拟 二、课程设计(论文)工作自 2010 年 6 月 22日起至 2010 年 6月 28 日止。 三、课程设计(论文) 地点: 四、课程设计(论文)内容要求: 1.本课程设计的目的 (1)使学生掌握LL(1)模块的基本工作原理; (2)培养学生基本掌握LL(1)分析的基本思路和方法; (3)使学生掌握LL(1)的调试; (4)培养学生分析、解决问题的能力; (5)提高学生的科技论文写作能力。 2.课程设计的任务及要求 1)基本要求: (1)分析LL(1)模块的工作原理; (2)提出程序的设计方案; (3)对所设计程序进行调试。 2)创新要求: 在基本要求达到后,可进行创新设计,如改算法效率。 3)课程设计论文编写要求 (1)要按照书稿的规格打印誊写课程设计论文 (2)论文包括目录、绪论、正文、小结、参考文献、附录等 (3)课程设计论文装订按学校的统一要求完成 4)答辩与评分标准: (1)完成原理分析:20分; (2)完成设计过程(含翻译):40分; (3)完成调试:20分;

(4)回答问题:20分。 5)参考文献: (1)张素琴,吕映芝,蒋维杜,戴桂兰.编译原理(第2版).清华大学出版社 (2)丁振凡.《Java语言实用教程》北京邮电大学出版社 6)课程设计进度安排 内容天数地点 构思及收集资料2图书馆 编程与调试4实验室 撰写论文1图书馆、实验室 学生签名: 2009 年6 月22 日 课程设计(论文)评审意见 (1)完成原理分析(20分):优()、良()、中()、一般()、差();(2)设计分析(20分):优()、良()、中()、一般()、差();(3)完成调试(20分):优()、良()、中()、一般()、差();(4)翻译能力(20分):优()、良()、中()、一般()、差();(5)回答问题(20分):优()、良()、中()、一般()、差();(6)格式规范性及考勤是否降等级:是()、否() 评阅人:职称: 年月日

编译技术课程设计A实验报告(华北电力大学科技学院)

课程设计报告 ( 2011-- 2012年度第1学期) 名称:编译技术课程设计A 院系:科技学院信息工程系班级:软件09k2 学号:0919******** 学生姓名:闫雪峰 指导教师:郭丰娟 设计周数: 2 成绩: 日期:2011年12 月6日

《编译技术课程设计A》 任务书 一、目的与要求 1. 理解和掌握编译程序设计原理及常用的技术,建立编译程序的整体概念; 2. 理解和掌握编译程序词法分析、语法分析、语义分析、中间代码生成和目标代码生成等几个关键环节原理和实现算法; 3. 掌握软件模块设计技能;熟悉并能较好地利用软件开发环境独立编程、调试和分析程序运行情况,逐渐形成创新思维和从事系统软件的研究和开发能力。 二、主要内容 定义一个简化的类C语言—L语言作为源语言,重点针对词法分析、语法分析、语义分析、中间代码生成和目标代码生成等几个关键环节进行编程和调试训练,最终设计实现L 语言的编译程序。 通过调试L编译程序,了解一般编译程序的总体框架,掌握编译各阶段程序的构造,理解和掌握错误处理方法及符号表的组织方式,理解和掌握语法制导翻译方法。还可以适当扩展L语言成分,并对相应的编译程序进行扩充。可使用C、VC++等语言编程实现。 具体内容包括: 1.由单词的语法规则出发、画出识别单词的状态转换图,然后用程序实现扫描器设计。 2.设计、编写和调试算法优先分析程序,了解算法优先分析器的组成结构以及对文法 的要求,掌握实现通用算法优先分析算法的方法。 3.在算符优先分析文法的基础上进行翻译工作,生成四元式表; 4.设计一个简单的代码生成器,该代码生成器以基本块为单位,依次将每条中间代码 变换成相应的目标代码。 5.综合以上实验的结果,并进行集成与设计,开发出一个小型编译程序。 对于各项主要内容的实现细节描述和指导,请参考《计算机综合实践指导》编译技术的相关内容。 三、进度计划

CMinus词法分析和语法分析设计编译器编译原理课程设计报告书

编译原理课程设计报告 课题名称:C- Minus词法分析和语法分析设计 提交文档学生姓名:X X X 提交文档学生学号:XXXXXXXXXX 同组成员名单:X X X 指导教师姓名:X X 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间:2015年6月10日

1.课程设计目标 实验建立C-编译器。只含有扫描程序(scanner)和语法分析(parser)部分。 2.分析与设计 C-编译器设计的整体框架,本实验实现扫描处理和语法分析程序(图中粗黑部分)。 2.1 、扫描程序scanner部分 2.1.1系统设计思想 设计思想:根据DFA图用switch-case结构实现状态转换。 惯用词法:

①语言的关键字:else if int return void while ②专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */ ③其他标记是ID和NUM,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9 大写和小写字母是有区别的 ④空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM 关键字。 ⑤注释用通常的C语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套 scanner的DFA

说明:当输入的字符使DFA到达接受状态的时候,则可以确定一个单词了。初始状态设置为START,当需要得到下一个token时,取得次token的第一个字符,并且按照DFA与对此字符的类型分析,转换状态。重复此步骤,直到DONE为止,输出token类型。当字符为“/”时,状态转换为SLAH再判断下一个字符,如果为“*”则继续转到INCOMMENT,最后以“*”时转到ENDCOMMENT状态,表明是注释,如果其他的则是字符停滞于当前字符,并且输出“/”。 2.1.2程序流程图

编译原理 C++编译器课程设计报告

编译器的设计与分析 学号: 1233050143 姓名:李博 专业:计算机科学与技术 __ 课程:编译原理 指导教师:闫红

实验目的 本实验设计的小型编译程序涉及到编译前端的三个阶段:词法分析、语法分析和语义分析生成中间代码 ((四元式),编译程序的重点放在中间代码生成阶段。编译程序的输出结果包括词法分析后的二元式序 列、变量名表;语法分析后的状态栈分析过程显示;语义分析生成中间代码后的四元式程序。整个程序 分为三个部分:(1)词法分析部分(2)语法分析、语义分析及四元式生成部分(3)输出显示部分 实验要求: 本程序仅考虑由下面产生式所定义的程序语句: S →if B then S else S | while B do S | begin L end | A L →S;L | S A →i:= E B →B∧B|B∨B|~B|(B)|I rop i|i

其中,各个非终结符的含义是: S---语句 L—语句串 A—赋值句 B---布尔表达式 E---算术表达式 各个终结符的含义: i---整型变量或常数,布尔变量或常数; rop---为六种关系运算符的代表; ;---起语句分隔作用; :=---赋值符号 ~--逻辑非运算符; ∧----逻辑与运算符; ∨---逻辑或运算符; 规定程序是由一条语句或由begin和end嵌套起来的复合语句组成的,并且规定的语句末加上#@表示程序结束。下面是符合规定的程序示例:begin A:=A+B*C; C:=A+2; while AB do

if M=N THEN C:=D else while A<=D do A:=D end#@ 实验内容: 第一部分:词法分析 一.词法分析的功能: 输入:所给文法的源程序字符串 输出:1.二元组(单词种别,单词符号的属性值)构成的序列 2.关键字: { (相当于Pascal语言中的begin) , if ,else , while , }(相当于 Pascal语言中的end ) 所有的关键字都是小写字母. 3.运算符: + , - , * , / , = , < , <= , == , > , >= ,<> , && ,|| , ! 4.界符: 逗号,分号,左圆括号, 右圆括号, # 5.常数: 在这里只涉及到int型常量 6.其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义: ID = letter(letter|digit)* NUM = digit digit * 7.空格由空白,制表符和换行符组成,空格一般用来分隔ID,NUM,运算符,界符和关键字,词法分析阶段通常会被过滤掉。 二.词法分析程序设计

编译原理课程设计

先简要分析一下语法分析的大致流程: 当有句子要进行处理时,首先要对其进行词法分析来分解出该句子中的每个符号,然后将该句子按照算符优先算法压入归约栈中,如果可以顺利归约,则说明这是一个合法的句子,否则该句子非法。 这里有一个需要考虑的地方,就是如何进行归约。由于文法已经给定,所以我们考虑设计一个文法表,文法表中的内容就是可归约串的种别码的顺序,比如v=E可以表示为9,1,13。这样的话当我们要进行一次归约时,只用按顺序存储最左素短语中符号的种别码,然后拿这个种别码序列与文法表进行匹配,就可知道当前归约需要执行哪些操作。 还有一点需要注意,就是如何对一个表达式进行求值。这里需要我们设计一个二元组的变量名表,这个变量名表可以根据变量的名称来返回变量的数据。变量名表的具体设计见详细设计部分。 由于是简化分析,所以这个程序只考虑整数的处理。 有了上面的分析,可以构造出算符优先分析算法的流程图,如下图所示。

详细设计 (1)词法分析部分 由于词法分析的内容在课程设计1中已经介绍,并且这次的状态转换图与课程设计1中的非常相似,所以这里就不过多介绍。(2)优先关系表 在程序中我们用一个二维数组priTable[][]来存储算符间的优先关系。priTable[a][b]=1表示a>b; 。priTable[a][b]=0表示a=b; 。priTable[a][b]=-1表示a

(重庆理工大学计算机学院)编译原理课程设计报告

编译原理课程设计报告 实验名称编译原理课程设计 班级 学号 姓名 指导教师 实验成绩 2013 年06月

一、实验目的 通过设计、编写和调试,将正规式转换为不确定的有穷自动机,再将不确定的有穷自动机转换为与之等价的确定的有穷自动机,最后再将确定有穷自动机进行简化。 通过设计、编写和调试构造LR(0)项目集规范簇和LR分析表、对给定的符号串进行LR分析的程序,了解构造LR(0)分析表的步骤,对文法的要求,能够从文法G出发生成LR(0)分析表,并对给定的符号串进行分析。 二、实验内容 正规式——>NFA——>DFA——>MFA 1.正规式转化为不确定的有穷自动机 (1)目的与要求 通过设计、编写和调试将正规式转换为不确定的有穷自动机的程序,使学生了解Thompson算法,掌握转换过程中的相关概念和方法,NFA的表现形式可以是表格或图形。 (2)问题描述 任意给定一个正规式r(包括连接、或、闭包运算),根据Thompson算法设计一个程序,生成与该正规式等价的NFA N。 (3)算法描述 对于Σ上的每个正规式R,可以构造一个Σ上的NFA M,使得L(M)=L(R)。 步骤1:首先构造基本符号的有穷自动机。 步骤2:其次构造连接、或和闭包运算的有穷自动机。

(4)基本要求 算法实现的基本要求是: (1) 输入一个正规式r; (2) 输出与正规式r等价的NFA。(5)测试数据 输入正规式:(a|b)*(aa|bb)(a|b)* 得到与之等价的NFA N

(6)输出结果 2.不确定的有穷自动机的确定化 (1)目的与要求 通过设计、编写和调试将不确定的有穷自动机转换为与之等价的确定的有穷自动机的程序,使学生了解子集法,掌握转换过程中的相关概念和方法。DFA的表现形式可以是表格或图形。(2)问题描述 任意给定一个不确定的有穷自动机N,根据算法设计一个程序,将该NFA N变换为与之等价的DFA D。 (3)算法描述 用子集法将NFA转换成接受同样语言的DFA。 步骤一:对状态图进行改造 (1) 增加状态X,Y,使之成为新的唯一的初态和终态。从X引ε弧到原初态结点, 从原终态结 点引ε弧到Y结点。 (2) 对状态图进一步进行如下形式的改变

编译原理课程设计 C语言编译器的实现

编译原理课程设计报告 设计题目编译代码生成器设计 学生姓名 班级 学号 指导老师 成绩

一、课程设计的目的 编译原理课程兼有很强的理论性和实践性,是计算机专业的一门非常重要的专业基础课程,它在系统软件中占有十分重要的地位,是计算机专业学生的一门主修课。为了让学生能够更好地掌握编译原理的基本理论和编译程序构造的基本方法和技巧,融会贯通本课程所学专业理论知识,提高他们的软件设计能力,特设定该课程的课程设计,通过设计一个简单的PASCAL语言(EL语言)的编译程序,提高学生设计程序的能力,加深对编译理论知识的理解与应用。 二、课程设计的要求 1、明确课程设计任务,复习编译理论知识,查阅复印相关的编译资料。 2、按要求完成课程设计内容,课程设计报告要求文字和图表工整、思路清晰、算法正 确。 3、写出完整的算法框架。 4、编写完整的编译程序。 三、课程设计的内容 课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于编译的知识量较复杂而且综合性较强,因而对一个完整的编译程序不适合平时实验。通过课程设计可以达到综合设计编译程序的目的。本课程的课程设计要求学生编写一个完整的编译程序,包括词法分析器、语法分析器以及实现对简单程序设计语言中的逻辑运算表达式、算术运算表达式、赋值语句、IF语句、While语句以及do…while语句进行编译,并生成中间代码和直接生汇编指令的代码生成器。 四、总体设计方案及详细设计 总体设计方案: 1.总体模块 主程序 词法分析程序语法分析 程序 中间代码 生成程序

2. 表2.1 各种单词符号对应的种别码 单词符号种别码单词符号种别码bgin 1 :17 If 2 := 18 Then 3 < 20 wile 4 <> 21 do 5 <= 22 end 6 > 23 lettet(letter|digit)* 10 >= 24 dight dight* 11 = 25 + 13 ;26 —14 ( 27 * 15 ) 28 / 16 # 0 详细设计: 4.1界面导入设计 (1)一共三个选项: ①choice 1--------cifafenxi ②choice 2--------yufafenxi ③choice 3--------zhongjiandaima (2)界面演示 图一

编译原理课程设计报告

编译原理课程设计报告 实验1:用Lex设计词法分析器1 实验目的:学会用lex设计一个词法分析器。 实验内容:使用lex为下述文法语言写一个词法分析器。 实验要求: 输入为用该语言所写的源程序文件;输出为记号序列,每个记号显示为二元组(记号名,记号属性值)的形式。输出可以在屏幕上,也可以输出到文件中。不要求建立符号表。 在cygwin下用flex和gcc工具将实验调试通过,并能通过例子parser0中testcases目录下的测试例的测试。 实验参考:和。 语言文法: <程序>? PROGRAM <标识符> ; <分程序> <分程序>? <变量说明> BEGIN <语句表> END. <变量说明> ? VAR <变量说明表>;

<变量说明表>?<变量表>: <类型> | <变量表>: <类型>; <变量说明表> <类型>? INTEGER | REAL <变量表>? <变量> | <变量>, <变量表> <语句表>? <语句> | <语句>; <语句表> <语句>? <赋值语句> | <条件语句> | | <复合语句> <赋值语句>?<变量> := <算术表达式> <条件语句>? IF <关系表达式> THEN <语句> ELSE <语句> ? WHILE <关系表达式> DO <语句> <复合语句> ? BEGIN <语句表> END <算术表达式> ? <项> | <算术表达式> + <项> | <算术表达式> - <项> <项> ? <因式> | <项> * <因式> | <项> / <因式> <因式>? <变量> | <常数> | (<算术表达式>) <关系表达式>? <算术表达式> <关系符> <算术表达式>

编译技术课程设计报告模板静

编译技术课程设计 班级网络1102 学号3110610035 姓名徐静 指导老师年轶 2014年6 月

目录 一、目的 (2) 二、题目 (2) 三、要求 (2) 四、实验环境 (2) 五、系统实现 (2) 六、程序运行结果 (8) 七、总结 (9)

一、目的 通过《编译原理》课程设计进一步理解高级语言在计算机中的执行过程,加深对编译原理中重点算法和编译技术的理解,掌握词法分析、语法分析、语义分析、代码生成和报错处理等理论与实践的结合,提高自己的编程能力,培养好的程序设计风格。同时通过某种可视化编程语言的应用,具备初步的Windows环境下的编程思想。 二、题目 输入文法,自动生成分析表,并完成语法分析工作 三、要求 题目3 文法编译器的自动生成器 输入文法,自动生成分析表,并完成语法分析工作。 语法分析方法可以是:LL(1)分析法或LR分析法。 为文法构造分析表,并对输入串进行语法分析,判别是否符合语法规则,如果不符合,则输出错误信息。 输入:文法,文法符号串 输出:分析表、分析栈、分析结果 四、实验环境 开发环境Visual Studio6.0 语言C++ 五、系统实现 1.分析方法说明 所谓LL(1)分析法,就是指从左到右扫描输入串(源程序),同时采用最左推导,且每次直接推导只需向前看一个输入符号,便可确定当前所应当选择的规则。实现LL(1)分析的程序又称为LL(1)分析程序或LL(1)分析器。 我们知道一个文法要能进行LL(1)分析,那么这个文法应该满足:无二义性,无左递归,无左公因子。当文法满足条件后,再分别构造文法每个非终结符的FIRST和FOLLOW集合,然后根据FIRST和FOLLOW集合构造LL(1)分析表,最后利用分析表,根据LL(1)语法分析构造一个分析器。LL(1)的语法分析程序包含了三个部分,总控制程序,预测分析表函数,先进先出的语法分析栈,本程序也是采用了同样的方法进行语法分析,该程序是采用了C++语言来编写。 2.分析表的构造算法 在构造LL(1)预测分析表之前,首先要构造该文法的每个非终结符的FIRST和FOLLOW 集合,按照下面描述的算法来构造这两个集合。 ①FIRST集合的构造算法: (1)若X∈VT,则FIRST(X)={X}。 (2)若X∈VN,且有产生式X→a……,则把a加入到FIRST(X)中;若X→ε也是一条产生式,则把ε也加到FIRST(X)中。 (3)若X→Y……是一个产生式且Y∈VN,则把FIRST(Y)中的所有非ε-元素都加到FIRST(X)中;若X→Y1Y2…Yk是一个产生式,Y1,…,Yi-1都是非终结符,而且,对于任何j,1≤j

编译课程设计

课程设计报告 课程设计名称:编译技术 系别:三系 学生姓名: 班级:软件班 学号: 成绩: 指导教师: 开课时间:学年学期

一.设计题目 (1) 二.主要内容 (1) 三.具体要求 (1) 四.进度安排 (1) 五.成绩评定 (2) 六.设计思路 (2) 6.1 单词符号及种别表 (2) 6.2 SLR的分析表 (3) 6.21 算术表达式的SLR(1)分析表 (3) 6.22 布尔表达式的LR分析表 (4) 6.23 程序语句的LR分析表 (5) 七.程序运行结果截图 (6) 八.设计体会 (10)

一.设计题目 设计和实现一个简单的小型高级程序设计语言的编译器 二.主要内容 自定义一种简单的小型高级程序设计语言,采用任意一种编程语言和编程工具设计并实现其编译器,展示编译系统中词法分析和语法分析(LR分析方法)的全过程。 三.具体要求 3.1对单词的构词规则有明确的定义; 3.2编写的词法分析程序能够正确识别源程序中的单词符号; 3.3识别出的单词以<种别码,值>的二元式形式保存并输出; 3.4构造出程序设计语言各语法单位的SLR(1)分析表 (其他分析表亦可); 3.5能够对输入的源程序做出正确的语法分析并输出清晰的结果; 3.6高级语言的规模不易过大,注重编译器内核的设计,对于界面无要求; 3.7课程设计报告中应对所自定义高级语言进行简单描述,对编译器的设计进行简单的需求分析,给出设计说明和程序结构框架,阐明设计思路、用到的原理和方法。 3.8不可更改课程设计报告中已有的字体和格式,课程设计报告中新加入内容,汉字采用宋体五号字,英文字符和数字采用Times New Roman五号字,行距全部采用单倍行距。 3.9课程设计报告中的运行结果应以程序运行截图形式出现。 3.10程序源代码以附件形式发送至指定邮箱:sqckcsj2011@https://www.wendangku.net/doc/fa1514683.html,。附件名称为:“完整学号+姓名” 四.进度安排

编译技术课程设计

编译技术课程设计 一、目的 <<编译技术>>是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。 二﹑题目 题目1 表达式的小型编译器 题目2 程序的小型编译器 题目3 输入文法,自动生成分析表,并完成语法分析工作。 因时间关系,只要求选做一个题目,请每位同学根据自己的情况选择难度适宜的题目来完成。 三、要求 题目1表达式的小型编译器 1.词法分析产生语言的单词序列 2.语法分析能识别由加+ 乘* 括号()操作数(变量或常数)所组成的算术表达式,其文法如下: E→E+T|T T→T*F|F F→(E)|i 使用的分析方法可以是:递归下降分析法或LR分析法。 3.中间代码生成产生上述算术表达式的中间代码 4.错误处理给出错误信息 输入:算术表达式 输出:符号表,常数表。 递归下降分析法:递归调用过程 LR分析法:语义栈和符号栈 四元式序列 题目2程序的小型编译器 1.词法分析产生语言的单词序列 2.语法分析 (1)识别由加+ 乘* 括号()操作数所组成的算术表达式 (2)识别布尔表达式 (3)识别条件语句 (4)识别循环语句 3.中间代码生成产生包含上述语句的程序的中间代码 4.错误处理错误定位及出错信息 输入:程序 输出:符号表,常数表。

递归下降分析法:递归调用过程 LR分析法:语义栈和符号栈 四元式序列 题目3文法编译器的自动生成器 输入文法,自动生成分析表,并完成语法分析工作。 语法分析方法可以是:LL(1)分析法或LR分析法。 为文法构造分析表,并对输入串进行语法分析,判别是否符合语法规则,如果不符合,则输出错误信息。 输入:文法,文法符号串 输出:分析表、分析栈、分析结果 四、任务 题目1表达式的小型编译器 1.扩充单词 词法分析器可以识别题目(算术表达式)中包含的各类单词。 2.语法分析程序调用词法分析器 算术表达式里可以有变量、常数,而不是固定的i或以i开头的标识符。 3.增加语义分析 (1)递归下降分析法 语法制导翻译程序参考课本P135 定义:数据结构、函数、主程序、递归子程序 (2) LR分析法 语义子程序参考课本P110 分析表参考《习题解析与上机指导》P88 定义:数据结构、函数、分析表、控制程序、语义子程序 4.出错处理 给出错误信息 题目2程序的小型编译器 1.扩充单词 词法分析器可以识别题目(算术表达式、布尔表达式、条件语句、循环语句)中包含的各类单词。 2.语法分析程序调用词法分析器 3.增加语义分析 (1)布尔表达式的语法制导翻译 语义子程序参考课本P114 分析表参考《习题解析与上机指导》P89 定义:数据结构、函数、分析表、控制程序、语义子程序 (2)控制结构的语法制导翻译 语义子程序参考课本P120 分析表参考《习题解析与上机指导》P90 定义:数据结构、函数、分析表、控制程序、语义子程序

编译技术课程设计报告书

课程设计报告 ( 2013 – 2014 年度第1学期) 名称:编译技术课程设计A 题目:L语言编译器的设计与实现院系:计算机系 班级:软件1101 学号: 学生姓名: 指导教师:鲁斌王新颖 设计周数: 2 周 成绩: 日期:2013 年12 月27 日

《编译技术》课程设计 任务书 一、目的与要求 1.任务:实现一个简单的编译程序,能够对指定程序设计语言进行编译。 2.目的:加深对课堂讲授知识的理解,熟练掌握编译程序设计原理及常用的技术,建立编译程序的整体概念,使得学生初步具有研究、设计、编制和调试编译程序的能力。 3.要求:熟悉有关定义、概念和实现算法,设计出程序流程框图和数据结构,编写出完整的源程序,进行静态检查,设计出输入数据、显示输出数据;基本功能完善,方便易用,操作无误;通过课程设计学会编译程序设计与实现的常用技术,具备初步分析、设计和开发编译程序的能力,具备分析与检查软件错误、解决和处理实验结果的能力。 4.学生要求人数:2人,1人负责扫描器和目标代码生成器的设计和实现,另1人负责语法分析器和语法制导翻译程序的设计和实现。 二、主要内容 下面是课程设计主要内容的简介,详细内容请见《编译技术课程设计指导书》。 1.扫描器设计 该扫描器是一个子程序,其输入是源程序字符串,每调用一次输出一个单词符号。为了避免超前搜索,提高运行效率,简化扫描器的设计,假设程序设计语言中,基本字不能用作一般标识符,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。 2.语法分析器设计 以算法优先分析方法为例,设计一个算符优先语法分析程序。算符优先分析属于自下而上的分析方法,该语法分析程序的输入是终结符号串(即单词符号串,以一个“#”结尾),如果输入串是句子则输出“YES”,否则输出“NO”和错误信息。当然,也可采用预测分析等方法设计语法分析器,具体方法自定。 3.语法制导翻译程序设计 采用语法制导翻译方法,实现算术表达式、赋值语句和基本控制语句等的翻译。本语法制导翻译程序的输入是终结符号串(即单词符号串,以一个“#”结尾),如果输入符号串是句子,则按照其语义进行翻译,输出等价的四元式序列。 4.目标代码生成器设计 将程序设计语言的中间代码程序翻译为目标代码程序,其输入是四元式序列,输出是一个汇编代码文件。

编译原理课设报告2

编译原理课程设计题目:pl/0编译程序的改进与完善 学生所在学院:信息科学与工程学院 学生所在班级:06级计算机软件1班 学生姓名: 学生学号: 指导教师:张世辉

一、课设目的: 1.阅读、研究、改进、设计和调试一个简单的编译程序; 2.加深对编译程序理论和编译过程的理解。 二、课设内容: 1扩充语句for(<语句>;<条件>;<语句>)<语句>; 2扩充语句if <条件> then <语句> else <语句>; 3扩充语句repeat <语句>;until <条件>; 4增加自增自减运算++和—和+=,-=运算; 5修改不等号#,为!=; 6增加一维数组 声明格式:[/:/]; 赋值格式:[]:=<表达式>; 调用格式:[] 三、程序结构: 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,

编译原理词法分析器语法分析课程设计报告书

《编译原理》 课程设计 院系信息科学与技术学院 专业软件工程 年级 2011级 学号 20112723 姓名林苾湲 西南交通大学信息科学与技术学院 2013年 12月

目录 课程设计1 词法分析器 (2) 1.1 设计题目 (2) 1.2 设计容 (2) 1.3 设计目的 (2) 1.4 设计环境 (2) 1.5 需求分析 (2) 1.6 概要设计 (2) 1.7 详细设计 (4) 1.8 编程调试 (5) 1.9 测试 (11) 1.10 结束语 (13) 课程设计2 赋值语句的解释程序设计 (14) 2.1 设计题目 (14) 2.2 设计容 (14) 2.3 设计目的 (14) 2.4 设计环境 (14) 2.5 需求分析 (15) 2.6 概要设计 (16) 2.7 详细设计 (16) 2.8 编程调试 (24) 2.9 测试 (24) 2.10 结束语 (25)

课程设计一词法分析器设计 一、设计题目 手工设计c语言的词法分析器(可以是c语言的子集)。 二、设计容 处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。 三、设计目的 了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。 四、设计环境 该课程设计包括的硬件和软件条件如下: 4.1.硬件 (1)Intel Core Duo CPU P8700 (2)存4G 4.2.软件 (1)Window 7 32位操作系统 (2)Microsoft Visual Studio c#开发平台 4.3.编程语言 C#语言 五、需求分析 5.1.源程序的预处理:源程序中,存在许多编辑用的符号,他们对程序逻辑功能无任何影响。例如:回车,换行,多余空白符,注释行等。在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。 5.2.单词符号的识别并判断单词的合法性:将每个单词符号进行不同类别的划分。单词符号可以划分成5中。 (1)标识符:用户自己定义的名字,常量名,变量名和过程名。 (2)常数:各种类型的常数。 (3) 保留字(关键字):如if、else、while、int、float等。 (4) 运算符:如+、-、*、<、>、=等。 (5)界符:如逗号、分号、括号等。 5.3.将所有合法的单词符号转化为便于计算机处理的二元组形式:(单词分类号,单词自身值);以图形化界面显示出来。 5.4.可选择性地将结果保存到文件中。 六、概要设计 6.1.数据类型 6.1.1.单词的分类:本词法分析器演示的是C语言的一个子集,故字符集如下:

相关文档
相关文档 最新文档