LL(1)语法分析构造表的设计 正文

更新时间:2024-05-14 07:16:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

安徽工程大学课程设计(论文)

《编译原理课程设计》任务书

1、本课题的目的及意义

课程设计实践对学生巩固所学基础专业课程知识、进行编译系统基本技能训练、培养实践动手能力,从而掌握编译系统的基本工作原理、基本方法和基本开发技术,最终达到具有一定的编译系统的实际开发能力有重要意义。通过课程设计,主要达到以下目的:1.帮助学生深入理解编译原理的有关理论和巩固编译原理相关知识。2. 巩固学生学习的编译原理、程序设计语言、数据结构等课程的基础知识,训练学生分析和解决编译系统的相关问题的能力,提高学生的综合素质。3. 从软件工程的角度来看,《编译原理》课程设计是一个很好的实例,可以训练学生软件设计的能力以及编码调试能力。

2、本课题任务的主要内容

本课程设计主要内容包括以下几点:

1、根据选定的题目,查阅资料,熟悉相关理论、方法; (1)掌握文献检索方法,以获得编译系统开发技术等相关资料; (2)学习并熟练使用一种4GL开发平台(如VC++、Java、Dephi、PB、VB

等);

2、分析问题,确定系统逻辑结构;

3、确定系统所需模块及模块结构,并用流程图描述各模块; 4、编码及调试程序; 5、撰写课程设计说明书。

3、提交的成果

1、一份符合课程设计说明书撰写规范的课程设计说明书。 2、一套系统原型。

第 1 页

安徽工程大学课程设计(论文)

LL(1)语法分析构造器的设计

指导教师 王勇 作者 陈慧娟

摘 要

语法分析的主要任务是接收词法分析程序识别出来的单词符由某种号串,判断它们是否语言的文法产生,即判断被识别的符号串是否为某语法部分。 一般语法分析常用自顶向下方法中的LL(1)分析法,采用种方法时,语法分程序将按自左向右的顺序扫描输入的的符号串,并在此过程中产生一个句子的最左推导,即LL(1)是指自左向右扫描,自左向右分析和匹配输入串。

我们使用VC++作为前端开发工具,在分析语法成分时比较方便直观,更便于操作。运行程序的同时不断修正改进程序,直至的到最优源程序。

关 键 字

语法分析 文法 自顶向下分析 LL(1)分析 最左推导

Abstract

Grammatical analysis of the main tasks was to receive lexical analysis procedure to identify the words from a website, string, and judge whether they have a grammar of the language, that is, judging by the series of symbols to identify whether a grammar part. General syntax analysis commonly used top-down methods of LL analysis, using methods, Grammar hours will be from the procedures of the order left-to-right scanning input string of symbols, and in the process produced one of the most left the sentence is derived, LL is scanned from left to right, From left to right analysis and matching input strings. After analysis, we use VC + + as a front-end development tool for the analysis of syntax ingredients more convenient visual, more easy to operate. Operational procedures at the same time constantly improving procedures, until the source of optimal

. Key Words

Grammatical analysis grammar Top-down analysis LL (1) Analysis Most left Derivation

第 2 页

安徽工程大学课程设计(论文)

目录

引言

第1章 概述??????????????????????????5

1.1 编写目的?????????????????????????5 1.2 项目背景?????????????????????????5 1.3 软件定义?????????????????????????6 1.4 开发环境?????????????????????????6

第2章 需求分析???????????????????????7

2.1问题陈述?????????????????????????7 2.2功能要求?????????????????????????7 2.3数据流图?????????????????????????8

第3章 设计任务分工???????????????????? 10

3.1 小组的任务分工??????????????????????10 3.2 本人主要工作???????????????????????10

第4章 系统设计??????????????????????? 11 4.1总体设计????????????????????????? 11

4.1.1 LL(1)文法改造和源程序预处理?????????????11 4.1.2 LL(1)文法的判别、消除左公因子、消除左递归??????14 4.1.3预测分析器的构造?????????????????? 16 4.1.4构造生成LL(1)语法树?????????????????18 4.2详细设计????????????????????????21

第5章 运行与测试结果???????????????????? 29 5.1测试数据??????????????????????????29 5.2界面实现情况????????????????????????29 结论与展望???????????????????????????30 参考文献???????????????????????????? 31 致谢???????????????????????????????32

第 3 页

安徽工程大学课程设计(论文)

引言

编译器的构造工具是根据用户输入的语言的文法,编译器的构造工具可以生成程序来处理以用户输入的文法书写的文本。随着计算机应用范围的扩大,在软件自动生成,文档处理,特定专业的语言等领域,编译器的构造工具这一技术显得越来越重要。

一个编译程序在对某个源程序完成了词法分析工作之后,就进入语法分析阶段,分析检查源程序是否是语法上正确的程序,并生成相应的内部中间表示供下一阶段使用。程序设计语言是一般形式语言的特例,程序语法正确性的检查正是语法句子的识别,语法分析问题也就是句型识别问题。按照识别句子时语法树建立的方式,有自顶向下与自底向上两大类分析技术。本课程设计讨论自顶向下的情况。

本次课程设计所做的工作是用VC要建立一个针对LL(1)文法的编译器的编译器。本文既可以以定义好的文法书写的文件作为输入,其中包括语法及语义动作,鉴于输入文件的所用的文法可以用LL(1)分析,于是对输入的文件用递归下降的分析方法在内存中建立它的存储结构,然后分别计算所输入的文法的非终结符号是否可以生成空,每个非终结符号的first集合,每个非终结符号的follow集合,以及每个规则的predict集合,接着判断任意一个非终结符号的任意两个规则的Predict集的交集是不是都为空,如果是则输入文法可以用递归下降法分析,否则不可以,用户应该对所输入的文法作适当的修改,使其满足LL(1)文法分析的要求,。如果所输入的文法可以用递归下降法分析,生成相应文法的语法分析程序。也可以自行添加文法,本课程设计有根据相应文法自动生成分析表和语法树,并将分析信息和结果保存到一个外部文件中的的功能,能灵活实现语法编译器的相应功能。

第 4 页

安徽工程大学课程设计(论文)

第1章 概述

1.1 编写目的

语法分析器通过接受词法分析程序识别出来的单词符号串,判断它们是否由某种语言的文法产生,即判断被识别符号串是否为某语法成分,同时进行语法检查,为后面的语义分析和代码生成作准备。本次课程设计所做的工作是用VC要建立一个针对LL(1)文法的编译器的编译器。本文既可以以定义好的文法书写的文件作为输入,其中包括语法及语义动作,鉴于输入文件的所用的文法可以用LL(1)语法分析,根据相应文法自动生成分析表和语法树,并将分析信息和结果保存到一个外部文件中的的功能,能灵活实现语法编译器的相应功能。

1.2 项目背景

编译程序是现代计算机系统的基本组成部分之一,而且多数计算机系统都配有不止一个高级语言的编译程序。由于早期的机器语言、汇编语言编写起来不容易、又枯燥无味,所以开发一种更类似数学定义和自然语言的简洁形式来编写程序的操作,应与任何机器无关的编译器十分重要。编译器的构造工具是根据用户输入的语言的文法,可以生成程序来处理以用户输入的文法书写的文本。随着计算机应用范围的扩大,在软件自动生成,文档处理,特定专业的语言等领域,编译器的构造工具这一技术显得越来越重要。

一个编译程序在对某个源程序完成了词法分析工作之后,就进入语法分析阶段,分析检查源程序是否是语法上正确的程序,并生成相应的内部中间表示供下一阶段使用。程序设计语言是一般形式语言的特例,程序语法正确性的检查正是语法句子的识别,语法分析问题也就是句型识别问题。按照识别句子时语法树建立的方式,有自顶向下与自底向上两大类分析技术。本课程设计讨论自顶向下的情况。

第 5 页

安徽工程大学课程设计(论文)

1.3 软件定义

Microsoft visual C++ 6.0:--Visual C++ 6.0是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出 Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软 件开发的首选工具Visual C++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。

Microsoft office Visio 2003:是微软公司出品的一款的软件,它有助于 IT 和商务专业人员轻松地可视化、分析和交流复杂信息。它能够将难以理解的复杂文本和表格转换为一目了然的 Visio 图表。该软件通过创建与数据相关的 Visio 图表(而不使用静态图片)来显示数据,这些图表易于刷新,并能够显著提高生产率。使用 Office Visio 2007 中的各种图表可了解、操作和共享企业内组织系统、资源和流程的有关信息。

1.4 开发环境

操作系统:Microsoft Windows XP 开发平台:Microsoft visual C++ 6.0

第 6 页

安徽工程大学课程设计(论文)

第二章 需求分析

LL(1)分析法中,第一个L的含义是:从左向右的处理输入进行分析,第二个L的含义是:为每个输入串描绘出一个最左推导,\的含义是:向输入串中输入一个符号就可以唯一确定当前将要的产生式。构造出一个LL(1)语法分析器可以更加直观的解决文法输入串在面临不同产生式的选择上,所要进行的分析操作,从而为开发人员带来方便。

2.1问题陈述

建立一个针对LL(1)文法编译器的自动生成器,要完成此编译器需要对源文件进行两遍处理:第一遍词法分析、第二遍语法分析,语法分析程序应用LL(1)语法分析方法。首先输入(打开)定义好的文法文件,然后建立词法分析器,包括词法分析主程序、扫描部分、关键字表等等。经词法分析后分别计算所输入的文法的每个非终结符号的FIRST集合、每个非终结符号的FOLLOW集合,以及每个规则的SELECT集合,并判断任意一个非终结符号的任意两个规则的SELECT集的交集是不是为空,如果是,则输入文法符号是LL(1)文法,可以进行分析。

在对文法的语法进行分析的过程中,要解决各方面的问题如(1)当文法出现做递归时可能使分析过程陷入无限循环、(2)在推导过程中选择哪一右部展开时,如果选择错误,将导致回溯。对文法进行改造,要实现把某些非LL(1)文法到LL(1)文法的等价变换。其总起过程大体包括以下各方面:1、提取左公因子 2、消除左递归。

2.2 功能要求

设计一个给定LL(1)语法分析器,输入一个句子,能由依据LL(1)分析

第 7 页

安徽工程大学课程设计(论文)

表输出与句子对应的语法树。能对语法树生成过程进行模拟。动态模拟算法的基本功能是:

1、词法分析:打开或输入一个文法文件或句子,能对其进行词法分析,显示token表信息,当存在错误时,能给出良好的错误提示。

2、语法分析:打开或输入一个文法文件或句子,能对其进行语法分析,能显示器中间代码信息,当存在错误时,能显示出语法分析错误信息。

3、LL(1)文法判别:打开(输入)一个形如E->abc的LL(1)文法,能对其求出FIRST集,FOLLOW集,并能用直观的关系图显示;

4、预测分析: 打开(输入)一个形如E->abc的LL(1)文法,能直观的形成表达式文法的预测分析表。

5、句子语法树;根据确认LL(1)文法,确认输入串是否为文法的句子,是,则形成该符号串的分析过程,并直观的显示分析过程。

6、该语法分析器具有粘贴、复制、剪切、保存、退出功能! 7、总控程序:显示各模块功能!

2.3数据流图:

数据流图是结构化分析方法中使用的工具,它以图形的方式描绘数据在系统中流动和处理的过程,由于它只反映系统必须完成的逻辑功能,所以它是一种功能模型。数据流图英文缩写DFD(Data Flow Diagram)它是描绘信息流和数据从输入移动到输出的过程中所经受的变换。 数据流图从数据传递和加工的角度,以图形的方式刻画数据流从输入到输出的移动变换过程。 该系统的实现的整个过程的数据流图大体如下: LL(1)语法分析器0层图

第 8 页

安徽工程大学课程设计(论文)

LL(1)语法分析器1层图:

LL(1)语法分析器2层图:

第 9 页

安徽工程大学课程设计(论文)

第3章 设计任务分工

3.1 小组的任务分工

本小组的任务是编写一个程序,进行分析表的构造。 学号 姓名 职责 3070701217 邹纪标 组长 3070701219 3070701207 3070701205 3070701237 3070701222 3070701232 3070701202 陈春辉 闫瑞雪 江於 龚玉静 陈慧娟 赵梦 王报兴 组员 组员 组员 组员 组员 组员 组员 第 10 页

主要任务 消除间接左递归,构造分析表 计算SELECT集,提取左公因子 LL(1)文法的判定 计算FIRST集 计算FIRST集 计算FOLLOW集 计算FOLLOW集 消除直接左递归

安徽工程大学课程设计(论文)

过流程图及算法描述,编写程序构造分析表。

4.1.3 LL(1)预测语法分析

LL(1)语法分析的模块原理如下:

首先初始化栈,#进栈,E进栈作为文法开始的状态。 初始化产生式表、非终结符表、终结符表。

根据产生式表的产生式生成每个非终结符的FIRST集及FOLLOW集。

参考2、3模块,由一个算法生成预测分析表,该预测分析表是由一个二维数组M[n1][n2]构成。由定理可知:若a∈SELECT(A →α),则把A →α放于矩阵M[A,a]。而这里生成的二维数组M[n1][n2]与该定理类似。不过这里n1是指A在非终结符表中的序号,n2是指a在终结符表中的序号,而M[n1][n2]的值是指产生式A →α在产生式表中的序号。这样做就为下面的预测分析程序带来了方便。

预测分析程序分为检测不合法输入模块和对输入字符串的语法分析模块。对输入字符串的语法分析是通过栈及产生式表和预测分析表的相关联系构建一个算法来对这个字符串进行语法分析。通过算法将栈顶元素与输入字符串的比对、出栈及相关产生式的推导的右部的逆序入栈等操作可完成对输入字符串的语法分析。

第 16 页

安徽工程大学课程设计(论文)

LL(1)语法预测分析总流程图

第 17 页

安徽工程大学课程设计(论文)

4.1.4构造生成LL(1)语法树

第 18 页

安徽工程大学课程设计(论文)

算法思想:

本模块的主要功能是将产生式的序列以语法树的方式显示,本组对其进行详

细研究后,发现可以将其分成两个模块分别处理。第一个模块是将产生式结构转换成树形的结构进行存储,第二个模块是将以树形结构存储的语法树以树形目录的方式输出。

第一个模块,涉及到两个数据结构:产生式的数据结构和树的数据结构。产

生式的结构定义存放在Generation.h文件中,在此简述,有两个属性:产生式左部string类型的left和产生式右部vector类型的right。对于传送到本模块的产生式序列,要求它们以vector的形式存放,使用的时候则可以用下标[]的方式逐个引用。树的结构定义在Tree.h中。整体思想如下:产生式的序列一定是按照最左推导得到的序列,所以树的构造也应按照最左构造,对于如下的简单的语法树

其产生式序列必然为: S->BaF B->ACD A->a C->c D->d F->a

第 19 页

安徽工程大学课程设计(论文)

如此在构造树的时候必然也要按照如下次序: 构造节点S 构造S的子节点 构造B的子节点 构造A的子节点 构造C的子节点 构造D的子节点 构造F的子节点

1可设置一个current指向当前节点,最初current指向根节点。

2扫描产生式,每次得到一个产生式,将其左部存到current指向的节点,然后申请若干新节点存放产生式右部的符号。

3 若右部有非终结符,则将current指向第一个,进行下一次扫描

4 若右部没有非终结符,则说明这次推导已到一个子树的树叶。向上回溯,找父节点的相邻非终结符节点,若父节点没有相邻非终结符则继续向上回溯,直到找到为止,并将current指向它,进行下一次扫描。若回溯到根节点则说明树已构造完毕。

在构造非终结符节点的时候需要设置该节点的next指针,例如构造A时要设置其next指针指向C,目的是构造完a之后可以寻找下一个要构造的节点,father指针指向B,目的是在构造完D之后可以向上回溯通过B的next指针找到下一个要构造的节点F。

对于第二个显示模块,思想如下: 1首先current指向根节点,并输出根节点

2 输出current的子节点,并将current指向最左的一个非终结符子节点,用递归的思想输出该节点的子树,然后current继续第二个非终结符子节点,并用递归输出其子树。

第 20 页

安徽工程大学课程设计(论文)

4.2详细设计

自顶向下语法分析方法

语法分析方法是编译程序的核心部分。语法分析的作用是识别由词法分析给出的单词符号序列是否是给定文法的正确句子(程序),目前语法分析方法有自顶向下分析和自底向上分析两大类。自顶向下分析包括确定分析和不确定分析,自底向上分析又包括算符优先分析和LR分析这些分析方法各有优缺点。然而除了自顶向下的不确定分析方法外,都是当今编译程序构造的使用方法。 自顶向下的分析也称面向目标的分析方法,也就是从文法的开始符号出发企图推到出一输入的单词串完全像匹配的句子,若输入串是给定文法的句子,则必能退出,反之必然出错。自顶向下的确定分析方法需对文法有一定的限制,但由于实现方法简单、直观,便于手工构造或自动生成语法分析器,因而仍是目前常用的方法之一。

确定的自顶向下分析方法,是从文法的开始符号出发,考虑如何根据当前的输入符号(单词符号)唯一地确定选用哪个产生式替换相应非终结符一往下推导,或如何够着一颗相应的语法树。

当我们需选用自顶向下分析技术时,首先必须判别所给文法是否是LL(1)文法。因而对任给文法需计算FIRST、FOLLOW、SELECT集合,进而判别文法是否是LL(1)文法。

有关FIRST已有其他同学详细叙述,在这里就不在赘述。在此详细叙述关于FOLLOW集的定义及有关算法。

预测分析方法是自顶向下分析的另一种方法,一个预测分析器是由三个部分组成。

1预测分析程序 2先进后出栈 3预测分析表

其中只有预测分析表与文法有关,而分析表有可用一个矩阵M(或二维数组)表示。矩阵的元素M[A,a]中的下表A表示非终结符,a为终结符或句子括号“#”,矩阵元素M[A,a]中的内容是一条关于A的产生式,表明当用非终结符A向下推导时,面临输入符a时,所应采取的候选产生式,当元素内容物产生式时,则表明用A为左部向下推导遇到了不该出现的符号,因此元素内容为转向出错处理的信息。

预测分析程序的工作过程用下图表示。 图中符号说明如下:

“#”句子括号集输入串的括号 “S”文法的开始符号

“X”存放当前栈顶符号的工作单元 “a”存放当前输入符号a的工作单元

第 21 页

安徽工程大学课程设计(论文)

若产生式为 X→x1x2? xn按逆序即 xn?x2x1入 栈 是 M[X,a]是产生式 吗? 否 出错

开始 '#' 'S' 进栈,当前终结符送a 上托栈顶符号放入X 是 是X=a X?VT? X=a ? 读入下一符号 否 否 X='#' ? 是 否 X=a ? 出错 否 是 结束 预测分析程序的框图

1.FOLLOW集的定义

设G=(VT,Vn,S,P)是上下文无关文法,A∈VN,S是开始符号 FOLLOW(A)={a|S?* μAβ且a∈FIRST(β),μ∈V*T,β∈V+}

若有S?* μAβ,且β?*ε,则#∈FOLLOW(A)。其中‘#’作为输入串的结束符,或称输入串括号。 2.计算FOLLOW集

第 22 页

安徽工程大学课程设计(论文)

(1)根据定义计算

对文法中每一A∈VT计算FOLLLOW(A) ①设S为文法的开始符号,把{#}加入FOLLOW(S)中(这里“#”为句子括号)。 ②若A→αBβ是一个产生式,则把FIRST(β)的非空元素加入FOLLOW(B)中。

如果β?*ε则把FOLLOW(A)也加入FOLLOW(B)中。 ③反复使用②直到每个非终结符的FOLLOW集不再增大为止。 (2)用关系图法球非终结符的FOLLOW集 ①文法G中的每一个符号和“#”对应图中的一个结点,对应终结符和“#”的结点用符号本身标记。对应终结符的结点(如ACVT)则用FOLLOW(A)标记。 ②从开始符号S的FOLLOW(S)结点到“#”号的结点连一条箭弧。

*

③如果文法中有产生式A→αBβX,且β?ε,则从FOLLOW(B)结点到FIRST(X)结点连一条弧,当X∈VT时,则与X相连。 ④如果文法中有产生式A→αBβ且β?*ε则从FOLLOW(B)结点到FOLLOW(A)结点连一条弧。

*

⑤对每一FIRST(A)结点如果有产生式 A→αXβ,且α?ε,则从FIRST(A)到FOLLOW(X)连一条箭弧。 ⑥凡是从FOLLOW(A)结点有路径可以到达的终结符或“#”号的结点,其所标记的终结符或“#”号即为FOLLOW(A)的成员。

如文法G[S]为 S→AB S→bc A→ε A→b B→ε B→aD C→AD C→b D→aS D→c 得

FOLLOW(S)={#}

FOLLOW(A)={a,c,#} FOLLOW(B)={#} FOLLOW(C)={#} FOLLOW(D)={#}

第 23 页

安徽工程大学课程设计(论文)

# FOLLOW(B) FOLLOW(S) FOLLOW(D) FOLLOW(A) FIRST(B) FOLLOW(C) FIRST(D) c a

计算FOLLOW集的关系图

3.求解FOLLOW集合的算法

⑴ 逐一扫描代码中的产生式, 将产生式右部赋给γ 串,γ[j]表示γ 串中的第j 个字符。

⑵ 逐一扫描产生式的右部, 若γ[j]为非终结符X, 找出γ[j]后继的第一个字符γ[k]。

①若γ[k]为终结符, 则将该终结符加入到FOLLOW 集合, 结束, 跳出⑵; ②若γ[k]为非终结符, 则FIRST 集合‘- ε’, 执行⑶。 ⑶ 逐一扫描X 后的字符串,分为下面两种情况:

a.若非终结符γ[k]能推出空字符串, 则k++, 继续执行①、②两步;

b.若非终结符γ[k]为产生式最后一个字符, 则将该产生式的左部非终结符的FOLLOW 集合加入该非终结符的FOLLOW集合。

⑷ 若扫描完全部的产生式, 则求得所有非终结符的FOLLOW 集合。

在计算FOLLOW 集中也存在“ 环”和重复的终结符的问题, 解决的办法与FIRST 集的相同。

第 24 页

安徽工程大学课程设计(论文)

计算FOLLOW集的流程图

产生式为:X→x1x2?xn X=S? N Y {#}∈FOLLOW(X) 0

安徽工程大学课程设计(论文)

① N γ[k]∈VN? γ[k]∈FOLLOW(X) FIRST(γ[k])-{ε}∈FOLLOW(γ[i]) 结束 γ[k]?*ε Y N k++ xk+1xk+2?xn?*ε FOLLOW(X)∈FOLLOW(Xk)

第 26 页

安徽工程大学课程设计(论文)

6、部分代码: void FOLLOW(int i) {

int j,k,m,n,result=1; char c,temp[20];

c=non_ter[i]; /*c为待求的非终结符*/ temp[0]=c; temp[1]='\\0';

merge(fo,temp,1); if(c==start)

{ /*若为开始符号*/ temp[0]='#'; temp[1]='\\0'; merge(follow[i],temp,1); }

for(j=0;j<=count-1;j++) { if(in(c,right[j])==1) /*找一个右部含有c的产生式*/ { for(k=0;;k++) if(right[j][k]==c) break; /*k为c在该产生式右部的序号*/ for(m=0;;m++) if(v[m]==left[j]) break; /*m为产生式左部非终结符在所有符号中的序号*/ if(k==strlen(right[j])-1) { /*如果c在产生式右部的最后*/ if(in(v[m],fo)==1) { merge(follow[i],follow[m],1); continue; } if(F[m]=='0') { FOLLOW(m); F[m]='1'; } merge(follow[i],follow[m],1); } else { /*如果c不在产生式右部的最后*/ for(n=k+1;n<=strlen(right[j])-1;n++) {

第 27 页

安徽工程大学课程设计(论文)

empt[0]='\\0'; result*=_emp(right[j][n]); } if(result==1) { /*如果右部c后面的符号串能推出^*/ if(in(v[m],fo)==1) { /*避免循环递归*/ merge(follow[i],follow[m],1); continue; } if(F[m]=='0') { FOLLOW(m); F[m]='1'; } merge(follow[i],follow[m],1); } for(n=k+1;n<=strlen(right[j])-1;n++) temp[n-k-1]=right[j][n]; temp[strlen(right[j])-k-1]='\\0'; FIRST(-1,temp); merge(follow[i],TEMP,2); } } }

F[i]='1'; }

第 28 页

安徽工程大学课程设计(论文)

第5章 运行与测试结果

5.1测试数据 E?E+T|E=T T?T*F}T/F|F F?(E)|i

5.2界面实现情况

第 29 页

安徽工程大学课程设计(论文)

第6章 结论课程设计心得

收获:通过本次课程设计,我收获了很多东西。首先对编译原理这门课有了进一步的深刻理解,对FOLLOW集的定义和算法有看很深的认识,同时对LL(1)文法分析的原理和过程有了进一步的巩固,也锻炼了我编程的能力,巩固了平时所学的知识,真正做到了学以致用。

体会:在做课程设计的过程中,发现自己在编写程序过程中,总是会忽略各种细节,从而导致经常修改一些很小的低级错误才能使程序正常运行,不仅浪费时间,还影响对其他地方的修改,深刻体会到了自己在编程方面与别人的差距,在今后的学习中,我会注意改正自己在这方面的缺点,促使自己的编程水平不短进步。

编译原理是一门专业学科,对于现阶段的我来说,只能掌握它的一些基本原理和概念,对于一些更深层的知识还是有很多难以理解的地方。但在这次课程设计过程中,是我对编译原理有了更深的理解,同时也锻炼了自己的思考能力,提高了自己的团体合作意识,锻炼了自己的动手编程能力,对于将知识的转化有了很大的帮助。总之,在这次课程设计过程中,我学到了很多东西,在很多方面都得到了提高。

第 30 页

安徽工程大学课程设计(论文)

参考文献

[1] 《编译原理》 张素琴 吕映芝等 著 清华大学出版社 第二版 [2]《编译原理及实践》 (美)Kenneth C.Louden 著 机械工业出版社 第一版 [3]《程序设计语言编译》陈火旺 刘春林等 著 国防工业出版社 2004.1 [4]《Visual C++实战演练》王宏 李玉东 李罡 人民邮电出版社 第一版 [5]《编译原理实践教程》胡元义等 西安电子科技大学出版社 2005年7月

第 31 页

安徽工程大学课程设计(论文)

致谢

在这次课程设计中,我得到了很多人的帮助。首先要感谢我的父母家人,

使他们对我的默默支持,才是我有机会来到大学并能无忧无虑的学习。其次要感谢我的同学特别是我的同组成员赵梦,在这次课程设计过程中,让我深刻感受到了团队合作的力量,赵梦同学在这次课程设计中和我做的是同一个任务,我们进行了很多的讨论,对我能够完成这次课程设计有很大的帮助。另外我要感谢我的指导老师王勇老师和授课老师周文老师,他们以及其严谨求实的教学态度、高度的敬业精神、兢兢业业的工作作风和大胆创新的进取精神对我产生了重要的影响,他们对我耐心的指导,对我完成这次课程设计有很大的帮助。 最后,再次对关心、帮助我的老师、同学和家人表示衷心的感谢!

作者:陈慧娟 2010年06月12日

第 32 页

本文来源:https://www.bwwdw.com/article/qm97.html

Top