编译原理-- 语法分析——规约
编译原理-第4章 语法分析--习题答案
第4章语法分析习题答案1.判断(1)由于递归下降分析法比较简单,因此它要求文法不必是LL(1)文法。
(× )LL(1)文法。
(× )(3)任何LL(1)文法都是无二义性的。
(√)(4)存在一种算法,能判定任何上下文无关文法是否是LL(1) 文法。
(√)(× )(6)每一个SLR(1)文法都是LR(1)文法。
(√)(7)任何一个LR(1)文法,反之亦然。
(× )(8)由于LALR是在LR(1)基础上的改进方法,所以LALR(× )(9)所有LR分析器的总控程序都是一样的,只是分析表各有不同。
(√)(10)算符优先分析法很难完全避免将错误的句子得到正确的归约。
(√)2.文法G[E]:E→E+T|TT→T*F|FF→(E)|i试给出句型(E+F)*i的短语、简单短语、句柄和最左素短语。
答案:画出语法树,得到:短语: (E+F)*i ,(E+F) ,E+F ,F ,i简单短语: F ,i句柄: F最左素短语: E+F3.文法G[S]:S→SdT | TT→T<G | GG→(S) | a试给出句型(SdG)<a的短语、简单短语、句柄和最左素短语。
答案:画出语法树,得到:短语:(SdG)<a 、(SdG) 、SdG 、G 、a简单(直接)短语:G 、a句柄:G最左素短语:SdG4.对文法G[S]提取公共左因子进行改写,判断改写后的文法是否为LL(1)文法。
S→if E then S else SS→if E then SS→otherE→b答案:提取公共左因子;文法改写为:S→if E then S S'|otherS'→else S|E→bLL(1)文法判定:① 文法无左递归② First(S)={if,other}, First(S')={else, }First(E)={b}Follow(S)= Follow(S')={else,#}Follow(E)={then}First(if E then S S')∩First(other)=First(else S)∩First( )=③First(S')∩Follow(S')={else}不为空集故此文法不是LL(1)文法。
编译原理中语法分析探讨及其应用
(一)语法分析概述语法分析是对高级语言的句子结构进行分析,在编译过程中处于核心地位,它的主要任务是在词法分析识别出正确单词符号串的基础上,根据语言定义的语法规则,从单词符号串中识别出各种语法成分,并进行语法检查和错误处理,生成相应的语法树。
生成语法树的方法有两种,一种是自上而下另一种是自下而上。
[1]自上而下的语法分析方法是对由单词种别构成的源程序,尝试用所有可能的途径,从语法树的根结点出发,从上至下为输入符号串建立一棵语法树。
也可以说成是为输入符号串构造一个最左推导。
整个分析过程就是一种试探的过程,通过不断使用不同产生式谋求匹配输入符号串的过程。
自上而下的语法分析方法分为确定的和不确定的两种。
只有LL(1)文法才能进行确定的自上而下语法分析,在这种分析方法中面临两个问题,回溯和死循环。
通过对文法的产生式进行改造来解决这两个问题,在回溯中改造的方法是提取公共左因子,比如:A→αβ1|αβ2,改造后为A→αA’,A’→β1|β2。
死循环的改造方法是消除左递归,比如:A→Aα|β改造后为A→βA’,A’→αA’|ε。
而不确定的有递归下降分析和预测分析,前者适合手工实现,后者适合自动生成。
递归下降分析是用子程序来实现的,为每个非终结符创造一个子程序,每个子程序里面都有一个函数体,这个函数体是根据非终结符的产生式而定义展开的,当分析过程中遇到终结符时就直接匹配,如果遇到非终结符就调用相应的非终结符对应的子程序。
预测分析方法需要借助一个状态栈和一个二维分析表来实现,两者必须联合控制才能更好的实现预测分析方法。
自下而上的语法分析方法和自上而下的语法分析方法是完全不同的两种方法,但是它们产生的结果是相同的,都是构造一棵语法树,只是构造的过程不同罢了。
语法树创建的过程是把分析符号串的各个符号作为叶子结点,按照文法定义的规则,把产生式左部的非终结符作为父结点,自下而上构造此树的过程。
它的基本思想是“移进—归约”。
编译原理——关于文法、推导、规约、句柄、语法树、二义性的理解
编译原理——关于⽂法、推导、规约、句柄、语法树、⼆义性的理解短语:直观理解,该句型中的⼀个符号串,这个符号串能被前⾯句型中的某个⾮终结符推出,那么这个符号串是该句型的短语。
注意必须保证⾮终结符是前⾯句型的,说明要确定⼀个句型的短语,要找到句型对应的推导,规约或语法树才可以,对应的是这个句型⽣成的动态过程。
简单短语:略句柄:⼀个句型只能有⼀个句柄。
(前提默认⾮⼆义性⽂法)推导和规约过程理解推导过程:对每⼀个句型,该句型⼀定有⼀个推导过程(可能不唯⼀),推导过程⼀定对应⼀颗语法树(推导过程可能不唯⼀,当然语法树也可能不唯⼀)推导不唯⼀,规约不唯⼀,规范推导规范推导:最右推导,每次拆最右边的⾮终结符规约过程:规约直观理解就是,“剪⼦树(但留⼦树的根)【对应到表达式就是⽤短语替代那个⾮终结符】,每剪⼀次对应⼀次规约,直到剪到只剩树根”规范规约:最左规约,每次对最左简单短语进⾏的规约⼀个⽂法的句型,必能通过⼀次⼀次的规范推导获得。
同时也能通过⼀次⼀次的规范规约规约⾄开始符号,每次规约都对应⼀个句柄。
所以⽤规约简单短语的⽅法检查⽂法是可⾏的。
规范推导和规范规约互为逆过程:规范推导倒着看就是规范规约规范句型:由规范推导或规范规约得到的句型⼆义性⽂法——不可判定的⽂法所定义的某个句⼦存在两棵不同的语法树。
⽂法中存在某个句⼦,它有两个不同的规范(最右)推导。
⽂法中存在某个句⼦,它有两个不同的规范(最左)规约,即在规约中某些规范句型的句柄不唯⼀。
注意:1. 如果存在两种推导,那么不能说明⼀定是⼆义性⽂法,因为两种推导可能对应同⼀个语法树2. ⼆义性的例⼦句型E+E*i存在不同句柄题型:给⼀句型,找短语、简单短语、句柄1. 画语法树2. 对于某个句型的语法树,它的每⼀颗⼦树都能找出⼀个短语(可能重复),枚举所有的⼦树就能找全。
3.。
编译原理课后习题答案
编译原理课后习题答案编译原理习题答案习题11.1翻译程序:把⽤某种程序设计语⾔(源语⾔)编写的程序(源程序)翻译成与之等价的另⼀种语⾔(⽬标语⾔)的程序(⽬标程序)。
编译程序:⼀种翻译程序,将⾼级语⾔编写的源程序翻译成等价的机器语⾔或汇编语⾔的⽬标程序。
1.2词法分析、语法分析、语义分析和中间代码⽣成、代码优化、⽬标代码⽣成1.3词法分析:根据语⾔的词法规则对构成源程序的符号进⾏扫描和分解,识别出⼀个个的单词。
语法分析:根据语⾔的语法规则,把单词符号串分解成各类语法单位。
语义分析及中间代码⽣成:对语法分析识别出的语法单位分析其含义,并进⾏初步翻译。
代码优化:对中间代码进⾏加⼯变换,以产⽣更⾼效的⽬标代码。
⽬标代码⽣成:将中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或会变指令代码。
以上5个阶段依次执⾏。
习题22.1 (1)有穷⾮空的符号集合(2)利⽤产⽣是规则A->v将A替换为v时与A的上下⽂⽆关。
(3)略(4)推导是把句型中的⾮终结符⽤⼀个产⽣是规则的右部开替代的过程;直接推导是将⾮终结符的替代结果只⽤了⼀次产⽣式规则。
(5)略(6)⼀个句型的最左直接短语(7)如果⼀个⽂法存在某个句⼦对应两棵不同的语法树或有两个不同的最左(右)推导,则称这个⽂法是⼆义的。
2.2(1)VN ={Z,A,B} VT ={a,b,c,d,e}(2)abbcde,abbbcde是,acde不是。
2.3 (1)L[G]={d|n≥1,m≥0}(2)2.4 (1) A=>B=>c=>fAg=>fBg=>fCg=>feg(2)A=>AaB=>AaC=>Aae=>Bae=>BcCae=>Bceae=>Cceae=>eceae(3)A=>B=>BcC=>BcfAg=>BcfAaBg=>BcfAaCg=>BcfAaeg=>BcfBaeg =>BcfCaeg=>Bcfeaeg=>Ccfeaeg=>ecfeaeg(3)中题⽬有错应为C fCg|e2.5L[G]={a?b?c?|aab,n≥2}2.6 (1)Z→AB A→Aa|ε B→Bb|ε(2)Z→aZb|ab(3)Z→aAb A→aAb|b(4)Z→AB A→aAb|ab B→cB|ε(5)Z→aaAb|ab Z→aaBb|bb A→aaAb|ab B→aaBb|bb2.7 ⼀位数:Z→2|4|6|8两位数:Z→AB A→1|2|3|4|5|6|7|8|9 B→0|2|4|6|8三位以上:Z→ACB A→1|2|3|4|5|6|7|8|9 B→0|2|4|6|8 C→CDD→0|1|2|3|4|5|6|7|8|92.8证明:E=>E+T=>E+T*F短语:T*F E+T*F 直接短语:T*F 句柄:T*F2.9 语法树: E 短语:E*T , (E*T) , F↑(E*T) ,F ,E* F↑(E*T)E *F 直接短语:E*T , FT ↑ F 句柄:FF ( E )E * T2.10(1)语法树(2)直接短语:a , ZZ 句柄:Z( L )L , ZZ ( L )Za2.11最左推导:Z=>ZaB=>BaB=>B+AaB=>A+AaB=>(+)Z*aB=>(+)ZaB*aB =>(+)+aB*aB=>(+)+aA*aB=>(+)+a(*aB=>(+)+a(*aA=>(+)+a(*a(直接短语:(,+句柄:(2.12(1) S=>iSeS=>iiSeS=>iiIeS=>iiIeIS=>iS=>iiSeS=>iiIeS=>iiIeI(2) S=>SaS=>cSaS=>cfaS=>cfafS=>cS=>cSaS=>cfaS=>cfaf(3) E=>EOE=>EOEOE=>iOEOE=>i+EOE=>i+iOE=>i+i-E=>i+i-iE=>EOE=>iOE=>i+E=>i+EOE=>i+iOE=>i+i-E=>i+i-i2.13 Z→aABZ|cCACdA→bAB|aZA|cCCB→bAB|CzbC→cZ|c习题33.1(1)确定的有限⾃动机(2)不确定的有限⾃动机(3)正规集是⼀类特殊的单词集合,正规式是正规集的描述⼯具 3.2 (1) (1|2|3|4|5|6|7|8|9|0)*(1|3|5|7|9) (2) 11(0|1)*00 3.3 证明:b *(a|b)+={a,b,ab,ba,aa,bb …} (a|b)+={a,b,ab,ba,aa,bb …} 3.4 (1)(2)DDDD3.5(1) (2)(3)3.6(1) (01|10) *(01|10)(2) (0(1|00)*)|003.7(1) Z →1AB (2)Z →ABA →(0|1)A A →0A|εA →0|1B →(0|1)B|ε B →0B B →ε3.8 r=a(a|b )*bb3.9 Z →1BB →0Z|0 Z →0Z|ε3.10 3.11DDD习题44.1 (1)若⽂法G[Z]满⾜①⽂法不含左递归②③(2)4.2(1) First(S)={a,d} First(B)={a,d,c,ε}First(A)={a,d,e,c} First(D)={a,d,ε}Follow(S)={#,a,b,d,e} Follow(B)={a,d}Follow(A)={b} Follow(D)={e,a,d,b}(2) 不是4.3 (1) 证明: First(Z)={a,b,c} Follow(S)={#,a,b,c,d} First(A)={a,b,c,d} Follow(A)={ #,a,b,c,d }First(B)={a,d,c} Follow(B)={ a,b,c,d } 是LL(1)⽂法。
杭电编译原理名词解释
名词解析1.编译器: 一个编译程序就是一个语言翻译程序,它把一种语言(称作源语言)书写的程序翻译成另一种语言(称作目标语言)书写的等价的程序。
2.词法分析:从左至右读源程序,识别单词符号3.语法分析:在词法分析的基础上将单词序列组合成各类语法短语4.语义分析:语义检查,收集语义信息,进行类型审查5.代码优化:对中间代码进行优化(提高时间与空间效率6.遍:对源程序或源程序中间表示的一次扫描,每一遍读入一个文件,执行一个或几个阶段的编译操作,并输出源程序的一个中间表示7.上下文无关文法:所定义的的语法单位是完全独立于这种语法单位可能出现的上下文环境的8.推导与归约:推导是用产生式的右部代替左部,归约是用产生式的左部代替右部,归约是推导的逆过程9.最左/右推导:对句型最左/右非终结符进行展开10.最左/右规约:最右/左推导的逆过程,即对最左/右边的可归约串进行归约11.句型:从文法的开始符号出发进行零步或多于零步的推导得到的文法符号串12.句子:只包含终结符号的句型称为句子13.句柄:最左直接短语14.句子、文法、语言的二义性:如果一个文法的句子有两棵或两棵以上的分析树,称此句子是二义的如果一个文法有一个句子是二义的,此文法称为二义文法如果一个语言的所有文法都是二义的,称此语言是二义的15.正规表达式:一个表示字符串格式的模式,可以用来描述单词符号的结构16.有限自动机:是具有离散输入与离散输出的一种数学模型,输入字符串,输出是、否17.不确定的有限自动机:由状态集合,输入符号集合,转换函数,开始状态,接受状态集合组成18.确定的有限自动机:没有ε边转移且一个状态面临一个输入符号时最多只转移到一个状态的NFA19.自顶向下分析:从根到叶子来建立句子的分析树或,给出句子的一个从开始符号出发的推导序列20.自底向上分析:从叶子到根来建立句子的分析树或,给出一个从句子出发到开始符号的归约序列21.综合属性:属性值是分析树中该结点的子结点的属性值的函数22.继承属性:属性值是分析树中该结点的父结点和/或兄弟结点的属性值的函数23.S -属性定义:只含有综合属性的语法制导定义24.L -属性定义:是一种语法制导定义L-属性定义包含S-属性定义25.代码优化:对中间代码进行优化(提高时间与空间效率)26.基本块:·一个连续的三地址(中间)代码序列·只有一个入口语句,一个出口语句·执行时从入口语句进入,从出口语句退出27.活动记录:是一段连续的存储区,用以存放过程的一次执行所需要的信息,如局部数据。
编译原理全复习(完整版)
1》编译程序的框架图与功能块:(1)画出编译程序的总体结构,并简述各部分的主要功能:七个部分(2)编译程序的结构分为几个阶段,各阶段的任务是什么?答编译程序总框架(1)词法分析器,又称扫描器,输入源程序,进行词法分析,输出单词符号。
(2)语法分析器,简称分析器,对单词符号串进行语法分析(根据语法规则进行推导或规约),识别出各类语法单位,最终判断输入串是否构成语法上正确的“程序”。
(3)语义分析与中间代码产生器,按照语义规则对语法分析器归约出(或推导出)的语法单位进行语义分析并把它们翻译成一定形式的中间代码。
(4)优化器,对中间代码进行优化处理。
(5)目标代码生成器,把中间代码翻译成目标程序。
(6)表格管理,登记源程序的各类信息,编译各阶段的进展状况。
(7)出错管理,把错误信息报告给用户。
编译程序的结构分为五个阶段:(1)词法分析.任务是:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词(亦称单词符号或简称符号),如基本字,标识符,常熟,算符和界符。
(2)。
语法分析,任务是:在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位(语法范畴)。
(3)语义分析与中间代码产生。
任务:对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)。
(4)优化。
任务在于对前段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效(省时间和空间)的目标代码。
(5)目标代码生成。
任务是:把中间代码(或优化出理之后)变换成特定机械上的低级语言代码。
2》.重要概念:a. 编译程序:是指能够把源语言程序转换成逻辑上等价的目标语言程序的一个程序。
b. 单词符号:是语言的基本组成成分,是人们理解和编写程序的基本要素,是语言中具有独立意义的最基本结构,它一般包括:基本字、标识符、常数、运算符和界符等c. 中间代码:是一种含义明确,便于处理的记号系统,它通常独立于具体的硬件。
编译原理复习汇总
复习汇总一、第一章概述1.文法与自动机的等价1)0型文法—图灵机2)1型文法—线性有界非确定图灵机3)2型文法—非确定下推自动机4)3型文法—有限状态自动机2.编译技术的应用1)语法制导的结构化编辑器2)程序格式化工具3)软件测试工具4)程序理解工具5)高级语言的翻译工具6)等等3.从面向机器的语言到面向人类的语言(结合第二章第9小点理解)1)面向机器的语言:机器指令,汇编语言2)面向人类的语言:通用程序设计语言,数据查询语言,形式化描述语言(正规式,产生式)等等。
4.各语言的分类(结合第二章第9小点理解)1)过程式语言,面向对象语言:通用程序设计语言。
2)函数语言:面向特点领域的,递归特性。
例如LISP语言3)说明性,非算法式语言:LEX/YACC,SQL。
4)脚本式语言:Shell语言5.语言之间的转换(李静PPT41)1)高级语言之间的转换一般称为预处理或转换。
2)高级语言翻译成汇编语言或机器语言称之为编译。
3)把汇编语言翻译成机器语言称之为汇编。
4)将一个汇编语言程序汇编为可在另一台机器上运行的机器指令称之为交叉汇编。
5)把机器语言翻译成汇编语言称之为反汇编。
6)把汇编语言翻译成高级语言称之为反编译。
6.编译器和解释器1)编译器●源程序的翻译和翻译后的程序的运行是两个不同的阶段。
◆编译阶段:用户输入源程序,经过编译器的处理,生成目标程序。
◆目标程序的运行阶段:根据要求输入数据,得出结果。
2)解释器(凡是可以采用编译器的地方均可以采用解释器)●解释器把翻译和运行结合到一起,编译一段源程序,紧接着就执行它。
这种方式称为解释。
7.解释器的优点(对比与编译器)1)具有较好的动态特性。
2)具有较好的移植特性。
8.解释器的缺点(对比于编译器)1)相比于编译器需花费大量的时间。
2)占用更多的内存空间。
9.编译器的工作阶段(结合第二章6小点红色部分理解)1)源程序->词法分析器->语法分析器->语义分析器->中间代码生成器->代码优化器->目标代码生成器->目标代码2)工作过程中的每个阶段均采用了符号表管理器,出错处理器。
编译原理
编译原理第一章:1.编译程序是现代计算机系统的基本组成部分之一2.一个计算机系统中通常配置多个高级语言的编译程序3.在一个计算机系统中可为某些高级语言配置多个不同性能的编译程序4.编译程序是一种语言翻译程序,其功能是把一种语言编写的程序翻译成另一种语言的等价程序5.被编译的程序称为源程序,编译后的等价程序称为目标程序6.编译程序的任务就是将源语言程序翻译成等价的目标语言程序7.通常将编译过程分为六个阶段:词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。
8.词法分析的主要任务是从左至右扫描字符序列,并按照此法规则识别出一个个的单词9.单词是指逻辑上紧密相连的一组字符,这些字符具有集体含义。
10.计算机语言中,单词的种类通常有保留字、标识符、数、算符、界符等11.语法分析的主要任务是:按照语言的语法规则,把词法分析所得的单词序列分解成各类语法成分。
12.词法分析和语法分析都是对源程序进行结构分析,但二者是有区别的。
13.语义分析的主要功能是审查源程序有无语义错误,伪代码生成阶段收集类型信息。
14.中间代码生成阶段的主要任务是,把源程序转换成一种中间代码15.中间代码是一种结构简单、含义明确的记号系统16.中间代码可以设计成多种形式,其设计原则有两点:一是容易生成,二是容易转换成目标代码17.代码优化的主要任务是对中间代码进行改造,使生成的目标代码更为高效18.目标代码生成阶段的任务是把中间代码转换成特定机器上的绝对指令代码或者可重定位的指令代码或者汇编指令代码19.在编译过程的每个阶段中都含有出错处理和表格管理的工作20.编译程序的结构可以按功能分为八个模块,即词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序和目标代码生成程序,此外还有与上述每个阶段都有关系的出错处理程序和表格管理程序。
21.按照编译程序的工作主要是与源语言有关还是与目标机有关,编译过程也可前端和后端22.前端的工作主要依赖于源语言而与目标机无关,包括词法分析、语法分析、语义分析、中间代码生成以及每个阶段中的出错处理和表格管理工作,还包括代码优化阶段的部分工作23.后端的工作主要与目标机有关而与源语言无关,主要是代码生成及相关的出错处理和表格管理工作24.编译过程中,对源程序或者中间语言程序从头至尾扫描一次并完成相应工作的过程称为“一遍”或者“一趟”25.解释程序是另一种语言处理程序,其工作特点是边分析边执行,不生成目标代码。
编译原理 第五章 语法分析-自下而上分析
5.2.2 算符优先分析算法
• 素短语:
–是一个短语,它至少含有一个终结符,并且,除 它自身之外不再含任何更小的素短语。
• 最左素短语:
–最左边的素短语是最左素短语。
• 例子:
– 对文法(5.3)p*p和i是句型p*p+i的素短语,而p*p+i 本身也是素短语。
பைடு நூலகம்
• 算符优先文法:
算符优先文法,我们把句型(括在两个#之间) 的一般形式写成: #N1a1N2a2…NnanNn+1# 其中,每个ai都是终结符,Ni是可有可无的非终结 符。 文法G的任何短语是满足如下条件的最左子串 Njaj…NiaiNi+1 aj-1⋖ aj aj ≖ aj+1 , …,aj-1 ≖ ai ai ⋗ ai+1
– 对于每个终结符a(包括#)令其对应两个符号fa 和ga ,画一张以fa 和ga 所有符号为结点的方向图, 如 果 a⋗≖b, 那 么 , 就 从 fa 画 一 箭 弧 至 gb ; 如 果 a ⋖≖b,就画一条从gb到fa的箭弧。 – 对每个结点都赋予一个数,此数等于从该结点能 到达结点(包括出发结点自身在内)的个数。赋 给fa的数作为f(a),赋给gb的数作为g(b)。 –检查所构造出来的函数f和g,看它们 同原来的关 系表是否有矛盾。如果没有矛盾,则f和g就是所 要的优先函数。如果有矛盾,那么,就不存在优 先函数。
• 例子:假定文法G
S→aAcBe A→b A→Ab B→d 输入串abbcde归约到S过程。
图5.1 规约中符号栈的变迁
步骤 动作
1 进 a
2 进 b
3 归 (2)
4 进 b
5 归 (3)
6 进 c
7 进 d d
编译原理语法分析器
编译原理语法分析器编译原理语法分析器是编译器中的重要组成部分,它负责将源代码解析成抽象语法树,为后续的语义分析和代码生成做准备。
本文将介绍语法分析器的原理、分类和常用算法。
一、语法分析器的原理语法分析器的主要任务是根据给定的文法定义,将源代码解析成一个个语法单元,并构建出一棵抽象语法树。
它通过递归下降、预测分析和LR分析等算法来实现。
1. 递归下降法递归下降法是一种基于产生式的自顶向下分析方法。
它从文法的开始符号出发,通过不断地推导和回溯,逐步地构建抽象语法树。
递归下降法易于理解和实现,但对左递归和回溯有一定的局限性。
2. 预测分析法预测分析法也是自顶向下的分析方法,它通过预测下一个输入符号来选择适当的产生式进行推导。
为了提高效率,预测分析法使用预测分析表来存储各个非终结符和终结符的关系。
3. LR分析法LR分析法是一种自底向上的分析方法,它使用LR自动机和LR分析表来进行分析。
LR自动机是一个有限状态控制器,通过状态转移和规约动作来解析源代码。
LR分析表存储了状态转移和规约的规则。
二、语法分析器的分类根据语法分析器的特性和实现方式,可以将其分为LL分析器和LR 分析器。
1. LL分析器LL分析器是基于递归下降法和预测分析法的一类分析器。
它从左到右、从左到右地扫描源代码,并根据预测分析表进行推导。
常见的LL分析器有LL(1)分析器和LL(k)分析器。
2. LR分析器LR分析器是基于LR分析法的一类分析器。
它先通过移进-归约的方式建立一棵语法树,然后再进行规约操作。
LR分析器具有强大的语法处理能力,常见的LR分析器有LR(0)、SLR(1)、LR(1)和LALR(1)分析器。
三、常用的语法分析算法除了递归下降法、预测分析法和LR分析法,还有一些其他的语法分析算法。
1. LL算法LL算法是一种递归下降法的改进算法,它通过构造LL表和预测分析表实现分析过程。
LL算法具有很好的可读性和易于理解的特点。
2. LR算法LR算法是一种自底向上的分析方法,它通过建立LR自动机和构造LR分析表来进行分析。
编译原理的词法分析与语法分析
编译原理的词法分析与语法分析编译原理是计算机科学中的一门重要课程,它研究如何将源代码转换为可执行的机器代码。
在编译过程中,词法分析和语法分析是其中两个基本的阶段。
本文将分别介绍词法分析和语法分析的基本概念、原理以及实现方法。
1. 词法分析词法分析是编译过程中的第一个阶段,主要任务是将输入的源代码分解成一个个的词法单元。
词法单元是指具有独立意义的最小语法单位,比如变量名、关键字、操作符等。
词法分析器通常使用有限自动机(finite automaton)来实现。
在词法分析的过程中,需要定义词法规则,即描述每个词法单元的模式。
常见的词法规则有正则表达式和有限自动机。
词法分析器会根据这些规则匹配输入的字符序列,并生成相应的词法单元。
2. 语法分析语法分析是编译过程中的第二个阶段,它的任务是将词法分析器生成的词法单元序列转换为语法树(syntax tree)或抽象语法树(abstract syntax tree)。
语法树是源代码的一种抽象表示方式,它反映了源代码中语法结构和运算优先级的关系。
语法分析器通常使用上下文无关文法(context-free grammar)来描述源代码的语法结构。
常见的语法分析算法有递归下降分析法、LR分析法和LL分析法等。
递归下降分析法是一种自顶向下的分析方法,它从源代码的起始符号开始,递归地展开产生式,直到匹配到输入的词法单元。
递归下降分析法的实现比较直观,但对于左递归的文法处理不方便。
LR分析法是一种自底向上的分析方法,它使用一个自动机来分析输入的词法单元,并根据文法规则进行规约操作,最终生成语法树。
常见的LR分析法有LR(0)、SLR、LR(1)和LALR等。
LL分析法是一种自顶向下的分析方法,它从源代码的起始符号开始,预测下一个要匹配的词法单元,并进行相应的推导规则。
LL分析法常用于编程语言中,如Java和Python。
3. 词法分析和语法分析的关系词法分析是语法分析的一个子阶段,它为语法分析器提供了一个符号序列,并根据语法规则进行分析和匹配。
编译原理LL(K)
S =>aAbc =>ababc 错误回退 ,再回退S 错误回退A,再回退
重复以上匹配过程,发现此时符号串abeB与abed 前3个符号均匹配,下面指针指向第四个符号d。 而符号串abeB 的第四个符号是B,若选择 B→ d 则得到下面语法树: S =>aB =>abeB =>abed
圆括号( ③ 圆括号( ) 利用圆括号可提出一个非终结符的多个产生式右部 的公共因子。例如, A→xy|xw|…|xz 可写成 A→x(y|w|…|z)
利用下面的两条规则,可把包含直接左递归 的产生式转换成用扩展BNF表示法表示的产生 式。
① 提公因子 每当一条产生式中有公因子可提的时候,就把它 提出来,若原产生式是 A→x|xy 则可写成 A→x(y|ε) A→x(y|ε),这里把ε当作最后一个 候选式。 这样,把本来具有相同开始符号的候选式 变成了开始符号不同的候选式,从而避免了实现 分析过程中的逐个试探,并且有助于消除文法的 直接左递归,同时也压缩了文法的长度。
end; 消除Ui Ui产生式中的直接左递归 消除Ui产生式中的直接左递归 end; 化简改写之后的文法,删除多余产生式。 ③ 化简改写之后的文法,删除多余产生式。
确定的自顶向下语法分析
4.4
LL(k)文法 LL(k)文法
LL(k)文法是上下文无关文法的一个真子集。同时, LL(k)文法也是允许采用确定的从左至右扫描(输入 串)和自上而下分析技术的最大一类文法。 LL系指:自左至右扫描(输入串),自上而下进行最 左推导。 分析过程中,如果每步仅利用当前的非终结符(事 实上已经位于栈顶)和至多向前查看k个输入符号 就能唯一确定采取什么动作 唯一确定采取什么动作,则这个文法称为LL(k) 唯一确定采取什么动作 文法。 下面主要讨论k=0,1时的情形。
编译原理语法分析实验报告
编译原理语法分析实验报告一、实验目的本实验主要目的是学习和掌握编译原理中的语法分析方法,通过实验了解和实践LR(1)分析器的实现过程,并对比不同的文法对语法分析的影响。
二、实验内容1.实现一个LR(1)的语法分析器2.使用不同的文法进行语法分析3.对比不同文法对语法分析的影响三、实验原理1.背景知识LR(1)分析器是一种自底向上(bottom-up)的语法分析方法。
它使用一个分析栈(stack)和一个输入缓冲区(input buffer)来处理输入文本,并通过移进(shift)和规约(reduce)操作进行语法分析。
2.实验步骤1)构建文法的LR(1)分析表2)读取输入文本3)初始化分析栈和输入缓冲区4)根据分析表进行移进或规约操作,直至分析过程结束四、实验过程与结果1.实验环境本实验使用Python语言进行实现,使用了语法分析库ply来辅助实验。
2.实验步骤1)构建文法的LR(1)分析表通过给定的文法,根据LR(1)分析表的构造算法,构建出分析表。
2)实现LR(1)分析器使用Python语言实现LR(1)分析器,包括读取输入文本、初始化分析栈和输入缓冲区、根据分析表进行移进或规约操作等功能。
3)使用不同的文法进行语法分析选择不同的文法对编写的LR(1)分析器进行测试,观察语法分析的结果。
3.实验结果通过不同的测试案例,实验结果表明编写的LR(1)分析器能够正确地进行语法分析,能够识别出输入文本是否符合给定文法。
五、实验分析与总结1.实验分析本实验通过实现LR(1)分析器,对不同文法进行语法分析,通过实验结果可以观察到不同文法对语法分析的影响。
2.实验总结本实验主要学习和掌握了编译原理中的语法分析方法,了解了LR(1)分析器的实现过程,并通过实验提高了对语法分析的理解。
六、实验心得通过本次实验,我深入学习了编译原理中的语法分析方法,了解了LR(1)分析器的实现过程。
在实验过程中,我遇到了一些问题,但通过查阅资料和请教老师,最终解决了问题,并完成了实验。
编译原理-语法分析
自顶向下的语法分析方法简单直观,易于实现,但可能存在 左递归和回溯的问题。
自底向上的语法分析
01
自底向上的语法分析方法从源代码中的每个符号出发
,逐步归约到文法的起始符号。
02
该方法通常采用LR(0)、SLR(1)、LALR(1)等算法进行
实现。
03
自底向上的语法分析方法可以避免回溯问题,但需要
• 随着人工智能和机器学习技术的不断发展,可以利用这些技术来辅助语法分析 过程,提高语法分析的准确性和效率。例如,可以使用机器学习算法来自动识 别和处理语法规则和歧义问题。
• 另外,随着软件工程和代码质量的重视程度不断提高,对编译器和语法分析器 的要求也越来越高。未来的研究需要更加注重编译器和语法分析器的可维护性 和可扩展性,以满足不断变化的软件需求。
词法分析的算法
自底向上算法
自底向上算法是从源代码的左向右进行扫描,并从下到上构建语法结构。常见 的自底向上算法有预测分析法和移进-规约法。
自顶向下算法
自顶向下算法是从语法结构的顶层开始,向下进行推导,直到找到与源代码相 匹配的语法结构。常见的自顶向下算法有规范分析法和贪婪分析法。
语法分析概述
语法分析是编译过程的核心环节,其任务是将源代码分解成一系列的语法 结构,以便后续的语义分析和代码生成。
自底向上的算法,通过构建归 约表进行移进和规约操作。
LALR(1)算法
扩展的LR(0)算法,能够处理 更广泛的文法,生成更小的归 约表。
03
语义分析
语义分析概述
01
Байду номын сангаас02
03
语义分析是编译过程的 一个阶段,它是在语法
分析之后进行的。
语义分析的主要任务是 检查源代码的语义是否 正确,例如变量是否已 经声明,类型是否匹配
编译原理 第5章
例:有文法G(S):
S→bAb A→( B | a B→Aa ) 解:文法符号优先关系推导如下: (1) 求=· 关系: 由S→bAb , A→( B, B→Aa ) b =· A, A =· b, (=· B , A =· a, a =· )
自底向上的语法分析
• 核心问题
– 寻找可归约串。对“可归约串”概念的不同定义, 就形成了不同的自底向上的分析方法。在算符优 先分析法中我们用“最左素短语”来刻画“可归 约串”,在“规范归约”中,则用“句柄”来刻 画“可归约串”
分析方法
• 输入串:
abbcde
S → a A c B e A → A b|b B → d
S
b
>·
=· <·
>·
A
(
=·
<· <· =·
=·
<·
B
a
>·
>·
>·
>· =· =·
)
#
寻找句柄
>·
<· <·
>·
简单优先文法的定义: (1)在文法符号集中,任意两个符号之间最多只有 一种优先关系; (2)在文法中任意两个产生式没有相同的右部。
语法树结构如下:
S S S b S b
b
A b
B
b
U S0…Sj-1SjSj+1Sj+2… …Si-1SiSi+1…Sn
算符优先分析
• 我们要通过两个相邻符号SiSi+1之间的关系来找到句 柄: – SiSi+1在句柄内:必然有规则U …SiSi+1… – Si在句柄内部,但是Si+1在句柄之后:必然有规则 U …Si,且存在规范句型…USi+1…。 – 如果Si+1在句柄内,而Si在句柄外,那么必然存在 规范句型…SiU…,且U Si+1…。
(完整版)编译原理名词解释
1. 源语言:书写源程序所使用的语言2. 源程序:用程序设计语言书写的程序3. 目标语言:计算机的机器指令。
目标语言可以是机器语言,也可以是汇编语言,或者是其他中间语言,但最终结果必是机器语言。
4. 目标程序:由机器指令构成的程序。
目标程序是经过翻译程序加工后用目标语言表示的程序。
5. 翻译程序:能够把某一种语言程序(源程序)改造成另一种语言程序(目标程序)将源程序译成逻辑上等价的目标程序的程序。
翻译程序有两种工作方式:编译和解释。
6. 编译程序:也称翻译程序7. 解释程序:有些翻译程序在翻译过程中并不产生完整的目标程序,而是翻译一句,解释执行一句,这样的称为解释程序。
8. 汇编程序:由汇编语言写成的程序9. 词法分析:执行词法分析的程序成为词法分析器,词法分析依据的是语言构词规则。
词法分析器从文件读入源程序,由字符拼接单词。
每当识别出一个单词,词法分析器就输出这个单词的内部码。
10. 语法分析:执行语法分析的程序叫做语法分析器。
语法分析的任务就是根据语言的规则,将词法分析器所提供的单词种别分成各类语法范畴。
11. 中间代码生成:中间代码产生有时称为语义分析,执行中间代码产生的程序称为中间代码生成器。
他的任务时按照语法分析器所识别出的语法范畴产生相应的中间代码,并建立符号表、常数表,等各种表格。
12. 目标代码生成:执行目标代码生成的程序称为目标代码生成器。
他的任务是根据中间代码和表格信息,确定各类数据在内存中的位置,选择合适的指令代码,将中间代码翻译成汇编语言或机器指令,这部分工作与计算机硬件有关。
13. 符号表:用于记录源程序中出现的标识符,一个标识符往往具有一系列的语义值,她包括标识符的名称、种属、类型、值存放的地址等等。
14. 常数表:用于记录在源程序中出现的常数。
15. 编译程序前端:是由词法分析器、语法分析器和中间代码产生器组成的。
她的特点是依赖于被编译的源程序,输出结果用中间代码描述,和目标机器无关。
编译原理第三章语法分析
递归下降程序:
void F() { if(lookahead= =’i’) match(‘i’); else if(lookahead= =’(’) { match(‘(’); E(); if(lookahead= =’)’) match(‘)’); else error(); } else error(); }
输入串
id+id*id;# id+id*id;# id+id*id;# id+id*id;# id+id*id;# +id*id;# +id*id;#
动作
pop(L),push(E;L) pop(E),push(TE’) pop(T),push(FT’) pop(F),push(id) pop(id),next(ip) pop(T’)
形式语言分类
定义:若文法G=(N,T,P,S)的每个产生式α→β中,均有 α∈(N∪T)*N(N∪T)*,且至少含有一个非终结符, β∈(N∪T)*,则称G为0型文法(短语文法)。 ①1型文法(上下文有关文法):G的任何产生式α→β(S→ε 除外)均满足|α|≤| β| (|x|表示x中文法符号的个数); ②2型文法(上下文无关文法):G的任何产生式形如A→β, 其中A∈N,β∈(N∪T)*; ③3型文法(正规文法、线性文法):G的任何产生式形如A→a 或者A→aB(或者A→Ba),其中A,B∈N,a∈T*。
定义:将产生式A→γ的右部代替文法符号序列αAβ 中的A得到αγβ的过程,称为αAβ直接推导 出αγβ,记作:αAβαγβ。
编译原理所有名词解释
第一章编译程序是一种程序,它把高级语言编写的源程序翻译成与之在逻辑上等价的机器语言或汇编语言的目标程序。
一个高级语言程序的执行通常分为两个阶段,即编译阶段和运行阶段。
如果编译生成的目标程序是汇编语言形式,那么在编译与运行阶段之间还要添加一个汇编阶段.解释程序也是一种翻译程序,它将源程序作为输入,一条语句一条语句地读入并解释执行。
解释程序与编译程序的主要区别是:编译程序是将源程序翻译成目标程序后再执行该目标程序,而解释程序则是逐条读出源程序中的语句并解释执行,即在解释程序的执行过程中并不产生目标程序。
编译过程源程序符串进行扫描和分解,个具有独立意义的单词;语法分析的任务的基础上,根据语言的语法规则(号串中识别出各种语法单位并进行语法检查;和中间代码生成阶段的任务来描述这种语义即生成中间代码;优化的任务高效(节省时间和空间)的目标代码;的任务定机器上的机器语言程序或汇编语言程序,实现最终的翻译工作。
自编译:用某种高级语言书写自己的编译程序。
交叉编译:指用A机器上的编译程序来产生可在B机器上运行的目标代码。
自展:首先确定一个非常简单的核心语言L0,然后用机器语言或汇编语言书写出它的编译程序T0:再把语言L0扩充到L1,此时有L0 L1,并用L0编写L1的编译程序T1(即自编译)。
移植:指A机器上的某种高级语言的编译程序稍加改动后能够在B机器上运行.第二章对程序设计语言的描述是从语法、语义和语用3个因素来考虑的。
所谓语法是对语言结构的定义;语义是描述了语言的含义;语用则是从使用的角度去描述语言。
形式化的方法:用一整套带有严格规定的符号体系来描述问题的方法。
标识符:以字母打头的字母数字串字母表:是元素的非空有穷集合。
字符:字母表中的元素称为符号,或称为字符。
可以是字母、数字和其他符号。
符号串:符号的有穷序列。
前缀:指从末尾删除0个或多个符号后得到的符号串.后缀:指从开头删除…。
(同上)符号串的运算:符号串的连接、集合的乘积、符号串的幂运算、集合的幂运算、集合A的正闭包A+与闭包A*形式语言:字母表上所有的字符按照某种规则所组成的集合。
编译原理将高级语言转换为机器可执行代码
编译原理将高级语言转换为机器可执行代码编译原理是计算机科学中的一门重要课程,它研究高级语言程序如何被转换为机器可执行代码的过程。
本文将介绍编译原理的基本概念、主要步骤和常用方法。
一、编译原理概述编译原理是计算机科学中的一门重要课程,它研究高级语言程序如何被转换为机器可执行代码的过程。
编译器是实现这一转换过程的工具,它将高级语言程序作为输入,经过一系列的分析和优化,生成等价的机器可执行代码作为输出。
编译器的主要任务包括词法分析、语法分析、语义分析、中间代码生成、代码优化和代码生成等步骤。
下面将逐一介绍这些步骤。
二、词法分析词法分析是编译过程的第一步,它负责将源程序作为输入,按照事先定义好的词法规则将其划分为一个个单词(Token)。
词法分析器通常使用有限状态自动机来实现,它根据输入字符流的状态进行状态转换,最终输出词法单元流。
三、语法分析语法分析是编译过程的第二步,它负责将词法分析器输出的词法单元流进行分析,并根据事先定义好的语法规则构建语法树。
语法分析器通常使用自上而下的递归下降分析法或自下而上的移进-规约分析法进行语法解析。
四、语义分析语义分析是编译过程的第三步,它负责对语法树进行分析并进行语义检查。
语义分析器会检查变量的声明和使用是否符合语言规范,进行类型检查等操作。
在这一步骤中,编译器还会生成符号表,用于记录变量和函数的信息。
五、中间代码生成中间代码生成是编译过程的第四步,它负责将语法树转换为中间代码。
中间代码是一种介于源代码和目标代码之间的抽象表示形式,它比源代码更接近于目标代码,但又比目标代码更容易生成和优化。
常用的中间代码表示形式有三地址码、四地址码和虚拟机代码等。
中间代码生成器根据语法树的结构和语义信息,将源代码转换为中间代码表示。
六、代码优化代码优化是编译过程的第五步,它负责对中间代码进行分析和优化。
代码优化的目标是提高程序的执行效率和资源利用率,减少程序的执行时间和内存消耗。
常用的代码优化技术包括常量折叠、公共子表达式消除、循环优化和内联函数等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程名称编译原理设计题目语法分析——规约目录一.问题描述 (2)二.文法及属性文法的描述 (2)2.1文法描述 (2)2.2 while-do循环语句的文法 (2)2.3属性文法描述 (2)3语法分析方法及中间代码形式的描述 (3)3.1 语法分析方法 (3)3.2 中间代码形式描述 (3)4简要的分析与概要设计 (4)4.1词法分析 (4)4.2递归下降翻译器的设计 (4)4.3语法制导翻译 (5)5 详细的算法描述 (5)5.1 文法 (6)5.2 查错 (6)三.测试方法和测试结果 (9)3.1测试方法 (9)3.2测试结果 (9)四.设计心得 (10)一、问题描述1.1 能够写出一个while-do语句,此语句符合LL(1)的文法。
1.2 构造词法分析程序对while-do语句进行词法分析。
1.3构造语法分析程序对while-do语句进行语法分析,判断语法正确性。
1.4 运行程序,要求有正确的语义输出(4地址码)。
二、文法及属性文法的描述:2.1 文法描述:基本概念:文法是对语言结构的定义与描述。
即从形式上用于描述和规定语言构的称为“文法”。
定义:文法G=(V N,V T,P,Z)V N:非终结符号集V T:终结符号集P:产生式或规则的集合Z:开始符号(识别符号) Z∈V N其中:2.2 while-do循环语句的文法文法G(s)如下:S-->WEDG (意思是while E do G)G-->c=RR-->dTe|dT-->+|-|*|/E-->aFbF--> >|==|< (id1,id2代表标识符)2.3 属性文法的描述:2.3.1属性文法的定义形式:每个文法符号有一组属性,每个文法产生式A->α有一组产生式b:=f(c1,c2,……,ck)的语义规则,其中f式函数,b和c1,c2,……,ck式该产生式文法符号的属性。
3.语法分析方法及中间代码形式的描述;3.1 语法分析方法:3.1.1本次设计采用LL(1)分析:预测分析方法概述:分析钜阵的元素M[A,a]中的下标A为非终结符,a为终结符或句子的结束标记“#”,钜阵元素M[A,a]的内容为一条关于A的产生式。
它表明当用非终结符A向下推而当输入符a时,所应该采用的后选式。
当钜阵元素为空时,则表示用A往下推导时遇到了不应该出现的符号,即A与a不能匹配,因此应该出错处理。
在构造预测分析表时,对每个终结符或“#”号用a表示,则若a∈SELECT (A->a)。
令M[A,a]= A->a(一般为了简化,取M[A,a]= a)把所有的无定义的M[A,a]标上ERROR(一般在表中用空白表示)。
3.1.2 此程序预测分析方法:此设计为非左递归while-do文法,应采用自上而下的预测分析方法。
在此设计中,产生式只到E->id1>id2| id1=id2| id1<id2,F-> id1= id2(E->aFb F->>|==|<)对F只有一种产生式而在输入串中的终结符a,b……等在程序中用id代替了,正好做到了输入串和符号栈的匹配抵消,因此简化了预测分析表的构造,对于E 来说有3个侯选式,在本程序中通过函数firstset()来判断应该选哪个产生式,但是firstset()是依赖Token2数组来判断的,没有完全摆脱掉数组的限制,因此也是本程序的不足之处。
3.2 中间代码的描述:3.2.1中间代码概述:中间代码采用四元式输出,一个四元式是一个带有四个域的记录结构,这四个域分别称为op﹑arg1﹑arg2及result。
域op包含一个代表运算符的内部码。
语句while a<b do a=a+b的四元式输出形式如下:100( <, a , b , 102 )101 ( j , _ , _ , 105 )102 ( + , a , b , n )103 ( = , n , _ , a )104 ( j , _ , _ , 100)3.2.1本次设计的中间代码:本次程序的中间代码是根据一定的语义规则写出的:F代码结构:S.begin :E.ture :to E.false :4.简4.1词法分析词法分析程序的任务是:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号的中间程序。
词法分析检查的错误主要是挑出源程序中出现的非法符号。
所谓非法符号是指不是程序设计语言中允许出现的符号,就像自然语句中的错字。
4.2递归下降翻译器的设计1.:对每个非终结符F构造一个函数过程,对F的每个继承属性设置一个形式参数,函数的返回值为F的综合属性,F对应的函数过程中,为出现在F的产生式中的每一个文法符号的每一个属性都设置一个局部变量。
非终结符F对应的函数过程中,根据当前的输入符号决定使用哪个产生式候选。
2:每个产生式对应的程序代码中,按照从左到右的次序,对于单词符号,非3:终结符和语义动作分别做以下工作。
(1)对于带有综合属性x的终结符X,把x的值存入为X,x设置的变量中。
然后产生一个匹配X的调用,并继续读入一个输入符号。
(2)对于每个非终结符号R,产生一个右边带有函数调用的赋值语句c=R(r1,r2,…,rk)(3)对于语义动作,把动作的代码抄进分析器中,用代表属性的变量来代替对应属性的每一次引用。
4.3语法制导翻译在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或语义规则描述的语义动作)进行翻译。
属性文法的每个符号有属性,所以每个符号入栈时,必须连属性一起入栈,这样,栈符号就由文法符号及存放该符号属性的域所组成。
由于属性类型不同,属性域存放的内容就要根据属性的类型来定。
有的可能直接存放属性值,也有的存放的是指向属性值的指针。
对于综合属性,其属性域不存放其属性值,而是存放一个指针,指向存贮该属性值的单元。
对于继承属性,其属性域直接保存其属性值。
继承属性的属性域刚入栈时为空,但是在该栈符号变成栈顶符号之前的某一时刻,它们必须接受相应的属性值,即在成为栈顶时,继承属性的属性域必须有值。
5.详细算法描述5.1 文法/*文法G(s)s-->WEDGG-->c=RR-->dTe|dT -> +|-|*|/|%E-->aFbF--> >|==|<*/5.2 查错:按照递归下降法求Wa<bDa=a+b,程序的执行顺序是S()→W()→E→F()→D()→G()→R()→T()1)S()void S(){printf("%d\tS-->WEDG\n",total);total++;W();E();}2)W()void W(){if(ch!='W'){printf("有非法字符%c请按回车返回!!",ch);getchar();getchar();exit(1);}}3)E()void E(){ch=a[++i1];if(ch!='a'){printf("有非法字符%c %c请按回车返回!!",ch);getchar();getchar();exit(1);}printf("%d\tE-->aFb\n",total);total++;F();}4)F()void F(){int i;ch=a[++i1];i=i1+1;if(a[i]!='b'){printf("有非法字符%c请按回车返回!!",a[i]);getchar();getchar();exit(1);}switch(ch){case '>':printf("%d\tF-->>\n",total);total++;break;case '==':printf("%d\tF-->==\n",total);total++;break;default:printf("%d\tF--><\n",total);total++;break;}D();G();}5)D()void D(){++i1;ch=a[++i1];if(ch!='D'){printf("有非法字符%c请按回车返回!!",ch);getchar();getchar();exit(1);}ch=a[++i1];}6)G()void G(){int i=i1+1;if(ch!='c'&&a[i]!='='){printf("有非法字符%c %c请按回车返回!!",ch,a[i]);getchar();getchar();exit(1);}printf("%d\tG-->c=R\n",total);total++;R();}7)R()void R(){int i;i=i1+1;i1=i1+2;ch=a[i1];if(a[i]!='='&&ch!='d'){printf("有非法字符%c %c请按回车返回!!",a[i],ch);getchar();getchar();exit(1);}else{if((a[i1+1]=='+')||(a[i1+1]=='-')||(a[i1+1]=='*')||(a[i1+1]=='/')){printf("%d\tR-->dTe\n",total);total++;T();}else{printf("%d\tR-->d\n",total);total++;W();E();}}}8)T()void T(){ch=a[++i1];switch(ch){case '+':printf("%d\tT-->+\n",total);total++;break;case '-':printf("%d\tT-->-\n",total);total++;break;case '*':printf("%d\tT-->*\n",total);total++;break;default:printf("%d\tT-->/\n",total);total++;break;}ch='#';}三、测试方法和测试结果3.1测试方法在C++环境下,设计几个有代表的用例,进行测试,例如:输入语句W(while)a<bD(do)a=a+b#(其中d表示do ,w表示while)。