编译原理设计报告(设计符号表)

编译原理设计报告(设计符号表)
编译原理设计报告(设计符号表)

某某大学编译原理课程设计报告

设计符号表

专业计算机科学与技术

学生姓名

班级

学号

完成日期

编译原理课程设计

目录

1 前言 (2)

2 报告主体 (2)

2.1设计目的: (2)

2.2设计内容及要求: (2)

2.2.1 课程设计内容 (2)

2.2.2 设计符号表 (2)

2.2.3 测试范例: (3)

2.3实现原理 (3)

2.3.1 符号表的设计 (3)

2.4算法实现流程图 (4)

2.5结果输出及分析 (5)

2.6程序源代码 (6)

2.7心得体会 (9)

2.8参考文献 (9)

1 前言

在网络世界中,我们往往对功能强大的程序叹为观止。而这些强大程序的背后是编译这些程序的编译软件,是这些编译软件承托起了这些功能强大的运行程序。我们有不少的同志致其自身于无尽的运行程序上。而只有很少的人搞编译程序。这就是为什么中国的可运行程序满天飞,而编译程序却很少。本课程设计就是在这方面的探索,为你解读编译程序的奥秘。

课程设计题目选择5个题目中的一个,要求根据自己的兴趣和能力,选择一个对自己意义甚大的题目。课程设计基本原理是在实践上,实现我们在课程上学习到的理论知识。通过理论联系实践,更好的掌握课本上的理论知识。

2 报告主体

2.1设计目的:

学生在学习《编译原理》课程设计中,结合各章节的构造编译程序的基本理论,总共用一周的时间完成课程设计。要求用C或C++语言描述及上机调试,实现五个题目中任意一个,是学生将理论与实际应用结合其,起来,受到软件设计等开发过程的全面训练,从而提高学生软件开发的能力。

2.2设计内容及要求:

2.2.1 课程设计内容

设计符号表

2.2.2 设计符号表

确定符号表的组织方式,一般应包括名字栏和信息栏,其中名字栏作为关键字。要考虑能够存储有关名字的信息,并可以高效地完成如下操作:

1.查找:根据给定的名字,在符号表中查找其信息。如果该名字在符号表中不

编译原理课程设计

存在,则将其加入到符号表中,否则返回指向该名字的指针;

2.删除:从符号表中删除给定名字的表项。

2.2.3 测试范例:

procedure test;

var b,c,i:integer;

begin

b:=1;

if a>b then

c:=a+b

else

c:=a-b;

for i:=0 to 3 do

begin

c:=i;

end;

end;

2.3 实现原理

2.3.1 符号表的设计

1.符号表的结构

#include

#include

#include

#include

struct

{ int m;

char name[20];

char inf[20];

}co[999];

int num;

include 称为文件包含命令,其意义是把尖括号""或引号<>内指定的文件包含到本程序中,成为本程序的一部分。被包含的文件通常是由系统提供的,其扩展名为.h 而stdio为standard input output的缩写,意为“标准输入输出” .。#include这是C语言/C++中的字符串处理函数的头文件。#include 是用作字符处理的,#include 是用于定义杂项函数及内存分配函数,最后是一个结构函数,分别定义了符号名,信息,个数等变量。

2.符号显示

在C-Free 中用了void display(),将已经输入进系统的符号全部都显示出来 3. 符号查找

本符号表系统中用void find() ,并通过for 循环将所要查找的符号及其信息全都显示出来。如果查找的字符存在,则在显示之前,运用system(“cls ”)进行了清屏,把之前屏幕上所显示的内容全部清除,同时,在显示完成以后,又用了if 语句判断是否要删除此符号及其信息。如果要删除信息,则将该符号中的数拷贝到另一个数组中去。如果查找的字符不存在,则提示是否添加此字符。 4. 符号添加

采用void add(),将需要添加的符号及其信息添加进系统,还是通过使用for 语句,将符号信息一个个地输入进系统。

2.4 算法实现流程图

开始

初始化变量和数组

输入查找的字符

字符存在

添加符号

删除符号

添加到文件

在文件中删除

Y

N

Y

Y

N

N

查找字符

Y

退出

N

编译原理课程设计2.5结果输出及分析

系统首页显示:

添加一个符号后显示如下:

按1查找后显示如下:

按Y删除符号后显示如下:

按1查找后显示如下:

按Y添加符号后显示如下:

2.6 程序源代码

#include

#include

#include

#include

struct

{ int m;

char name[20];

char inf[20];

}co[999];

int num;

void display() /*符号显示*/

{ printf(" * * * * * * * * * * * * *\n");

printf(" ———————————符号表——————————————\n");

printf(" 符号信息\n");

printf(" ————————————————————————————————\n");

for(int i=0;i

{

printf("%19s",co[i].name);

printf("%34s\n",co[i].inf);

}

printf(" ————————————————————————————————\n");

printf(" * * * * * * * * * * * * *\n");

printf(" 目前为止已有%d个符号\n\n",num); }

void find() /*符号查找*/

{ int i;

system("cls");

printf("请输入你想要查找的符号名:");

char f[20];

scanf("%s",&f);

编译原理课程设计

printf(" * * * * * * * * * * * * *\n");

printf(" ———————————符号表——————————————\n");

printf(" 符号信息\n");

printf(" ————————————————————————————————\n");

for( i=0;i

{

if(strcmp(co[i].name,f)==0)

{ printf("\n\n");

printf(" %7s ",co[i].name);

printf("%24s\n\n\n",co[i].inf);

printf(" ————————————————————————————————\n");

printf(" * * * * * * * * * * * * *\n");

printf("是否要删除此符号Y or N ?: ");

char p;

scanf("%s",&p);

if(p=='Y'||p=='Y')

{

strcpy(co[i].name,co[num-1].name);

strcpy(co[i].inf,co[num-1].inf);

co[num-1].m==0;

num--;

printf("此符号已经删除!\n\n");

}

return;

}

}

if(i>=num)

{ char z[20];

strcpy(z,f);

printf("没有要查找的符号,是否要添加此符号Y or N?: ");

char p;

scanf("%s",&p);

if(p=='Y'||p=='Y')

{ co[num].m==1;

strcpy(co[num].name,z);

printf("请输入此符号信息:");

char x[20];

scanf("%s",&x);

strcpy(co[num].inf,x);

num++;

co[num].m==0;

printf("此符号添加成功!\n\n");

}

}

}

void add() /*符号添加*/

{

int k;

printf("此表为空,请输入需要添加的符号个数:");

scanf("%d",&k);

for(int i=0;i

{ char a[20],b[20]; int c;

c=i+1;

co[i].m=1;

printf("第%d个符号名:",c);

scanf("%s",&a); strcpy(co[i].name,a);

printf("第%d个符号信息:",c);

scanf("%s",&b); strcpy(co[i].inf,b);

}

co[k].m=0;

}

void menu()

{

printf(" * * * * * * * * * * * * *\n");

printf(" ———————————符号表——————————————\n");

printf(" 目前为止已有%d个符号\n\n",num); }

void main()

{

FILE *in;

if((in=fopen("data","r+"))==NULL)

{

printf("Can not open!\n");

exit(0);

}

int i=0; fscanf(in,"%d",&co[i].m);

if(co[i].m==0)

{ printf(" * * * * * * * * * * * * *\n");

printf(" ———————————符号表——————————————\n");

add();

}

while(co[i].m)

{

fscanf(in,"%s",&co[i].name);

fscanf(in,"%s",&co[i].inf);

i++;

fscanf(in,"%d",&co[i].m);

}

num=i;

int t;

do

{

system("cls"); display();

printf(" 进行查找请按1;\n 退出系统请按2.\n\n");

scanf("%d",&t);

if(t==1)

{ system("cls"); display();

menu();

find();

}

else if(t!=2&&t!=1)

{

printf("输入有误!\n\n");

t=1;

}

}while(t==1);

if((in=fopen("data","w+"))==NULL)

{

printf("Can not open!\n");

exit(0);

}

for(int i=0;i

编译原理课程设计

{ fprintf(in,"%d ",co[i].m=1);

fprintf(in,"%s ",co[i].name);

fprintf(in,"%s\n",co[i].inf);

}

fprintf(in,"%d ",co[num].m=0);

fclose(in);

}

2.7 心得体会

为期一周的编译原理的课程设计到今天终于画下了完美的句号,这其中的酸甜苦辣简直是难以言喻,从原先的艰难,一点都没有头绪到现在内心的欣喜;从之前连编译都不能通过,到现在的大功告成,中间经历了很多很多。从中我学习了很多,了解了很多,知道了很多,在这里,我来总结几点如下:

一、对实验原理有更深的理解

通过编译原理课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识师机械的,表面的。通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解。

二、对该理论在实践中的应用有深刻的理解

通过把该算法的内容,算法的执行顺序在计算机上实现,知道和理解了该理论在计算机中是怎样执行的,对该理论在实践中的应用有深刻的理解。

三、激发了学习的积极性

通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。以前对与计算机操作系统的认识是模糊的,概念上的,现在通过自己动手做实验,从实践上认识了操作系统是如何处理命令的,如何协调计算机内部各个部件运行,对计算机编译原理的认识更加深刻。在这次课程设计中,我就是按照实验指导的思想来完成。加深了理解文件系统的内部功能及内部实现,培养实践动手能力和程序开发能力的目的。

2.8参考文献

《编译原理》,吕映芝|、张素琴、蒋维杜编著,清华大学出版社

《编译原理》,alfred V.Aho等,李建中译,机械工业出版社

编译原理课程设计

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

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

编译原理课程设计报告_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)格式规范性及考勤是否降等级:是()、否() 评阅人:职称: 年月日

编译原理课程设计

编译原理课程设计报告 课题名称: C-语言编译器设计(scanner和parser) 提交文档学生姓名: 提交文档学生学号: 同组成员名单:无 指导教师姓名:金军 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间: 2011年 6 月 17 日

1.课程设计目标 设计C-Minus编译器分为scanner和parser两个部分。scanner主要作用是对目标代码进行扫描,列出关键字,变量等内容;parser主要对语法进行分析并生成语法树。 2.分析与设计 ●实现方法:代码用C语言编译而成。其中scanner为手工实现,主要采用switch-case结构实现 状态转换;parser部分采用递归下降分析方法实现。 ●扫描器:C-的词法如下: 1、语言的关键字:i f el se i nt return void while 2、专用符号:+ - * /< <= > >= == != =; , ( ) [ ] { } /* */ 3、其他标记是变量(ID)和数字(NUM),通过下列正则表达式定义: ID = letter letter* NUM = di git digi t* letter = a|..|z|A|..|Z digi t = 0|..|9 4、空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM关键字 5. 注释用通常的C语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在 标记内)上,且可以超过一行。注释不能嵌套 其DFA图如下:

分析器:以下为C-的语法规则BNF:

常用中文标点符号与键盘对照表

汉字输入方法与技巧 一、实验目的 1.熟练掌握一种汉字输入方法 2.熟练掌握中英文切换、不同输入法间的切换方法 3.初步掌握中文标点的输入 4.会基本使用Windows 2000的应用程序写字板 二、相关知识要点 输入汉字是我们炎黄子孙学习计算机必须掌握的内容,也是省计算机等级考试必考的内容。快速的汉子输入将会对我们的学习和工作带来极大的方便。智能ABC(标准)输入法具有使用方便、自动造词、智能处理等特点;其使用方法在教材中已有较详尽介绍,这里仅作一简单总结。 (一)中英文输入基本操作 1.中英文切换方法:Ctrl +空格 2.不同输入法间的切换方法:Ctrl + Shift 3.中文标点的输入 ?中英文标点的切换:通常在输入中文时应使用中文标点,而在输入英文时应使用英 文标点。切换的方法是用输入法状态窗口中的“”图标,当前显示的是中文表点。 或用快捷键“Ctrl +句号”进行切换。 ?常用中文标点符号与键盘对照表见表1。 表1 常用中文标点符号与键盘对照表 中文标点键位(ABC等) 紫光中文标点键位(ABC等) 紫光 。句号. . 《〈双、单书名号< < ,逗号, , 〉》单、双书名号> > ;分号; ; ……省略号^ ^ :冒号: : ——破折号_ _ 问号、顿号\ / !感叹号! ! ·间隔号@ “”双引号“”“”¥人民币符号$ $ ‘’单引号‘’‘’—连接号& ()括号( ) ( ) 说明:使用键盘中的上档键应按住“Shift”键 自动配对指第一次输入时为左引号、左书名号等,再输入时为右引号、左书名号

等; 自动嵌套指第一次输入时为双书名号,在配对前再按时为单书名号;注意在左“<” 右“>”键单独输入太多时,会感觉找不到配对符号。 (二)中文输入 1.输入汉字时一般用,前后翻页;也可设置为键盘上的“=”向后翻页和“-” 向前翻页; 2.在输入词组时可以用完全拼音,也可以省去韵母(或省去部分字的韵母)。 3.在输入姓名等常使用的文字时,可以造词,以提高输入速度;在造词时应一次输入 所有字的完全拼音,并按回车挑选各单字(紫光输入法只要直接挑选各单字即可)。 4.英文和数字的输入 ?大写字母的输入:按下大写锁定键(Caps Lock)即可输入大写字母; ?小写字母的输入:按下锁定键(Caps Lock)后按下Shift键则输入的为小写字母。 但更常用的是利用“Ctrl +空格”转换成英文后输入。(紫光输入法中只要直接输 入大小写英文,按回车输入) ?一般数字可在输入中文或英文时直接输入。 5.量词“七”、“柒”等的快速输入 量词“七”、“柒”等可以和一般汉字一样输入,但可以使用更为方便直接的方法,如在输入中文时直接键入“i7”则输入“七”,而键入“I7”时输入“柒”。

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

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

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

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

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程序流程图

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

编译原理课程设计报告 实验名称编译原理课程设计 班级 学号 姓名 指导教师 实验成绩 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) 对状态图进一步进行如下形式的改变

编译原理课程设计

编译原理课程设计 自顶向下语法分析器 学院(系):计算机科学与技术学院学生姓名:xxxxxxxxx 学号:xxxxxxxxx 班级:电计1102 大连理工大学 Dalian University of Technology

目录

1 系统概论 语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。语法分析器在编译程序中的地位如图1所示: 图1 语法分析器在编译程序中的地位 语言的语法结构是用上下文无关文法描述的。因此,语法分析器的工作本质上就是按文法的产生式,识别输入符号串是否为一个句子。这里所说的输入串是指由单词符号(文法的终结符)组成的有限序列。对一个文法,当给你一串(终结)符号时,怎样知道它是不是该文法的一个句子呢?这就要判断,看是否能从文法的开始符号出发推导出这个输入串。或者,从概念上讲,就是要建立一棵与输入串相匹配的语法分析树。 自顶向下分析法就是语法分析办法中的一类。顾名思义,自顶向下就是从文法的开始符号出发,向下推导,推出句子。这种方法是带“回溯”的。 自顶向下分析的主旨是,对任何输入串,试图用一切可能的办法,从文法开始符号(根结)出发,自上而下地为输入串建立一棵语法树。或者说,为输入串寻找一个最左推导。这种分析过程本质上是一种试探过程,是反复使用不同产生式谋求匹配输入串的过程。 实现这种自顶向下的带回溯试探法的一个简单途径是让每个非终结符对应一个递归子程序。每个这种子程序可作为一个布尔过程。一旦发现它的某个候选与输入串相匹配,就用这个候选去扩展语法树,并返回“真”值;否则,保持原来的语法树和IP值不变,并返回“假”值。 2 需求分析 以前,人们对语法的分析都建立在人工的基础上,人工分析虽然能够做到侧类旁推,但终究人力有限,再精密的分析都会出现或多或少的错误。为减少因人为产生的错误,并加快

编译原理课程设计报告

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 -

编译原理课程设计

编译原理: 编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。编译原理是计算机专业设置的一门重要的专业课程。编译原理课程是计算机相关专业学生的必修课程和高等学校培养计算机专业人才的基础及核心课程,同时也是计算机专业课程中最难及最挑战学习能力的课程之一。编译原理课程内容主要是原理性质,高度抽象。 编译原理课程设计: 《编译原理课程设计》是2007年11月浙江大学出版社出版的图书,作者是冯雁、鲁东明、李莹。 内容简介: 本书围绕着编译技术的基本原理和方法,以模拟程序设计语言SPL的编译器的设计和实现为主线,结合词法分析、语法分析、语义分析、代码生成、代码优化、错误处理等各个基本模块,对原理和实现方法进行了详细分析。该编译器可接受SPL的程序,并将其翻译成汇编语言程序,最终实现汇编语言到8086/8088机器语言的翻译。本书为编译技术等相关课程的实验提供了参考。在附件中还提供了三类不同类型和难度的实验题,可供课程实验选择。 第1章引论: 1.1本书介绍 1.2SPL语言的特点及实验安排

1.2.1SPL语言的特点 1.2.2SPL语言编译器的主要结构1.2.3实验安排 1.3平台的选择和介绍 1.3.1LEX简介 1.3.2YACC简介 第2章词法分析: 2.1词法分析器的基本框架 2.2词法分析器的基本原理 2.2.1DFA的构造和实现 2.2.2词法分析的预处理 2.2.3实现词法分析器的注意要点2.3词法分析器的实现 2.3.1SPL语言单词属性字 2.3.2SPL词法分析器的输入和输出2.3.3SPL词法分析器的分析识别第3章语法分析: 3.1语法分析的基本框架 3.1.1上下文无关文法 3.1.2语法分析过程 3.1.3语法分析过程中的数据结构3.2语法分析的基本方法

编译原理 第八章符号表

第八章符号表 编译过程中编译程序需要不断汇集和反复查证出现在源程序中各种名字的属性和特征等有关信息。这些信息通常记录在一张或几张符号表中。符号表的每一项包含两部分,一部分是名字(标识符),另一部分是此名字的有关信息。每个名字的有关信息一般指种属(如简单变量、数组、过程等)、类型(如整、实、布尔等)等等。这些信息将使用于语义检查、产生中间代码以及最终生成目标代码等不同阶段。 编译过程中,每当扫描器识别出一个单词后,编译程序就查阅符号表,看它是否已在其中。如果它是一个新名就将它填进表里。它的有关信息将在词法分析和语法-语义分析过程中陆续填入。 符号表中所登记的信息在编译的不同阶段都要用到。在语义分析中,符号表所登记的内容将用于语义检查(如检查一个名字的使用和原先的说明是否相一致)和产生中间代码。在目标代码生成阶段,当对符号名进行地址分配时,符号表是地址分配的依据。对于一个多遍扫描的编译程序,不同遍所用的符号表也往往各有不同。因为每遍所关心的信息各有差异。 本章重点:符号表的一般组织和使用方法。 第一节符号表的组织和使用 信息栏通常包含许多子栏和标志位,用来记录相应名字的种种不同属性。由于查填符号表一般都是通过匹配名字来实现的,因此,名字栏也称主栏。主栏的内容称为关键字(key word)。 虽然原则上说,使用一张统一的符号表也就够了,但是,许多编译程序按名字的不同种属分别使用许多符号表,如常数表、变量名表、过程名表等等。这是因为,不同种属名字的相应信息往往不同,并且信息栏的长度也各有差异的缘故。因而,按不同种属建立不同的符号表在处理上常常是比较方便的。 对于编译程序的符号表来说,它所涉及的基本操作大致可归纳为五类: 1、对给定名字,确定此名是否在有中; 2、填入新名; 3、对给定名字,访问它的有关信息; 4、对给字名字,填写或更新它的某些信息; 5、删除一个或一组无用的项。 不同种类的表格所涉及的操作往往也是不同的。上述五方面只是一些基本的共同操作。 符号表最简单的组织方式是让各项各栏所占的存储单元的长度都是固定的。这种项栏长度固定的表格易于组织、填写和查找。对于这种表格,每一栏的内容可直接填写在有关的区段里。例如,有些语言规定标识符的长度不得超过8个字符,于是,我们就可以用两个机器字作为主栏(假定每个机器字可容四个字符)每个名字直接填写在主栏中。若标识长度不到8个字符,则用空白符补足。这种直接填写式的表格形式如下: 但是,有许多语言对标识符的长度几乎不加限制,或者说,标识符的长度范围甚宽。譬如说,

编译原理课程设计

先简要分析一下语法分析的大致流程: 当有句子要进行处理时,首先要对其进行词法分析来分解出该句子中的每个符号,然后将该句子按照算符优先算法压入归约栈中,如果可以顺利归约,则说明这是一个合法的句子,否则该句子非法。 这里有一个需要考虑的地方,就是如何进行归约。由于文法已经给定,所以我们考虑设计一个文法表,文法表中的内容就是可归约串的种别码的顺序,比如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

编译原理练习三

编译原理练习三 一、填空题 1.编译过程中,每当扫描器识别出一个名字后,编译程序就查阅,看该名字是否在其中。如果该名字是一个新名字就将它添进。 2.在语义分析阶段,符号表所登记的信息将用于和;在目标代码生成阶段,符号表是的依据。 3.过程信息表中必须包括、和。 4.编译程序使用区别标识符的作用域。 5.编译程序在其工作过程中使用最多的数据结构是。它记录着源程序中的各种信息,以便查询和修改。在这些中,尤以最为重要,它的生存期最长,使用也最频繁。 6.过程与过程引用中信息交换的方法是和。 7.PASCAL语言中局部变量的作用域为。 8.将过程的每次执行和过程的相对应就解决了过程递归调用所引起的问题。 9.形式参数和实在参数之间的对应关系通常按来确定。 10.对于某个压缩了的上下文无关文法,当把每个文法符号联系于一组属性,且让该文法的规则附加以时,称该文法为属性文法。 11.文法符号的属性有两种,一种称为,另一种称为。 12.一个文法符号的继承属性是通过语法树中它的结点的相应文法符号的属性来计算的,而综合属性是通过语法树中它的结点的属性之值来计算的。 13.语法制导的编译程序能同时进行分析和分析。 14.在PASCAL中,由于允许用户动态申请与释放内存空间,所以必须采用存储分配技术。 15.静态区的分配对象是。静态区分配的特点是。

二、选择题(单项和多项) 1.在编译过程中,符号表的主要作用是。 a.帮助错误处理 b.辅助语法错误的检查 c.辅助语义的(即上下文有关的)正确性检查 d.辅助代码生成 e.辅助对目标代码的优化 2.PASCAL中过程说明的局部量地址分配在。 a.调用者的数据区中 b.被调用者的数据区中 c.主程序的数据区中 d.公共数据区中 3.与PASCAL语言存储分配方式相似的语言是。 a.C语言 b.BASIC语言 c.FORTRAN-77 4.运行阶段的存储组织与管理的目的是。 a.提高编译程序的运行速度 b.提高目标程序的运行速度 c.为运行阶段的存储分配作准备 5.动态存储分配时,可以采用的分配方法有:。 a.以过程为单位的栈式动态存储分配 b.堆存储分配 c.最佳分配方法 6.过程调用时,参数的传递方法通常有。 a.传值 b.传地址 c.传结果 d.传名 7.过程调用的参数传递中,将出现的任一形蚕都代之以相应的实参的为,过程体对形参的任何引用或赋值都被处理成对形式单元的间接访问的为,像使用局部变量一样使用形式单元的为。 a.传值 b. 传名 c.传地址 d.传结果 8.FORTRAN编译中存储分配是。 a.静态存储分配 b. 动态存储分配 9.在编译方法中,动态存储分配的含义是什么? a.在运行阶段对源程序中的量进行分配 b.在编译阶段对源程序中的量进行分配 c.在编译阶段对源程序中的量进行分配,在运行时这些量的地址可以根据需要 改变 d.以上都不正确

编译原理课程设计 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)界面演示 图一

编译原理课程设计---一个简单编译器的设计与分析

摘要 使用过现代计算机的人都知道,多数用户是应用高级语言来实现他们所需要的计算的。现在计算机系统一般都含有不只一个的高级语言的编译程序,对有些高级语言甚至配置了几个不同性能的编译程序,供用户按不同需要进行选择。高级语言编译程序是计算机系统软件最主要的组成部分之一,也是用户最直接关系的工具之一。 计算机上执行一个高级语言程序一般分为两步:第一,用一个编译程序把高级语言翻译成机器语言程序;第二,运行所得的机器语言程序求得计算结果。 通常说的翻译程序是指能够把某一种语言程序转换成另一种语言程序(目标语言程序)。如果源语言诸如Fortran,Pascal,C,Ada或java这样的高级语言,而目标程序是诸如汇编语言或者机器语言这类的低级语言,这样的一个翻译程序就是称为编译程序。 一个编译程序的工作过程一般可以划分为五个阶段:词法分析、语法分析、语义分析与中间代码生成、优化、目标代码生成。每个阶段都是从上一个阶段得到结果,对他进行分析,并且根据一些外部环境(例如符号表等)得到最终的输出结果。要构造一个编译程序,可以按照这样的阶段来分别构造,最后来连调。 现在人们已经建立了多种编制部分编译程序或整个编译程序的有效工具。有些能用于自动生成扫描器(如LEX),有些可以用于自动产生语法分析器(如YACC),有些甚至可以用来自动产生整个的编译程序。这些构造编译程序的工具成为编译程序-编译程序、编译程序产生器或翻译程序书写系统,他们是按照编译程序和目标语言的形式描述而自动产生编译程序的。 编译程序是一极其庞大而又复杂的系统,掌握它比较苦难。但是一旦对其掌握,对以后的程序语言设计,系统软件分析,系统软件设计,形式语言研究等方面都是非常有好处的。 关键字:C语言、、编译、扫描器、语法分析

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

广西大学 编译原理课程设计 专业:计算机科学与技术 姓名: 课程:编译原理 指导教师:

目录 一.程序简介与分析---------------------------------------------------------1 二.程序适用围-----------------------------------------------------------1 三.词法分析---------------------------------------------------------------1 四.语法分析---------------------------------------------------------------3 五.语义分析和中间代码生成------------------------------------------------9 六.代码生成--------------------------------------------------------------11 七.流程图----------------------------------------------------------------12 八.实现------------------------------------------------------------------13 九.程序运行结果----------------------------------------------------------13 十.总结------------------------------------------------------------------18 十一.附录(源程序)--------------------------------------------------------19

编译原理课程设计

编译原理课程设计 编译原理是大学计算机专业的必修课程。《编译原理课程设计》使用优秀的开源Java编译器GJC作为编译教学的基础平台,通过分析一个真正实用的现代编译系统,把编译理论应用到实际的工程实践中。全书不仅包括对编译器源代码的分析、对实例的讲解,还在最后给出3个具体的课程设计实验,介绍如何用书本上的编译理论实现一个真正的编译器。《编译原理课程设计》适合作为大专院校编译原理课程设计的指导用书,相关的从业人员和研究人员也可以从中获得有益的参考。 本书围绕着编译技术的基本原理和方法,以模拟程序设计语言SPL (SimplePascalLanguage)的编译器的设计和实现为主线,结合词法分析、语法分析、语义分析、代码生成、代码优化、错误处理等各个基本模块,对原理和实现方法进行了详细分析。该编译器可接受SPL的程序,并将其翻译成汇编语言程序,最终实现汇编语言到8086/8088机器语言的翻译。本书为编译技术等相关课程的实验提供了参考。在附件中还提供了三类不同类型和难度的实验题,可供课程实验选择。本书所附光盘包含了SPL编译器的所有代码。 本教材适合作为编译技术课程的配套的实验教材,也可作为有关编译方面研究的参考资料。 本书围绕着编译技术的基本原理和方法,以模拟程序设计语言SPL(SimplePasealLanguage)的编译器的设计和实现为主线,结合词法分析、语法分析、语义分析、代码生成、代码优化、错误处理等

各个基本模块,对原理和实现方法进行了详细分析。该编译器可接受SPL的程序,并将其翻译成汇编语言程序,最终实现汇编语言到8086/8088机器语言的翻译。本书为编译技术等相关课程的实验提供了参考。在附件中还提供了三类不同类型和难度的实验题,可供课程实验选择。本书所附光盘包含了SPL编译器的所有代码。 本教材适合作为编译技术课程的配套的实验教材,也可作为有关编译方面研究的参考资料。 第1章引论 1.1本书介绍 1.2SPL语言的特点及实验安排 1.2.1SPL语言的特点 1.2.2SPL语言编译器的主要结构 1.2.3实验安排 1.3平台的选择和介绍 1.3.1LEX简介 1.3.2YACC简介 第2章词法分析 2.1词法分析器的基本框架 2.2词法分析器的基本原理 2.2.1DFA的构造和实现 2.2.2词法分析的预处理 2.2.3实现词法分析器的注意要点

编译原理课程设计报告

《编译原理》 课程设计报告 姓名:熊齐超(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 | … | 9 2、课程设计的要求描述: 1)在递归下降法、LL(1)、算符优先分析法或者LR法中选择其中一种方法完成以上任务,中间代码选用四元式。 2)编制分析程序,设计若干用例,并上机测试。 3)书写课程设计报告。

相关文档
最新文档