您好,欢迎访问三七文档
第四章语法分析学习重点上下文无关文法自顶向下分析方法:递归实现、表驱动自底向上分析方法算符优先分析方法LR分析方法SLR规范LRLALR概述为什么使用上下文无法文法?精确、容易理解的语法描述特定类别语法——编译器自动构造额外好处——发现二义性和难于分析的结构加入特殊结构——翻译、错误检测基于语法的翻译方法描述——程序语言发展变化(新语句,语句变化…)——容易增加新结构,修改已有部分ADAADA9x,C++增加:模板、异常工具4.1语法分析器的角色errorslexicalanalyzerparserrestoffrontendsymboltablesourceprogramparsetreegetnexttokentokenregularexpressions•通常作为语法分析器的一部分实现•包括对单词扩充信息,以进行类型检查、语义分析等工作•利用语法检查单词流的语法结构•构造语法分析树•语法错误和修正•识别正确语法•报告错误intermediaterepresentation三类语法分析器通用分析器,Cocke-Younger-Kasami算法,Early算法,适用任何文法,效率低自顶向下分析器,top-down自底向上分析器,bottom-uptop-down,bottom-up:适用特定类别文法——LL、LR,描述能力足够4.1.1语法错误处理不同层次的错误词法:拼写错误语法:单词漏掉、顺序错误语义:类型错误逻辑:无限循环/递归调用语法错误处理为重点语法错误相对较多编译器容易高效检测错误处理目标三个“简单”的目标清楚、准确地检测、报告错误及其发生位置快速恢复,继续编译,以便发现后续错误不能对“正确”程序的编译速度造成很大影响完全实现困难LL,LR,可最快速度发现错误活前缀特性,viable-prefixproperty一个输入前缀不是语言中任何符号串前缀——发生错误例4.1有关程序错误的统计60%的程序无语法、语义错误错误发生是分散的:错误语句中80%只有一个错误,13%有两个多数错误是简单的:90%的错误是单个单词错误错误分类:60%是标点符号错误,20%是运算符和运算对象错误,15%是关键字错误例4.1(续)#includestdio.hintf1(intv){inti,j=0;for(i=1;i5;i++){j=v+f2(i)}returnj;}intf2(intu){intj;j=u+f1(u*u);returnj;}intmain(){inti,j=0;for(i=1;i10;i++){j=j+i*iprintf(“%d\n”,i);}printf(%d\n,f1(j));return0;}哪些“容易”恢复?哪些“困难”?4.1.2错误恢复策略1.Panic模式丢弃单词,直到发现“同步”单词设计者指定同步单词集,{end,“;”,“}”,…}缺点丢弃输入遗漏定义,造成更多错误遗漏错误优点简单适合每个语句一个错误的情况错误恢复策略(续)2.短语级(phraselevel)局部修正,继续分析“,”“;”,删除“,”,插入“;”同样由设计者指定修正方法避免无限循环有些情况不适用与Panic模式相结合,避免丢弃过多单词错误恢复策略(续)3.错误产生式(errorproduction)理解、描述错误模式文法添加生成错误语句的产生式拓广文法语法分析器程序如,对C语言赋值语句,为“:=”添加规则报告错误,但继续编译错误检测信息+自动修正错误恢复策略(续)4.全局修正(globalcorrection)错误程序正确程序寻找最少修正步骤,插入、删除、替换不正确输入x,文法G—————y对应的语法分析树过于复杂,时空效率低最少修正xy4.2上下文无关文法定义:四元式(VT,VN,S,P)1.VT:终结符号(单词)集,T2.VN:非终结符(语法变量)集,NT,定义了文法/语言可生成的符号串集合3.S:S∈NT,开始符号,定义语言的所有符号串4.P,产生式集,PR,NT(T|NT)*规则T、NT如何组合,生成语言的合法符号串例4.2:简单表达式exprexpropexprexpr(expr)expr-exprexpridop+op-op*op/op蓝色符号——T,黑色符号——NT4.2.1符号约定1.终结符字母表靠前的小写字母,a、b、c…运算符,+、-…标点符号,(、)、,…数字,0、1、…、9粗体字符串,id、if…蓝色字符串,id、if…符号约定(续)2.非终结符字母表靠前的大写字母,A、B、C…S,通常作为开始符号斜体小写字符串,expr、term、…3.字母表靠后的大写字母X、Y、Z,语法符号——T或NT4.字母表靠后的小写字母u、v…,终结符号串,T*符号约定(续)5.小写希腊字母a、b、g…,语法符号串,(TNT)*6.左部相同的产生式可合并,‘|’——“或”Aa1;Aa2;…;Aak;Aa1|a2|…|a1,候选式7.第一个产生式的左部为开始符号例4.3利用符号约定简化文法例4.2中表达式文法简化后结果EEAE|(E)|-E|idA+|-|*|/|4.2.2推导(derivation)描述文法定义语言的过程自顶向下构造语法分析树的精确描述将产生式用作重写规则由开始符号起始每个步骤将符号串转换为另一个符号串转换规则:利用某个产生式,将符号串中出现的其左部NT替换为其右部符号串推导(续)EE+E|E*E|(E)|-E|idE-E,E可替换为-EE-E,“E直接推出-E”E*E(E)*EE-E-(E)-(id)替换序列,E-(id)的一个推导定义形式化定义aAbagb仅当存在产生式Aga1a2…an——a1an若ab且bg,则ag,“一步推导”,“直接推出”,推导步数=1,“一步或多步推导”,推导步数≥1,“0步或多步推导”,推导步数≥0***+*推导与语言的关系文法G,开始符号S,生成的语言L(G)终结符号串wwL(G)Sww:G的一个句子,sentenceCFG生成上下文无关语言两个CFG生成相同语言,两个CFG等价Sa,a可能包含NTa:G的一个句型,sententialform句子:不包含NT的句型*+例4.4EE*Eid*Eid*id句型句子E-E-(E)-(E+E)-(id+E)-(id+id)另一种推导过程E-E-(E)-(E+E)-(E+id)-(id+id)最左推导和最右推导最左推导:总替换最左边的NTE-E-(E)-(E+E)-(id+E)-(id+id)最右推导:总替换最右边的NTE-E-(E)-(E+E)-(E+id)-(id+id)形式化定义:AwAgwg,w只含TbAwbw,w只含TSa,a:最左句型,left-sententialformlmlmlmlmlmrmrmrmrmrmlmrm*lm4.2.3语法分析树和推导语法树:推导的图示,但不体现推导过程的顺序内部节点:非终结符A内部结点A的孩子节点:左右,对应推导过程中替换A的右部符号串的每个符号叶:由左至右句型,yield,frontier语法树与推导的关系一个推导过程:a1a2…ana1≡A,单节点,标记为Aai-1=X1X2…Xk对应语法树T第i步推导,XjY1Y2…YrT的第j个叶节点,添加r个孩子节点Y1,Y2,…,Yr,特殊情况,r=0,一个孩子e例4.5E-E-(E)-(E+E)-(id+E)-(id+id)例4.5E-E-(E)-(E+E)-(id+E)-(id+id)E-E-(E)-(E+E)-(E+id)-(id+id)一棵语法树可多个推导一棵语法树唯一最左推导,唯一最右推导4.2.4二义性文法(例4.6)句子多个语法树,多个最左(右)推导EE+Eid+Eid+E*Eid+id*Eid+id*idEE*EE+E*Eid+E*Eid+id*Eid+id*id4.3设计CFG4.3.1正规式与CFG正规式词法分析的基础描述正规语言描述能力不够,anbn,n≥1上下文无关文法语法分析的基础描述程序语言结构上下文无关语言正规式与上下文无关文法正规式可描述的语言CFG均可描述,(a|b)*abbA0aA0|aA1|bA0A1bA2A2bA3A3e正规语言上下文无关语言Reg.Lang.CFLsNFACFG1.状态i非终结符Ai:A0,A1,A2,A32.AiaAj3.AiAj4.若i为终态Aie:A3e5.若i为初态,Ai为开始符号:A0正则文法start03b21baabija:A0aA0,A0aA1:A0bA0,A1bA2:A2bA3ijeNFACFGAi的含义是什么?状态i终态路径上的符号串集合Ai取“初态状态i路径上的符号串集合”是否可以?变换规则如何修改?文法变成什么样?AjAiaA0eA0A0a,A1A0aA0A0b,A2bA1A3A2b,A0e为什么还需要正规式?1.词法规则很简单,正规式描述能力足够2.正规式更简洁、更容易理解3.能更自动构造更高效的词法分析器4.使编译器前端更模块化词法、语法规则的划分没有固定准则正规式更适合描述标识符、常量、关键字…的结构CFG更适合描述单词的结构化联系、层次化结构,如括号匹配,if-then-else,…4.3.2CFG的验证证明CFGG生成语言LG生成的每个符号串都在L中L中每个符号串都可由G生成例4.7:验证CFGS(S)S|e生成的语言L={所有括号组成的,且括号匹配的字符串,且只有这些字符串}一、S推导出的句子都L数学归纳法(推导步数):1.基本情况:一步推导,e,括号匹配2.假定步骤n的推导都生成括号匹配的句子,考虑步骤=n的最左推导,必形如S(S)S(x)S(x)yx、y为步骤n的推导生成的句子——括号匹配的,因此(x)y是括号匹配的综合1、2,一得证**二、L中的符号串S都可推导出数学归纳法(符号串长度)1.基本情况:空串,可由S推导出2.假定L中2n的符号串都可由S推导出。考虑长度=2n的符号串w。它必以‘(’开始,设(x)为w的最短的括号匹配的前缀,则w形如(x)y,x、y长度小于2n,且括号匹配,因此可由S推导出,则存在推导S(S)S(x)S(x)y由1、2,二得证由一、二,原命题得证**设计CFG练习基本的递归L={anbb2n|n≥0}S→b|aSbb不包含子串011的0/1串S→0A|1S|eA→0A|1B|eB→0A|e形如xy(x≠y)的01串长度是什么情况必然不是xx?如何描述?其他情况如何描述?奇数S→B|BSBB→0|1设计CFG的难点手工进行,无形式化方法不同的语法分析方法对CFG有不同的特殊要求如自顶向下分析方法和自底向上分析方法CFG设计完成后可能需要修改CFG的修改两个目的去除“错误”重写,满足特殊要求-二义性-e-moves-回路-左递归-提取左公因子不合要求的问题4.3.3消除二义性例子:条件分支语句stmtifexprthenstmt|ifexprthenstmtelsestmt|other(任何其他形式的语句)无二义性的句子ifE1thenS1elseifE2thenS2elseS3语法树如下stmtstmtstmtexprexprE1E2S3S1S2thenthenelseelseififstmtstmt二义性句子ifE1thenifE2thenS1elseS2有两种意义ifE1thenifE2t
本文标题:编译原理语法分析.
链接地址:https://www.777doc.com/doc-2069020 .html