已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
附 录第1章 概要设计31.1项目背景31.2 编写目的31.3 软件定义41.4 开发定义4第2章 需求分析52.1问题陈述52.2需要完成的功能52.3数据流图62.3.1数据流图符号定义62.3.2 LR(1)分析构造器的顶层图DFD62.3.3 DFD的0层图62.3.4第一层DFD72.3.5 第二层DFD-项目集族构造72.3.5 第二层DFD-分析表构造82.3.6第二层DFD-总控程序82.3.7第三层DFDACTION表92.4数据字典92.4.1数据项92.4.2数据结构102.4.3数据流102.4.4数据存储122.4.5处理过程122.5实体的E-R图15第3章 逻辑设计163.1总体功能设计框图163.2系统基本工作流程17第四章 总体设计184.1 LR(1)分析模拟构造器流程图184.2流程简介18第五章 详细设计205.1 DFA生成算法205.1.1正规式构造NFA205.1.2将NFA转化为DFA235.1.3 DFA的化简255.2 LC函数的实现275.2.1活前缀及其可归前缀的计算275.2.2 活前缀与句柄的关系275.3 LR(1)项目集规范族的构造295.3.1构造闭包函数()295.3.2构造转换函数305.3.3项目集规范族的构造315.4构造LR(1)分析表315.5 LR分析器的模型325.5.1分析表325.5.2 LR分析算法335.6.1DFA生成算法355.6.2项目集规范族算法365.6.3 LR(1)分析表构造算法375.6.4LR分析器算法38第六章 界面设计与测试39结论与展望41致 谢42参考文献43附 录44第1章 概要设计1.1项目背景 编译原理是一门研究编译程序原理和算法的课程,是各高等院校计算机专业的一门重要专业基础课。编译原理这门课程蕴含着计算机这门学科中解决问题的思路、形式化问题和解决问题的方法,对应用软件和系统软件的设计与开发有一定的启发和指导作用。随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对LR(1)文法判定与预测分析器的构造系统,具有比手工运算、构造所无法比拟的优点。所以,开发一套以LR(1)文法为判定与预测分析器的构造软件显得十分有必要。然而编译原理这门课程和其他计算机专业的必修课程一样,同样注重的是课本知识之外的课程实践,通过这次课程设计,对我们以后的学习和工作都是非常有用的。1.2 编写目的 通过对LR(1)分析器模拟构造器的设计,加深对LR(1)分析器的理解,并且在课程设计的过程中,可以培养我们综合运用所学专业课的原理、知识、方法和技能,独立分析和解决本课程范围内的专业技术问题的能力,掌握解决实际问题的一般程序、规范和方法。 从而希望通过此次课程设计达到以前的目的:1. 进一步深入理解编译原理的有关理论和巩固编译原理相关知识。2. 巩固学习的编译原理、程序设计语言、数据结构等其他专业课程的基础知识,增强分析和解决编译系统的相关问题的能力,提高我们的综合素质。3. 从工程学的角度上来看,课程设计同样是软件工程的一个很好的实例。这样我们又可以从中熟悉了工程建模的过程。在做此次课程设计的同时,我们还刻意为以后的毕业设计做准备,熟悉了做毕业设计的格式、流程、方法。学会了怎样在图书馆查找相关的资料。提高了我的自学能力和自制力,我们认为做课程设计不仅是要我们完成课业任务,更重要的是教会了我们学习方法,锻炼我们的意志,学会如何在独立的情况下更好的完成任务。 1.3 软件定义对输入的文法G,在程序终实现CLOSURE(1),GO(I,X),FRIST等的构造,并利用这些功能函数构造出LR(1)项目集族。并且输出结果。在此基础上构造G的LR(1)分析表,并对输入的句子进行语法分析表,给出分析结果。1.4 开发定义本系统使用VC开发。适用内存不低于256M配备有Windows2000,Windows2003,WindowsXP系统的计算机第2章 需求分析2.1问题陈述 LR分析法是一种自底向上的语法分析方法,是已知的最一般的无回朔移进归约方法。这一方法能够识别所有能用上下文无关文法描述的程序设计语言的结构,所以广泛用于编译程序中的语法分析。LR分析方法通常可分为LR(0)分析法、SLR(l)分析法和LR(l)分析法,其中LR(l)分析法比较前两种方法对文法的限制最小,因此运用比较广泛LR(1)分析器由总控程序、分析表或分析函数以及分析栈组成,在其过程中需要构造项目集族和分析表,执行过程较为复杂。因此,为了能清晰地展示LR(l)模型的执行过程,我们对其工作原理和过程建立了数据流图和数据字典。2.2需要完成的功能本课程设计是构造LR(1)语法分析模拟构造器。我们根据给定的文法,构造LR分析器,并输出LR工作过程。然后根据LR分析器分析过程算法,输入串通过扫描ACTION()表和GOTO()表即可实现算法的功能。 具体需要完成的功能如下:1. 对文法进行导入和扩展2. 计算活前缀和可归前缀3. 构造LR(1)项目集族 3.1构造LR(1)项目集的闭包函数 3.2构造转换函数4生成DFA5构造LR(1)分析表 5.1生成ACTION表 5.2生成GOTO表6LR(1)分析器的构造算法2.3数据流图2.3.1数据流图符号定义 图2-1 数据流图符号2.3.2 LR(1)分析构造器的顶层图DFD图2-2 LR(1)分析构造器的顶层图DFD2.3.3 DFD的0层图图2-3 DFD的0层图2.3.4第一层DFD 图2-4 第一层DFD-LR(1)分析构造器2.3.5 第二层DFD-项目集族构造 图2-5 第二层DFD-项目集族构造2.3.5 第二层DFD-分析表构造图2-6 第二层DFD-分析表构造2.3.6第二层DFD-总控程序图2-7 第二层DFD总控程序2.3.7第三层DFDACTION表图2-8 第三层DFDACTION表2.4数据字典2.4.1数据项数据项名终结符别名VT数据类型CHAR长度50取值范围T001-T050备注语言不可分割的基本单位数据项名非终结符别名VN数据类型CHAR长度50取值范围T001-T050备注抽象的语法单位数据项名文法产生式序号别名MI数据类型INT长度100取值范围T001-T0100备注无数据项名项目产生式序号别名NI数据类型INT长度100取值范围T001-T0100备注无数据项名项目产生式集序号别名II数据类型INT长度100取值范围T001-T0100备注无2.4.2数据结构数据结构名文法说明用来提供文法的信息组成终结符,非终结符,开始符,产生式序号,左部,右部数据结构名文法产生式说明用来生成项目集组成产生式序号,左部,右部数据结构名项目产生式说明用来产生移进或归约动作组成项目产生式序号,左部,右部,.位置数据结构名项目集规范族说明构成识别一个文法活前缀的DFA项目集的全体组成项目产生式集序号,项目产生式集2.4.3数据流数据流名拓展后的文法数据流来源文法导入与扩展数据流去向文法项目构造数据结构文法序号,左部,右部数据流名项目集数据流来源文法项目集构造数据流去向项目规范族构造数据结构文法项目序号,左部,右部 数据流名初态集数据流来源对初态集核求闭包数据流去向生成新项目集核数据结构项目集序号,项目集数据流名新项目集核数据流来源生成新项目集核数据流去向对新项目集核求闭包数据结构项目集序号,项目集数据流名新项目核数据流来源对新项目集核求闭包数据流去向生成新项目集核数据结构项目集序号,项目集数据流名项目集规范族数据流来源转换函数GO数据流去向DFA数据结构项目集序号,项目集 数据流名终结符和非终结符数据流来源DFA数据流去向规约项目填表、移进项目填表数据结构字符数据流名移进信息数据流来源移进项目填表数据流去向分析表数据结构项目产生式序号,左部,右部,位置数据流名规约信息数据流来源规约项目填表数据流去向分析表数据结构项目产生式序号,左部,右部,位置数据流名输入串数据流来源字符串导入数据流去向查询分析数据结构字符串数据流名信息判断数据流来源分析查询数据流去向信息操作 数据结构规约,移进,acc,错误数据流名句子分析结果数据流来源信息操作数据流去向分析动作序列 数据结构字符串acc信息,字符串error信息2.4.4数据存储数据存储名项目规范集族表输入的数据流输出的数据流无组成项目产生式序号,左部,右部,.位置数据存储名分析表输入的数据流规约信息,移进信息输出的数据流分析查询组成 action表,goto表,状态栈, 符号栈数据存储名DFA输入的数据流项目集规范族输出的数据流终结符或非终结符组成项目集规范族,转换函数2.4.5处理过程处理过程名文法导入与扩展输入文法 输出扩展后的文法处理读取文法并且对文法进行拓展处理过程名项目集族构造输入扩展后的文法 输出项目集规范族处理对整个项目集构造项目集规范族处理过程名分析表构造输入DFA 输出分析表处理生成分析表处理过程名总控程序输入分析表输出句子分析处理分析句子是否符合该文法处理过程名文法项目集构造输入拓展后的文法输出项目集处理对每个文法产生式构造项目处理过程名对初态集核求闭包输入项目集输出初态集处理对初态集核求其闭包 处理过程名生成新项目集核输入初态集,新项目集输出新项目集核处理对前一状态求其后继状态处理过程名对新项目集核求闭包输入新项目集核输出新项目集,项目集规范族处理对新项目集的核求闭包并且最终形成项目集规范族处理过程名转换函数GO输入对新项目集核求闭包输出项目集规范族,项目集规范族表处理求当前状态经过若干次后的状态处理过程名GOTO表状态项填写输入终结符输出分析表处理对GOTO表值进行填写操作处理过程名ACTION表状态项填写输入终结符或非终结符输出分析表处理对ACTION表值进行填写操作处理过程名规约项目填表输入终结符或非终结符输出规约信息处理对ACTION表规约项值进行填写操作处理过程名移进项目填表输入终结符或非终结符输出移进信息处理对ACTION表移进项值进行填写操作处理过程名字符串输入输入字符串文件输出输入串处理导入文件中的字符串形成对分析器的输入串处理过程名分析查询输入输入串输出信息判断处理根据当前符号和当前状态在分析表中选择操作信息,如果非结束或出错信息则继续分析处理过程名信息操作输入信息判断输出分析句子结果处理判断分析的结果并形成动作序列2.5实体的E-R图图2-9 E-R图第3章 逻辑设计3.1总体功能设计框图图3-1 总体功能设计框图3.2系统基本工作流程图3-2系统基本工作流程第四章 总体设计4.1 LR(1)分析模拟构造器流程图图4-1 LR(1)分析模拟构造器流程图4.2流程简介输入一个文法,判断文法是否为LR(1)文法,是否需要改造,避免非LR(1)文法。然后,识别活前缀,判断句柄的形成与否,形成NFA。利用LC(1)函数算法求出包含句柄的活前缀及其NFA。写出各个产生式对应的项目,并在此基础上求出NFA。利用该NFA构造出闭包CLOSURE( ),并就此将NFA转化成DFA,求出项目集。通过项目集构造出GOTO函数。最终就可以利用项目集和状态转换函数GOTO( ),构造出LR(1)分析表。这是整个流程的关键部分。之后,LR(1)分析器的总控程序的控制下对输入串进行分析,即根据输入串的当前符号和分析栈的栈顶状态查找分析表应采取的动作,对状态栈和符号栈进行相应的操作即移进、归约、接受或报错。这样就能实现整个输入串的分析功能。 LR(1)分析思想LR(1)分析采用自左向右的扫描和分析输入串,其基本算法是从输入符串开始的,通过重复查找当前句型发句柄(最左素短语),并利用有关规则进行规约。若能规约为文法识别符号,则表示分析成功,输入符号串是文法的合法的句子,否则有语法错误。第五章 详细设计再详细设计中,我做的模块为DFA生成算法、LC函数计算、LR(1)项目集规范族和分析表的构造以及LR分析器设计。5.1 DFA生成算法DFA的生成算法模块,即正规式转化为DFA,其中包括三个步骤:1由正规式构造NFA,2把NFA转化为与其等价的DFA,3. DFA的化简。以下便对该模块的设计进行详细的说明。5.1.1正规式构造NFA对于正规式构造NFA作以下说明:对于字母表上的每一个正规式r,可以构造一个上的NFA N,LR(M)=LR(r)。具体如下:1对NFA N构造一个广义的状态图,其中只有一个初态S和终态Z,连接S和Z的有向弧标记为正规式。2根据图5-1所示的替换规则对正规式依次进行分解,分解过程是一个不断加入结点和弧的过程,直到转换图上的所有弧标记上都是字母表上的元素或为止 图5-1 替换规则正规式构造NFA算法有很多变种,这里提出一种容易实现的简单版本。该算法是语法制导的,它用正规式语法结构来制导构造过程的。首先构造识别和字母表中的一个符号的自动机,然后构造识别主算符为选择、连接或闭包的正规式的自动机。在构造过程中,每步最多引入两个新的状态,所以为正规式构造的最终NFA,状态数最多是正规式中符号和算符总数的两倍。具体算法5-1如下:算法5-1输入 字母表上的正规式r。输出 接受的NFA N方法 首先分析,把它分解成子表达式,然后使用下面的规则1和2,为中的每个基本符号(或字母表符号)构造NFA。基本符号对应正规式定义的1和2两部分。要注意,如果符号在中出现多次,那么要为它的每次出现构造NFA。然后,根据正规式的语法结构,用下面的规则3归纳第组合这些NFA,直到获得整个正规式的NFA为止。在构造过程中所产生的中间NFA有一些重要的性质:只有一个终态,没有边进入开始状态, 也没有边离开终态。1对于,构造如图3-1所示的NFA,其中是开始状态,是接受状态。很明显,这个NFA识别。图5-2 识别正规式的NFA2对中的每个符号a,构造如图3-2所示的NFA。同样,是开始终态,是接受状态。这个NFA识别a。图5-3 识别正规式a的NFA3.如果和分别是正规式和的NFA,则:对于正规式,构造合成的NFA N,结果如图5-3所示。这里是新的开始状态,是新的接受状态。从到和的开始状态有转换,从和的接受状态到也有转换。和的开始和接受状态不是N的开始和接受状态。这样,从到的任何路径必须排他地通过或。这个合成的NFA识别。图5-4 识别正规式对于正规式。构造合成的NFA N,结果如图3-4所示。的开始状态成为合成后的NFA的开始状态,的接受状态成为合成后的NFA的接受状态,的接受状态和的开始状态合并,也就是开始状态的所有转换成的接受状态的转换。合并后的这个状态不作为合成后的NFA的接受状态或开始状态。从到的路径必须首先经过,然后经过,所以这种路径上的标记拼成的串。因为没有边进入的开始状态或离开的接受状态,所以在到的路径中不存在回到的现象,故合成的NFA识别。图5-5 识别正规式的NFA对于正规式,构造合成的NFA N,结果如图5-5所示。同样,到分别是新的开始状态和接受状态。在这个合成的NFA中,可以沿着边直接从到,这代表属于,也可以从经过一次或者多次。显然,这个NFA识别。图5-6 识别正规式的NFA对于括起来的正规式,使用本身作为它的NFA。5.1.2将NFA转化为DFA将NFA转化为DFA的算法5-2如下所示:算法5-2输入 一个NFA N输出 一个能够接受与N相同语言的DFA D方法 为D构造对应的状态迁移表Dtran,表中的每一个状态是N的状态集合,D“并行”地模拟N中可能的状态迁移。用表5-1的运算来计算NFA状态的变化(代表NFA的状态,代表的状态集)。在读第一个输入符号前,N可以处于集的状态,其中 是N的开始状态。假定集合T是从出发,面临某个输入串所能到达的状态集合,令 是下一个输入符号,那么看见时,N可以移动到集合中的任何状态。由于允许装换,看见后,N可以处于中的任何状态。表5-1 对NFA状态的运算运算描述从NFA的状态s出发,仅通过迁移能够到达的NFA的状态集合从T中包含的某个NFA的状态s出发,仅通过迁移能够到达的NFA的状态集合从T中包含的某个NFA的状态s出发,通过输入符号a迁移能够到达的NFA的状态集合1构造子集算法: 按算法5-3所示的算法构造D的状态集Dstates和转换表Dtran。D的每一个状态对应于NFA的一个状态集合,它是N读出了某个符号串后所能到达的全部状态,包括转换后的所有状态。D的开始状态是。如果D的状态是至少含N的一个接受状态的状态集,那么它是D的一个接受状态的状态集,那么它是D的一个接受状态。算法5-3 初始化,是Dstates仅有的状态,并且尚未标记;while Dstates有尚未标记的状态T do begin 标记T; for 每个输入符号a do begin U: ; if U不在Dstates中 then把U作为尚未标记的状态加入Dstates; DtransT, a := U; end end2. 算法的计算是从给定的结点集合出发,在图上搜索可达结点的典型过程。T看成结点集合,算法5-4包含了标记的边。计算的简单算法是用栈来保存那些边还没有完成转换检查的状态。算法如下:算法5-4将T中的所有状态入栈; 设置的初始值为T; while 栈非空 do begin 把栈顶取出元素t弹出栈; for每个状态u(条件是从t到u的边上的标记为) do if u不在中 do begin 把u加入中; 将u压入栈; end end5.1.3 DFA的化简对DFA的方法基于转换函数是全函数。如果一个DFA的转换函数不熟全函数,可以引入一个“死状态”,对所有输入符号都转换到本身,如果S对符号没有转换,那么加上从S到的转换。本课程设计采用极小化DFA状态数的算法就是把它的状态分成一些不相交的子集,每一个子集的状态都是不可区别的,不同子集的状态都是可区别的。每个子集合并成一个状态。具体算法如下:算法3-5输入 一个DFA M,它的状态集合是S,输入符号集合是,转换数是,开始状态是,接受状态集合是F。输出 一个DFA,它和M接受同样的语言,且状态数最少。方法 1.构造状态集合的初始化划分:分成两个子集,接受状态子集F和非接受状态子集S-F 2应用下面的过程对构造新的划分for中的每个子集G do begin 把G划分成若干子集,G的两个状态和在同一子集中,当且仅当对任意输入符号,和的转换是到的同一子集中。 在中,用G的划分代替G。 end3如果,则让 ,在执行步骤4,否则,令 转2。4在的每一个状态自己种选一个状态代表它,这些代表就是最简单DFA的状态。如果是这样的一个代表,在DFA M中,若的转到,并且所在子集的代表是(可能就是),那么,在中,的转到。包含的状态子集的代表是的开始状态,的接受状态是原先属于F集合代表。注意,的每一个子集或者仅含F中的状态,或者不含F中的状态。5如果有死状态,则去掉它。从开始状态不可及的状态也删除。从任何其他状态到死状态的转换都将成为无定义。5.2 LC函数的实现5.2.1活前缀及其可归前缀的计算所谓活前缀即若有是文法的拓广文法中的一个规范推导,符号串是的前缀,则称是的一个活前缀。具体求解如下:设是一个上下文无关文法,对于有其中是对原文法扩充()增加的非终结符,从而使不出现在任何产生式的右部。对拓广文法的开始符号: 若则表示在规范推导过程中,用该产生式的右部代替左部之前所有可能的活前缀。在方法实际分析过程中并不是去直接分析文法符号栈中的符号是否形成句柄,可以把终结付都看成一个有限自动机的输入符号,每把一个符号进栈时看成已识别过了该符号,而状态进行转换,当识别到可归前缀时,相当在栈中形成句柄,则认为到达了识别句柄的终态。5.2.2 活前缀与句柄的关系 在活前缀的定义中我们已经知道一个规范句型的活前缀中决不含句柄右边的任何符号,因此活前缀与句柄的关系分为下述三种情况:1.活前缀已含有句柄的全部符号;2.活前缀只含有句柄的一部分符号;3.活前缀不含有句柄的任何符号。本文仅对1、2做详细分析。 1.不含句柄的活前缀求解算法在方法实际分析过程中并不是去直接分析文法符号栈中的符号是否形成句柄,可以把终结符都看成一个有限自动机的输入符号,把每一个符号进栈时看成已识别过了该符号,而状态进行转换,当识别到可归前缀时,相当在栈中形成句柄,则认为到达了识别句柄的终态。 一个文法的活前缀和可归前缀可以通过函数来计算出来。如果文法有产生式 则有关系式存在, 从而可以轻松求得文法的活前缀和可归前缀。其大致的算法如下所示。算法3-6begin 在文法中引入新的开始符; ; 读入产生式; if (或) if(= & ) ;else if( &= ) else if(= &= ) else end2.包含句柄的活前缀求解算法包含句柄的活前缀的求法与不含句柄的活前缀求法大致相同,根据公式可简写为即可根据不含句柄的活前缀来求得包含句柄的活前缀,即可归前缀。其中,可简写为其算法3-7所示。算法3-7begin 在文法中引入新的开始符; ; 读入产生式; if (或) if(= & ) ;else if( &= ) else if(= &= ) else end5.3 LR(1)项目集规范族的构造5.3.1构造闭包函数()设是文法的一个LR(1)项目集,是从出发,构造方法如下:1中的每一个项目都属于;2若项目属于,且是的一个产生式,则对于任何终结符号,若项目不属于集合,则将它加入;3重复规则2,直到不在增大为止具体构造算法如下:算法3-8function ;begin ;repeat for 中的每一个项目和文法的每个产生式及中的每一个终结符号do if不属于 then 把加入until 没有新的项目加入;return J end5.3.2构造转换函数若是文法的一个LR(1)项目集,是一个文法符号,则其中= |当属于时,为转移函数,为的后继。算法3-9如下:算法3-9function ;begin if 在中 then 是项目的集合;return end;5.3.3项目集规范族的构造LR(1)项目集规范族算法3-10如下:算法3-10输入 拓广文法输出 LR(1)项目集规范族方法 ; dofor(中的每一个项目集和每个字符)if(非空,且不在中)把加入中;while(增大)return5.4构造LR(1)分析表算法3-10 输入 拓广文法 输出 文法的LR(1)分析表,包括子表和子表两部分 方法 1.构造文法的LR(1)项目集规范族2.对于状态(代表项目集),分析动作如下:若,且,则置若,且,则置,这里为产生式的编号若,则置4.若对非终结符号,有,则置5.分析表中凡是不能用上述规则填入信息的空白表项,均置上出错标志error6.分析器的初态是包括的有效项目所对应的状态。5.5 LR分析器的模型LR分析器的模型见下图所示,它包括输入、输出、栈、驱动程序和含动作和转移两部分的分析表。图5-7 LR分析器的逻辑结构5.5.1分析表分析表有两部分组成,即动作函数和转移函数。LR分析驱动程序的行为是它根据栈顶当前的状态和当前输入符号,访问,它可能的4个值如下: 1.移进,其中是一个状态。2.按文法产生式归约。3.接受。4.出错。LR分析器的格局是二元组,它的第一个成分是栈的内容,第二个成分是尚未扫描的输入。具体格局如下: 分析器的下一个动作是用当前输入符号和栈顶状态访问分析表条目,4种不同的移动引起的格局变化如下:1.如果=移进,则分析器执行移进动作,进入格局:即分析器吧当前输入符号和下一个状态移进栈,成为当前输入符号。2.如果=归约,则分析器执行归约动作,进入格局:其中,是的长度。这里,分析器首先从栈中弹出个字符,个状态符号和个文法符号,这些文法符号刚好匹配产生式右部,这时暴露出状态。然后把产生式左边的符号和状态推入栈。在归约动作时,当前啊、输入符号没有改变。3.如果=接受,则分析完成。4.如果=出错,则分析器发现错误,调用错误恢复例程。5.5.2 LR分析算法算法3-11输入 LR分析表和输入串。输出 若是句子,得到的自下而上分析,否则报错。方法 最初,初始状态在分析器的栈顶,在输入缓冲区,然后分析器执行,直至碰到接受或出错动作。让指向的第一个符号;repeat foreverbegin 令S是栈顶状态,是ip所指向的符号; if =移进 then begin 把和依次入栈; 推进,使它指向下一个输入符号 endelse if =reduce by then begin 从栈顶弹出个符号; 令是现在的栈顶状态,把A和入栈; 输出产生式endelse if =接受 then returnelse error()end.5.6流程图5.6.1DFA生成算法图5-8构造子集算法图5-9算法5.6.2项目集规范族算法图5-10构造闭包函数(图5-11项目集规范族的构造5.6.3 LR(1)分析表构造算法图5-12分析表构造5.6.4LR分析器算法图5-13 LR分析器第六章 界面设计与测试我们用C语言编写了LR分析器的工作过程,以下给出了相应的界面与调试过程。我们的主界面如下:图6-1主界面下面我们输入一串字符串sdff234uir#进行测试,测试结果:图6-2归约错误图对i+(i+i)*i+i*i#的测试:图6-3归约成功图结论与展望LR分析构造模拟器的设计达到了专业学习的基本目的。在边学习边设计之后,我们普遍感到不仅实际动手能力有所提高,更重要的是通过对算法的设计中,进一步激发了我们对专业知识的兴趣,并能够结合实际存在的问题在专业领域内进行更深入的学习。通过前几章的分析与说明,本次课程设计基本完成了任务。本文对任意给定的上下文无关文法都可以构造出相应的LR(1) 项目集族和LR(1)分析表。并且允许使用生成的LR(1)分析表对具体的句子进行分析。在本次课程设计中,我们给出DFA生成算法、LC函数计算、LR(1)项目集规范族和分析表的构造以及LR分析器设计的相关算法,并在此基础上给出了LR分析器的编译程序,由于我们我们是用C进行编写的,因此,界面不是很美观,在今后可以用面向对象语言进行编程,以优化界面。当然 ,由于时间的仓促,我们并没有给出文法的导入与扩展算法,这使得我们还需要进一步探究和完善。这次课程设计,我也发现我本身的不足:分析问题不仔细,软件工程的有关概念理解的不够深刻,对于一些开发工具使用的不够熟练,动手能力差,以后都要在这方面多努力,以便全面提高自己。致 谢首先,感谢我的父母给我创造了如此优越的学习环境,这是我课程设计得以完成的前提。其次,我感谢与我同组的同学,在算法上给了我很大的启发,特别是夏露同学在流程图的设计中给了我不少的意见,使得我能够得以顺利完成。当然,论文的完成离不开周老师的悉心指导和关怀。并且,能在此次课程设计中给我这样一个锻炼的机会,是我自己的专业水平有所提高。 在本次课程设计中,我从周文老师身上学到了很多东西。周文老师认真负责的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 废渣外运施工方案(3篇)
- 拆迁高层施工方案(3篇)
- 飞机安全员培训课件
- 飞机原理科普
- 2026福建省水利投资开发集团有限公司招聘1人备考考试题库及答案解析
- 2026山东临沂市教育局部分事业单位招聘综合类岗位工作人员3人备考考试试题及答案解析
- 2026山东事业单位统考烟台市莱山区招聘4人考试参考题库及答案解析
- 2026国家税务总局山东省税务局招聘事业单位工作人员考试参考试题及答案解析
- 2026山东临沂市罗庄区部分事业单位公开招聘综合类岗位工作人员17人考试参考试题及答案解析
- 2026江西赣州交控数智能源有限责任公司招聘加油员岗3人参考考试题库及答案解析
- 侍酒师岗前实操操作考核试卷含答案
- 苹果电脑macOS效率手册
- T-CHAS 20-3-7-1-2023 医疗机构药事管理与药学服务 第3-7-1 部分:药学保障服务 重点药品管理 高警示药品
- 2022年版 义务教育《数学》课程标准
- 供货保障方案及应急措施
- TOC基本课程讲义学员版-王仕斌
- 初中语文新课程标准与解读课件
- 中建通风与空调施工方案
- GB/T 3683-2023橡胶软管及软管组合件油基或水基流体适用的钢丝编织增强液压型规范
- 高考语言运用题型之长短句变换 学案(含答案)
- 2023年娄底市建设系统事业单位招聘考试笔试模拟试题及答案解析
评论
0/150
提交评论