请问下面句子是否正确的坐姿应做到,如正应怎样做语法分析

推荐这篇日记的豆列
&&&&&&&&&&&&
&(12人关注)您当前的位置:
& SAT语法句子改进题语法体系分析
SAT语法句子改进题语法体系分析
导读:SAT语法句子改进题语法体系分析,SAT语法句子改进题是一种新题型,这种新的题型一般以一个长句作为一个最小单位,句子或句子的部分画线,针对画线部分给出了五个选项,其中选项A是原画线部分,BCDE对A做了修改,要求考生在五个选项中选出最正确和最简洁的。下面我们就为大家详细介绍SAT语法之句子
SAT语法句子改进题语法体系分析,SAT语法句子改进题是一种新题型,这种新的题型一般以一个长句作为一个最小单位,句子或句子的部分画线,针对画线部分给出了五个选项,其中选项A是原画线部分,BCDE对A做了修改,要求考生在五个选项中选出最正确和最简洁的。下面我们就为大家详细介绍SAT语法之句子改进题,供考生们参考。  句子改进题的特点是:正确性,简洁性,最佳性。  SAT语法句子改进题的常考语法体系:  1、主谓一致。尤其用于倒装时,比如therebe句型或地点状语至于句首,要找到真正的主语;有插入语时,要勇敢的抛弃非中心部分,找到真正的主语;主谓一致还会出现在一些固定用法中,但是一般比较简单,比如neither nor或者not only but also等等。  2、逻辑主语,当分词或者形容词放在句首,一定要考虑它的主语问题。  3、时态的混用,常出的错误是:have+过去式,过去完成时和一般过去式混用,现在完成时和一般过去式的混用。  4、名词和代词,常常名词单复数混淆,男女混淆,主格宾格混淆;也会在their、it和they之间指代不明;关于指代,跨段之间不能指代,it不能指代整个句子,只能指代一个名词或动作,one和they不能相互指代,one和you也不能相互指代;this不能单独充当主语和宾语。聚培训教育助力SAT高分  5、同类比较,只有同类的东西才能用于as well as和than句型。  EG:The population of China is larger than that of America.  6、adj和adv的混用:adj修饰名词,adv可以修饰除名词外的大部分词。Adj和adv两者之间用比较级,三者或三者以上用最高级。  7、句子结构上,&,&不能连接两个句子,&;&等于and,必须连接两个句子;且一个长句中,谓语动词和连接词的数目要平衡。  其实,SAT语法句子改进题的知识面是很险隘的,出题也是很有规律的,只要能掌握其基本出题规律和常错原则,加以适当地练习,语法部分应该是整张SAT试卷中最简单的部分。  上面就是对SAT语法之句子改进题的介绍,希望对大家有帮助。聚培训教育助您突破SAT考试瓶颈,短期备考拿高分。
提交评估, 试听名师一对一试听课
1SAT语法句子改进题语法体系分析相关文章
& 有时候SAT语法中会出现一词多义的现象,不同的语境中的同一个词汇就能翻译出不同的效果。下面聚培训小编帮助同学们来整理一下关于SAT语法中的同义词的问题。& 在课堂上,我经常跟学生说,不要认为一个词只有一个意思,词比人开放,不同的场合它可以是双性恋还可以是三性恋。比如perfec
& 下面就是今天聚培训小编给大家带来的SAT语法词汇搭配的内容,希望能够帮助同学们备考SAT考试,更多关于SAT备考的信息请进行关注聚培训SAT备考频道,我们会每天给大家提供最新的SAT备考信息。下面的内容快背起来吧。& 1. be preoccupied/preoccupation with& 例句: Management&s preoccupation with c
& 改革后的SAT写作成为了选考科目,这种考试形式也让考生感到惊慌失措,其他的考试形式以及内也都有了一定的变化,要想取得SAT高分,同学们就不能因为改革而慌张。接下来小编就给同学们带来了关于新sat考试内容以及备考建议的相关内容,一起看一下吧!& 新SAT考试科目介绍& 阅读& 阅读
新SAT写作真题范文【OG-1】!SAT写作官方指南真题是考生必备的参考资料,下面聚培训为考生带来了官方指南OG第一套写作题目及范文资料,建议考生可以自己先做一遍然后核对范文,可以起到很好的纠正和补充的作用。Isitimportanttoquestiontheideasanddecisionsofpeopleinpositionsofauthority?Everypersonhashisorherownideaofethicsandm
& 在申请美国大学的时候,很多同学们都想要早申请,但是具体是如何进行的呢?下面就是今天聚培训小编给大家带来的通过SAT考试早申请美国大学的内容,请继续关注聚培训SAT相关频道,我们会每天给大家提供最新的SAT备考信息。& &早申请&到底是什么?为何如此重要?怎样进行合理的
SAT语法句子改进题语法体系分析相关推荐
SAT语法句子改进题语法相关机构
17sat-福州SAT(美国高考)考试辅导培训中心由原”新东...
——机构共 1 课程
陕西牛学教育软件开发有限公司是一家专业从事出国英语培训的机构...
——机构共 16 课程
    北京澳际教育咨询有限公司是首批获得国家教育部资质认证...
——机构共 1 课程
智赢国际英语成立于2008年4月,是新世界教育集团旗下出国类...
——机构共 17 课程
新航道国际教育集团(New Channel Internat...
——机构共 72 课程
啄木鸟国际教育咨询由中国资深海外升学顾问陈起永老师(前新东方...
——机构共 11 课程
锦程教育创建于2011年,一直以来专注于留学英语培训领域,有...
——机构共 1 课程
  韦思(WECI)国际英语源起加拿大,2000年花开福建,...
——机构共 29 课程
SAT语法句子改进题语法相关课程
课程简介:针对SAT考试阅读、填空、语法、写作,讲练结合,强...
已关注: 417
(1)SAT基础VIP精品班班级人数:2-4人 总课时100...
已关注: 259
南宁新航道新SAT保1400强化班(6人班) 开课时间:SA...
紫铭教育2001年开始涉足美国高考SAT培训,...
已关注: 1474
针对人群:● 【启德SAT 词汇测试】未掌握2000 SAT...
已关注: 37
合肥SAT考前冲刺班......
已关注: 1864
招收对象:有留学前SAT成绩要求的学员;需要用到SAT成绩申...
已关注: 2562
赛达(SAT)基础精品6人班适合学员初三优秀学员;高中英语成...
已关注: 402当前位置: >>
第6章自底向上语法分析方法
第6章自底向上语法分析方法所谓自底向上语法分析法就是从输入 串开始,逐步进行“归约”,直至归约 到文法的开始符号;或者说从语法树的 叶子开始,步步向上“归约”,直至长 出树根为止。 教学内容自底向上语法分析的基本思想; 短语、直接短语和句柄的定义,以及如 何利用语法树寻找短语、直接短语和句 柄。 自底向上语法分析方法:优先分析法 LR分析法 一、自底向上的语法分析思想【自底向上(down - top)分析法的基本思想】 自底向上语法分析的基本思想是从左向右扫描 输入串,一边将输入符移进分析栈内,一边检 查位于栈顶的一串符号是否与某个产生式的右 部相同,若发现相同,就把栈顶的这串符号替 换为相应产生式的左部的非终结符(这种替换 就称为“归约”);若不相同,则继续移进输 入符。并继续判断。重复这一过程直到输入串 已到达串尾,而栈内恰好为给定文法的开始符 号(假定未发现错误)时为止。此时表明分析 成功,也就确认输入串是文法的句子。 这种分析方法也称为移进-归约分析法。 可归约串可归约串:即每次归约的那串符号 (是各个产生式的右部),称为 “句柄”。 自底向上语法分析的关键: 在自底向上语法分析的过程中, 最关键的问题就是如何识别句柄。 示例【例1】设有以下文法G1[S]: S→aAcBe A→Ab|b B→d 分析输入串abbcde是否为文法的句子。 分析栈 1 2 3 4 5 6 7 8 9 10 11 # #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S输入串 abbcde# bbcde# bcde# bcde# cde# cde# de# e# e# # #动作 移进 移进 归约 移进 归约 移进 移进 归约 移进 归约 成功产生式句柄A→bA→AbbAbB→d S→aAcBed aAcBe 下面从建立语法树来 看句子的推导过程。 为了自底向上地构造 输入串abbcde的语法 树,首先从输入串出 发,根据产生式规则 自底向上地生长出这 棵语法树,最后长出 树根节点S。语法树 的建立过程如图所示。SA A Bab b c d e 语法树S a A c B eAbdb 采用最右推导在自底向上语法 分析的过程中, 考虑的是最右推导的逆过程。 例如,上述输入串abbcde的语法分析过程其实就是最右推导的逆过程。最右推导: S ? aAcBe ? aAcde ? aAbcde ? abbcde 规范归约规范推导:即最右推导。 规范归约:规范推导的逆过程。 规范句型:由最右推导推导出的句型。 结论规范句型=分析栈内的内容+剩余的输入串 分析过程的不确定性两种动作:移进 归约若在自底向上的分析过程中,语法分析 程序每次只面临一种动作选择,要么移 进,要么归约,则这个分析过程就是确 定的,不会产生错误归约。 若在某一步的分析中,既可移进又可归 约或者同时可选择两种归约动作,则语 法分析程序的动作就是不确定的。 例如在前面的分析过程中,在第5步时栈 中的符号串是#aAb,栈顶符号串b和Ab 分别是产生式 A→Ab , A→b的右部, 这时到底用A→Ab归约还是用A→b归约 是自底向上分析要解决的关键问题。 存在的问题在自底向上的分析过程中,存在 两个问题: 移进_归约冲突 归约_归约冲突 二、句柄的定义短语、直接短语、句柄的定义 * + 【短语】若S?αAδ且A?β,则称β是相 对于非终结符A的句型αβδ的短语。 * 【直接短语】若S?αAδ且A→β,则称β 是相对于非终结符A的句型αβδ的直接 短语(也称为简单短语)。直接短语是某个产生式右部的符号串。【句柄】位于句型最左边的直接短语称为 该句型的句柄。 示例【例2】文法G2[S]: S→AB A→bB A→Aa B→a B→Sb 求句型baSb的全部短语、直接短语、句柄。 讨论句型baSb的子串b,a,ba,baS,S,aSb,……等 都是句型的短语吗? 根据短语的定义,可由句型的推导过程中 找出其全部短语和直接短语,以及句柄。 推导1. S ? AB ? bBB ? baB ? baSb * baB 且 B→Sb 因为S ? 所以子串Sb是句型baSb的直接短语。 讨论推导2. S ? AB ? ASb ? bBSb ? baSb * 因为S ? bBSb 且 B→a 所以子串a是句型baSb的直接短语。 在推导2中,又因为S ? ASb 且 A ? ba 所以子串ba是句型baSb的短语。* + 结论对于该句型,再没有其它能产生新的短 语的推导,所以有结论: 句型baSb总共有三个异于自身的短语: Sb,a,ba 其中Sb,a为直接短语 其中a为句柄 利用语法树求短语、直接短语、句柄根据定义寻找句型的所有短语、直接短 语和句柄这种方法不直观,而且很难知 道是否已穷尽所有情况。另一种方法是 利用语法树。 子树:由语法树中的某一个结点连同其 所有下层的后代结点组成的部分。 简单子树:只有单层分支(即父子两代) 的子树。 ? 语法树是四代的。Sa c A B A ε a1代2代 3代 4代 方法短语:每棵子树的各端末节点从左向右 排列形成一个短语。 直接短语:每棵父子两代的子树(即简 单子树)的各端末节点从左向右排列形 成一个直接短语。 句柄:位于语法树最左边的父子两代的 子树的各端末节点从左向右排列形成句 柄。 示例【例2】文法G2[S]: S→AB A→bB A→Aa B→a B→Sb 求句型baSb的全部短语、直接短语、句柄。 有后代的非终结符形成一棵子树S A BbBSb句型baSb的短 语:ba,a,Sb, baSb。 直接短语:a, Sb。 句柄:aa 【例3】算术表达式文法G 3[E]: E→E +T | T T→T * F | F F→i |(E) 给出句子 i+i * i 的所有短语、 直接短语、句柄。示例 语法树E E + TTF i1 i2 FT*F i3句子 i+i * i的短语: i1,i2,i3, i2 * i3 , i1+i2 * i3 直接短语: i1,i2,i3 句柄: i1 三、句柄的识别方法根据句柄的定义可知,句柄有两个主要 特征。第一,它是直接短语(即某个产生式的右 部); 第二,它具有最左性,即是最左直接短语。根据这两个特征可以设计识别句柄的各 种方法,由此而形成不同类型的文法。 遇到的问题在任何自底向上的分析法中,语法分析 器的设计必须解决下面两个问题: (1)如何保证所找到的直接短语(即某个 产生式右部的符号串)是最左的。 (2)如何确定句柄在句型中的开始位置和 结束位置,从而可以抽取它。 解决最左性对于第一个问题,可以根据句柄的最左性 来解决。 分析器自左向右地逐个读入输入串,使用 分析栈存放读入的符号,并同时检查栈顶 是否形成直接短语。任何时刻,栈内符号 串和剩余输入串都形成一个规范句型,并 且栈内符号串构成句型的左部。因此,一 旦栈顶部形成直接短语,它必定是最左直 接短语,即句柄。 确定句柄的起始位置对于第二个问题的不同解决方法产生了不同类 型的文法。 两种判别句柄首尾的方法; (l)“优先”法:利用归约的先与后来识别句柄。 有简单优先分析法,算符优先分析法。 (2)状态法:用“状态”的概念来描述不同时刻 下所形成的那部分句柄。例如对于产生式: A→aBC,对应4种不同的识别状态: A → ? aBC,A → a? BC,A → aB? C,A → aBC? 基于此种思想的有LR分析法。 四、算符优先分析法算符优先分析法是Floyd在1963年首先提 出来的,Greis在1971年把它形式化。这 是一种古典而又实用的方法,用这种方 法在分析程序语言中的各类表达式时尤 为有效。不少编译程序中都使用这种方 法分析表达式,而使用其他方法分析其 余语言成分。由于这种方法的简单直观, 它又特别便于手工实现。 1.终结符a和b相邻对文法G中的两个终结符可能在某个句 型中直接相连或中间仅隔一个非终结符 Q,则称a与b相邻。 即句型可能为: …ab…和…aQb… 其中Q∈VN ,a,b∈VT _ . (a)同等优先 _ 由于同一产生式右部的各终结符同时归 约,所以定义同一产生式右部里的各相 邻终结符之间的关系是同等优先,表示 _ . 同时归约(记为 _ )。 【例如】对于下面的产生式: _ _ . . P→aAbcD,有 a _ b和 b _ c2.终结符a和b的优先关系 . (b)后于…归约 <一般地说来,设A→…aT…是一产生式, + + 若 T ? b… 或T ? Rb…, 即b是从T推导出的最左端的终结符,那 . 么就有a < b。 即FIRSTVT(T) . (c)先于…归约 >一般地说来,设A→…Tb …是一产生式, + + 若 T ? …a 或 T ? …aR , 即a是从T推导出的最右端的终结符,那 . 么就有a > b。 即LASTVT(T) 3. 算符优先文法【算符文法】对于上下文有关文法G,如果它的 每个产生式的右部没有两个非终结符直接相邻, 即没有P →…QR…(Q、R∈VN )形式的产生 式,则G是一个算符文法。 例如:描述算术表达式的文法: E → E+E | E/E | E―E |(E)| E * E | i 这个文法有这样的特点:它的每个产生式的右 部没有两个非终结符直接相邻,两个非终结符E 之间总是有一运算符相隔。使用这个文法决不 会产生形如 …+E1E2 * … 之类的句型,其中E1E2 是两个并列的非终结符。 句型E+E *E有两棵语法树E EE E +* EEE+ EE * E. +>*. +< * 算符优先文法的定义【算符优先文法】如果算符文法G中的任何 一对终结符a和b之间,仅满足四种关系 _ . > . ( _ ,< ,. ,无关系)中的一种关 系时,那么G就是一个算符优先文法 (OPG)。 【例4】算术表达式文法G 4[E]: 示例 E→E +T | T T→T * F | F F→i |(E) 求出该文法中所有的优先关系。 _ . 1. _ 关系 因为: F→(E) _ . 有: ( _ ) . < 关系 + . A→…aT …,若T?(R)b…,则a< b因为: E → … +T. 有T ? T * … 则 +< * . T?F?i… 则 +< i . T ? F ? (… 则 +< ( . .( T→ … *F 则 *< i,* < . F→(E … 有E ? E + … 则(< + E ? T ?……同上T的推导, . . . 则 ( < * ,( < i,( < ( . > 关系 + . A→…Tb …,若T?…a(R) ,则a > b因为: E→E +…. 有E ?… +T 则 +> + . E ? T ?… * F 则 * >+ . E ? T ? F ? …i 则 i>+ E ? T ? F ? …) 则 ) . + > . . T→T * … 则 * > * ,i> *,). * > . . . F→…E) 则 + > ),* > ),i > ),) . ) > 4.算符优先矩阵表示:通常用矩阵的形式存放文法中各 种可能的优先关系。 大小:矩阵是n×n的,其中n是文法中终 结符的个数。 假定终结符以同样的次序在行向和列向 . 上排列。关系a< b中,a表示矩阵某行上 的终结符,b表示某列上的终结符。 例4中文法的算符优先矩阵a+ b + * ( ) i*( ) i. > . > . <. < . > . <. < . < . <. > . > _ _ .. < . < . <. > . >. >. >. >. > 5. 算符优先分析法根据优先分析的基本原理,语法分析程 序的主要任务就是:不断移进输入符号, 识别句柄并归约它。 . > 识别句柄的方法:利用“先于”关系( ) . 识别句柄尾;利用“后于”关系( ) < 识别句柄头。 如何归约在分析过程中,利用分析栈存放已识别的那部 分句型,而句型的其余部分由剩余输入串组成, 通过比较栈顶符号和下一个输入符号之间的关 系,可以判别栈顶符号是否为句柄尾符号。如 果是句柄尾(利用 关系 ),则沿栈顶向 . . . < 下,在栈内寻找句柄头(利用 关系)。由 < > . > 关系之间包括的符号串就是句柄, 关系和 然后把它们弹出栈,并代之以归约后的非终结 符。这样就完成了一次归约过程。 给出例4中输入串i+i * i的分析 过程: 规定: . . #< 所有的文法符号 > # 1 2 3 4 5 6 7 8 9 10 11 #E分析栈 (栈顶终结符,输入符) 剩余输入串 # # . i 移进i i+i*i# < . #i i >+ 归约i +i*i# #F # . +移进+ +i*i# < #F+ + . i 移进i i*i# < . # F+i i >* 归约i *i# #F+ F + . * 移进* *i# < . #F+ F* * < i 移进i i# . # F+ F*i i >#归约i # . #F+ F* F * > # 归约F*F # . #F+ T +> # 归约F+T #成功接收 # 建立的语法树E TE E + T TF i i+ FTF Fi*F i*F ii真正的语法树 问题有时未归约真正的句柄。在第3步把i1 归约为F, i1 是句柄。在第10步中F1 是该句型的句柄,但 却把F1+F2当着句柄归约(注意,下标是为了 区别两个F的,下同)。 不是严格按最左归约行事。句型F1+F2中,F1 是最左直接短语,但未归约F1,而是归约F1+ F2。 归约的符号串有时和相应产生式的右部不相同, 仅相似。例如 F+F和产生式 E → E+T的右部 不一样,仅结构相同,都是两个非终结符中间 夹一个“+”号。 最后仍能正确地识别句子。 原因在算符优先分析过程中没有考虑非终结 符之间的优先关系,没有顾及到单个非 终结符可能称为一个句型的句柄,从而 没有考虑单非产生式的归约过程,所以 归约的不是真正意义上的句柄。 例如:E→ T T→ F 没有考虑这样的产生式的归约过程。 最左素短语素短语有以下3个特征; (a)它首先是一个短语, (b)它至少含一个终结符号, (c)除自身外,不再包含其他素短语。 最左素短语(LPP_leftmost Prime Phrase): 位于句型最左边的素短语。 判别方法:利用语法树。 【例5】算术表达式文法G 5[E]: E→E +T | T T→T * F | F F→i |(E) 1.给出句子 i+i * i 的所有素短语、最左 素短语、短语、直接短语、句柄。 2.给出句型 F + F *F * i 的所有素短语、 最左素短语、短语、直接短语、句柄。示例 语法树――1E E + TTF i1 i2 FT*F i3句子 i+i * i的短语: i1,i2,i3, i2 * i3 , i1+i2 * i3 直接短语:i1,i2,i3 句柄: i1 素短语: i1,i2,i3 最左素短语:i1 语法树――2E E + TTF1 F2T T **F3F i句型F+F *F * i的短语: F1,F2,i,F2 *F3 , F2 * F3*i , F1+F2 * F3 *i 直接短语:F1,F2,i 句柄:F1 素短语: F2*F3 ,i1 最左素短语:F2*F3 算符优先分析法的关键算符优先分析法的关键就是寻找当前句 型中的最左素短语,并归约它。 重要结论. . 最左素短语是句型中由关系 < 和 > 所括 起来的最左子串。 最左素短语满足是满足如下条件: _ _ _ . . . . ti-1 < ti,ti _ ti+1 _ … _ tj,tj > tj+1 . 的最左子串: N it i N i+1t i+1…NjtjNj+1 注意:位于ti 和tj 外边的Ni 和Nj+1 也包含 在LPP之中。 最左素短语在句型中的特征#N1t1N2t2…Nj-1tj-1NitiNi+1ti+1…Nj-1tj-1NjtjNj+1tj+1tj+2 … tn #(栈底)_ _ _ . . . . . < _ … _ _ > 最左素短语 分析栈内容 (栈顶)剩余输入串当前输入符句型 优先函数? 在实际实现算符优先分析算法时,一般不用优 先表而是用两个优先函数f 和g。 ? 把每个终结符号a与两个优先函数f(a)和g(a) 相对应,使得. 若a < b_ . 若a _ b 若a > b .则 f(a)&g(b)则 f(a)=g(b)则f(a)&g(b)? 函数f 称为栈内优先函数,g称为比较(栈外)优 先函数。 错误处理采用算符优先分析法,有两种情况的错 误: 若分析栈栈顶的终结符与下一个输入符 之间没有优先关系,则表示它们不匹配。 若在当前句型中要归约最左素短语,但 是不存在某个产生式的右部包含该最左 素短语,则不能进行相应的归约。 算符优先分析法的局限性由于算符优先分析法去掉了单非终结符 之间的归约,尽管在分析过程中,当决 定是否为句柄时采取一些检查措施,但 仍难完全避免把错误的句子得到正确的 归约。 此外,通常一个适用语言的文法也很难 满足算符优先文法的条件,因而致使算 符优先分析法仅适用于表达式的语法分 析。 五、LR分析法LR分析法正是给出一种能根据当前分析 栈中的符号串(通常以状态表示)和向 右顺序查看输入串的K个(K≥0)符号就 可唯一地确定分析器的动作是移进还是 归约和用哪个产生式归约,因而也就能 唯一地确定句柄。 LR分析法的归约过程是规范推导的逆过 程,所以LR分析过程是一种规范归约过 程,每一步归约的都是真正的句柄。 LR(K)分析方法是1965年Knuth提出的。对于 大多数用无二义性上下文无关文法描述的语言 都可以用相应的LR分析器进行识别,而且这 种方法还具有分析速度快,能准确、即时地指 出出错位置。但其主要缺点是构造分析表的工 作量相当大,实现相当困难。因此,目前对于 真正实用的编译程序,所采用的LR分析器都 是借助于美国Bell实验室1974年推出的“一个 编译器的编译器一YACC”来实现的。它能将 自动构造出LALR(1)分析表。 LR(k)的含义LR(k)分析法的含义是: L:表示自底向上分析过程中是从左到右 扫描输入串; R:表示在分析过程中采用最右推导底逆 过程; K:表示需要向前查看k个输入符号。 LR(0)分析法中的0表示不需向前查看输 入符。 LR(1)分析法中的1表示只需向前查看一 个输入符。 1.LR分析的基本原理把每个句柄的识别过程划分为若干状态, 利用DFA来识别。 2.LR分析器的模型(PDA)输入串a1a2…ai…an#总控程序动作表 状态转向表 (ACTION表) (GOTO表)分析表( DFA)Snxn栈顶符号…S1…x1S0状态栈#分析栈符号栈 说明分析栈:存放“状态”和移进、归约的 文法符号。 分析表:分为两个子表。动作表:指出DFA每个状态下应采取的动作: 移进、归约、接收或报错。 状态转向表:指出DFA的转向状态,即分析 栈应转换到的下一个状态(栈顶的新状态)。总控程序:依据分析表驱动语法分析的 进程。 3.LR(0)分析法LR(0)分析法就是LR(k)分析法当k=0的 情况,亦即在分析的每一步,只需根据 当前的栈顶状态(或说根据当前分析栈中 已移进或归约出的全部文法符号)就能确 定应采取何种分析动作,而无需向前查 看输入符。 实现LR分析法的关键是分析表的构造, 而LR(0)分析表构造的思想和方法是构造 其它LR分析表的基础。 ① 规范句型的活前缀【规范句型的活前缀】规范句型的一个前缀, 如果它不含句柄后的任何符号,则称它是该规 范句型的一个活前缀。 即: 若A→ ? 是文法的一个产生式,S是开始符号, * S ? ?Aω? ??ω (R为最右推导)R R则??的任何前缀都是规范句型??ω的活前缀。 说明在LR分析过程中,实际上是把αβ的前缀 列出放在符号栈中,一旦在栈中出现αβ, 即句柄已经形成,则用产生式A→β进行 归约。 活前缀为一个或若干规范句型的前缀。 在规范归约过程中的任何时刻只要已分 析过的部分即在符号栈中的符号串均为 规范句型的活前缀,则表明输入串已被 分析过的部分是该文法某规范句型的一 个正确部分。 活前缀就是分析栈内的符号串活前缀 #分析栈的内容 + 剩余的输入串规范句型 示例【例6】说明语句的文法G[S]为: S→vI:T I→I,i I→i T→r 句子v i,i:r的规范推导: S ? v I : T ? v I : r ? v I,i : r ? v i,i:r 活前缀句子v i,i:r的前缀有:ε, v ,v i , v i , ,v i , i ,…… 句子v i,i:r的活前缀有:ε, v ,v i 句型v I,i:r的前缀有:ε, v ,v I , v I, ,v I,i , v I,i :, …… 句型v I ,i:r的活前缀有: ε, v ,v I ,v I, , v I , i 活前缀和句柄的三种关系活前缀和句柄之间有三种关系: 1.活前缀不含有句柄的任何符号: ?,此 时期望A→β的右部所推出的符号串; 2.活前缀只包含句柄的部分符号:??1 , 表明A→β1β2的右部子串β1已出现在栈 顶,期待从输入串中看到β2推出的符号; 3.活前缀包含句柄的全部符号: ??,表 明产生式A→β的右部β已出现在栈顶。 构造LR分析表的关键就在于如何识别活前缀。 活前缀,句柄 , LR(0)项目为刻划这种分析过程中的文法G的每一个产生式 的右部符号已有多大一部分被识别(出现在栈顶) 的情况,分别用标有圆点的产生式来指示位置。 A→ ?β 刻划没有句柄的任何符号在栈顶,此时 期望A→β的右部所推出的符号串 A→β1?β2 刻划A→β1β2 的右部子串β1 已出现 在栈顶,期待从输入串中看到β2推出的符号 A→β? 刻划产生式A→β的右部β已出现在栈顶 ② LR(0)项目在文法G中每个产生式的右部适当位置添加一个 圆点构成LR(0)项目。 例如产生式:A→aBC,有4个LR(0)项目: A →? aBC,A →a ? BC,A →aB ? C,A →aBC ? 一个产生式的项目个数是其右部符号的长度加1。 每个项目的含义与圆点的位置有关,圆点的左部:表示分析过程的某时刻用该产生式归约 时句柄已识别过的部分; 圆点的右部:表示待识别的部分。注意:空产生式A→ε仅有LR(0)项目A→ ? 。 示例【例6】说明语句的文法G[S]为: S→vI:T I→I,i I→i T→r 写出该文法的所有LR(0)项目。 第一步将文法拓广为文法G’ [S ’]为: ⑴ S’ → S ⑵ S→vI:T ⑶ I→I,i ⑷ I→i ⑸ T→r 文法拓广:为保证开始符号仅出现在一 个产生式的左边,即使得接收项目唯一。 示例该拓广文法的LR(0)项目有15个: 1. S′→ ? S 8. I → ? I , i 2. S′→S ? 9. I → I ? , i 3. S → ? v I : T 10 . I → I , ? i 4. S → v ? I : T 11 . I → I , i ? 5. S → v I ? : T 12. I → ? i 6. S → v I : ? T 13. I → i ? 7. S → v I : T ? 14. T → ? r 15. T → r ? LR(0)项目的分类根据圆点所在的位置和圆点后是终结符还是非终结符或为空 把项目分为以下几种: 移进项目,形如 A→? ? a? ,a是终结符, ? ,??V* 表示下一步要从输入串中移进一个终结符,如项目3,5,9 ,10,12,14。 待约项目,形如 A→? ? B?,表示等待栈顶归约出所 需的非终结符来,如项目4,6,8。 初始项目,形如 S’→ ? S ,表示开始识别一个句子。 归约项目,形如 A→? ? ,表示句柄已识别完毕,应该归约的 项目,如项目7,11,13,15。 接收项目,形如 S’→S ? ,表示整个句子已识别完毕。 后继项目【后继项目】表示同属于一个产生式的项 目,但是圆点的位置仅相差一个文法符 号,则称后者为前者的后继项目。 例如:项目 S → v ? I : T 是 S → ? v I : T的 后继项目。A→ε的LR(0)项目只有A→ ? ,是归约 项目。 ③ 构造识别活前缀的DFA构造识别活前缀的NFA的两种方法: 第一种方法是求出文法的所有产生式的 LR(0)项目,每个项目都为NFA的一个状态, 按一定规则构造识别活前缀的NFA,再确 定化为DFA。 第二种方法是把拓广文法的第一个项目 {S′→ ? S}作为初态集的核,通过求核的闭 包和转换函数,求出LR(0)项目集规范族, 再由转换函数建立状态之间的连接关系得 到识别活前缀的DFA。 寻找等价项目: 例如项目 S → v ? I : T I→?I,i I→?i 都表示等待栈顶归约出I来,形成I的句 柄。它们的含义相同,是等价状态,识 别的活前缀相同。 LR(0)项目集的闭包的定义【LR(0)项目集的闭包CLOSURE(I)】设I是文法G 的一个LR(0)项目集合, I的闭包CLOSURE(I)是 从I出发用下面三个规则构造的项目集: 1. I中每一个项目都属于CLOSURE(I)。 2. 若项目A → ?? B? ? CLOSURE(I),且B→? ?P则将B → ? ? 加入CLOSURE(I)中。 3.重复执行(2)直到CLOSURE(I)不再增大为止。 LR(0)项目集的闭包算法function CLOSURE (I); /* I 是项目集*/ { J:= I; repeat for J 中的每个项目A ?? ? B ? 和产生式 B? ? ,若B? ? ? 不在J中do 将 B? ? ? 加到J中 until 再没有项目加到J中 return J }; 示例对初始项目 S’→ ? S 求其闭包: CLOSURE({ S’→ ? S }) ={S’→ ? S , S → ? v I : T }前面的等价项目: CLOSURE({S → v ? I : T } ) ={ S → v ? I : T,I → ? I , i , I → ? i } GO函数的定义一般对状态I中的任意项目 A?? ? X ?,在移 进或归约出X之后,应转换到其后继项目 A??X ? ?(可能有多个)所在的项目集,即: CLOSURE({A??X ? ?}),记为GO函数。 【GO函数】 若I是G的一个LR(0)项目集, X ?VT?VN,则 GO( I, X ) = CLOSURE( J ) 其中,J是I中所有形如 A?? ? X ?项目的后继 项目A ??X ? ?所组成。 GO( I, X ) 就是DFA的状态转换函数。 GO函数――状态转换函数I: A→?? X ? X J: A→?X ? ?从初始项目出发{ S’→ ? S } 出发, 利用CLOSURE和GO函数可以构造识别 规范句型活前缀的有穷自动机DFA。 示例DFA的初态I0=CLOSURE(初始项目) =CLOSURE({ S’→ ? S }) ={ S’→ ? S , S → ? v I : T }再利用GO函数确定其它的状态: I1=GO( I0, S ) = CLOSURE({ S’→ S ?} ) = { S’→ S ? ,} I2= GO( I0, v ) = CLOSURE({ S → v ? I : T} ) ={ S → v ? I : T,I →? I , i , I → ? i } 识别规范句型活前缀的DFAI5: I1:S’→S ? S→vI: ? T I0: : T →? r S’→? S I 3: T r S→?vI:T S→vI ? :T I : I8 : I 7 v I→I ?, i S→vI:T ? T→r ? I2: , I6: S→v?I:T i I 4: I→I , ? i i I→?I , i I→i ? I9:I → I , i ? I→? i S DFA识别规范句型活前缀的DFA为: M=(Q,VN∪ VT,GO, I0,Q ) 其中Q={I0,I1 ,I2 ,…… ,I9 } 在I0状态下识别的活前缀:ε 在I4状态下识别的活前缀:v i 在I9状态下识别的活前缀:v I , i 在I3状态下识别的活前缀: v I 在I6状态下识别的活前缀:v I , LR(0)项目集规范族【LR(0)项目集规范族】由GO函数所求出的状 态集称为文法G’的LR(0)项目集规范族,即构 成识别一个文法的活前缀的DFA的状态的全 体。 ④ LR(0)文法【 LR(0)文法】若某拓广文法的识别规范 句型活前缀的DFA的每个状态中,既不 存在移进-归约冲突,也不存在归约-归约 冲突,则称此文法为LR(0)文法。上述文法就是LR(0)文法。 ⑤ LR(0)分析表表示:二维数组 行:为状态I0,I1 ,…,通常用0,1,…状态 号表示。 列:为文法符号和‘#’号。 分析表的内容可由两部分组成:动作(ACTION)表:表示当前状态下所面临输入符 应做的四种动作:移进Sj、归约ri、接受acc或出错 error。 状态转向表(GOTO):表示在当前状态下面临文法 符号(即栈顶归约为非终结符)时应转向的下一个状 态,相当于识别活前缀的有限自动机DFA的状态转 换矩阵。 LR(0)分析表的构造算法LR(0)分析表的构造算法如下: a) 若项目A→??X ? 属于Ik ,且GO(Ik, X)= Ij,则: 若X为终结符a时,则置ACTION(k,a)=Sj 若X为非终结符,则置GOTO(k, X)=j b) 若项目A→?? 属于Ik,则对任何终结符a (包 括结束符‘#’),置ACTION(k,a)= ri,i 为产生式A→α的编号。 c) 若项目S′→S? 属于Ik,则置 ACTION(k,#)=“acc”。 d) 凡不能用上述方法填入的分析表的元素, 均应填上“报错标志”。即用空白表示 错误标志。 根据这种方法构造的LR(0)分析表不含多 重定义时,称这样的分析表为LR(0)分析 表,能用LR(0)分析表的分析器称为LR(0) 分析器,能构造LR(0)分析表的文法称为 LR(0)文法。 输入 状 v 态ACTIONi , : r # S 1GOTO I T0S2示 例12 3 4 5 6 7 8 9 S4 r4 r4 S9 r2 r5 r3 S6 r4 S5 r4 r4 S8 r2 r5 r3 r2 r5 r3 r2 r5 r3 r2 r5 r3acc3 r4 7 r2 r5 r3 ⑥LR分析器总控程序对一个文法构造了它的LR(0)分析表后就 可以在LR分析器的总控程序(驱动程序) 控制下对输入串进行分析,即根据输入 串的当前符号和分析栈的栈顶状态查找 分析表应采取的动作,对状态栈和符号 栈进行相应的操作即移进、归约、接受 或报错。 LR分析的工作流程1.初始时,将初态I0以及栈底标记#推入 分析栈:a1 a2… an # 栈顶指针I0#输入串指针 2.设在分析的某一步,分析栈和剩余输入 串的形式如下:Im 栈顶指针 Xm ai ai+1… an# 输入串指针…I1 I0…X1 #此时用栈顶状态Im与输入符ai组成符号对去 查LR分析表,并根据ACTION(Im,ai)中规 定的4种动作之一进行如下操作: (a)移进(a)移进:若ACTION[Im,ai]= Sj,则把ai 移入符号栈,j移入状态栈。此时句柄尚未 在栈顶形成,期待移入符号以形成句柄。j Im aiXm栈顶指针ai+1 ai+2… an#输入串指针… …I1 I0… …X1 # (b)归约:若ACTION[Im,ai]= ri,且第i个产生式 A→ ?的右部?和栈顶符号串Xm-r-1 … Xm相同,则把 (Im,Xm) , (Im-1,Xm-1) ,…, (Im-r-1,Xm-r-1) 依次 弹出栈,此时栈顶为(Im-r,Xm-r) ,即按照第i个产 生式归约,将句柄出栈,将A和I’=GOTO(Im-r, A)进栈 ,输入指针不动。栈顶指针 I’ Im-r A Xm-r ai ai+1… an# 输入串指针……X1 #(b)归约I1 I0 (c) 接收(c) 接收:若ACTION[Im,ai]= acc, ai 应 为#,则表示分析成功,即表示当前的输 入串已被成功的分析完毕,应接收输入串, 停止分析工作。此时分析栈与输入串形式 如下:I1 I0 S # # 输入串指针栈顶指针 (d) 报错(d) 报错:若ACTION[Im,ai]不属于上述3 种情况 应报错。即有语法错误,可调用相 应的错误处理子程序进行处理。 反复使用第二步进行处理,直至分析成 功或者分析失败。 示例对前面的拓广文法G’ [S ’]: ⑴ S’ → S ⑵ S→vI:T ⑶ I→I,i ⑷ I→i ⑸ T→r 给出该文法的句子 v i,i:r的分析过程。 输入 状 v 态ACTIONi , : r # S 1GOTO I T0S212 3 4 5 6 7 8 9 S4 r4 r4 S9 r2 r5 r3 S6 r4 S5 r4 r4 S8 r2 r5 r3 r2 r5 r3 r2 r5 r3 r2 r5 r3acc3 r4 7 r2 r5 r3L R 分 析 表 步骤 分析栈 栈顶状态,输入符 剩余输入串 v i,i:r# 1 0 Action[0,v]=S2移进v # i,i:r# 2 02 Action[2,i]=S4移进i #v ,i:r# 3 024 Action[4,i]=r4用I → i #vi 归约,查GOTO(2,I)=3 , i:r# 4 023 Action[3,,]=S6移进, #vI i:r# 5 0 2 3 6 Action[6,i]=S9移进i #vI, 67 8 9101102369 # v I ,i 023 #vI 0235 #vI: 02358 #vI :r 02357 #vI:T 01 #SAction[9,:]=r3用I→I , i 归约,查GOTO(2,I)=3 Action[3,:]=S5移进:Action[5,r]=S8移进r Action[8,#]=r5用T → r 归约,查GOTO(5,T)=7 Action[7,#]= r2用S→v I : T 归约,查GOTO(0,S)=1 Action[1,#]=acc 成功接收:r#: r# r# ### 语法树SI I v i , i : T r 示例【例7】设文法G[S]为: S → (S) | a 用LR(0)分析法进行语法分析的步骤分为 五步: 1.将文法拓广为G’ [S ’]: ⑴ S’ → S ⑵ S → (S) ⑶ S→a 2.构造识别规范句型活前缀的DFAI0: S’→? S S→? (S) S→? a ( I2: S→(? S) S→? (S) S→? a S a a S ( I4:S→( S ?) ) I5:S→(S) ? I1:S’→S ? I3:S→a ? 3.判断是否为LR文法因为上述DFA的每一个状态集中均不含 移进-归约冲突,以及归约-归约冲突,所 以该文法为LR(0)文法。 4.构造LR(0)分析表输入 状 态aACTION ( ) S2# accGOTO S 140 12 3S3S3 r3 r2S2 r3 r2r3r3 r24 5S5 r2 5.给出句子(a)的 分析过程SS(a) 步骤 分析栈 栈顶状态,输入符 剩余输入串 (a) # 1 0 Action[0,(]=S2移进a # a) # 2 02 Action[2,a]=S3移进a #( )# 3 023 Action[3,)]=r3用S → a #(a 归约,查GOTO(2,S)=4 )# 4 024 Action[4,)]=S5移进) #(S # 5 0 2 4 5 Action[5,#]=r2用S →(S) # ( S ) 归约,查GOTO(0,S)=1 # 6 01 Action[1,#]=acc成功接 #S 收输入串 4.SLR(1)分析法由于大多数适用的程序设计语言的文法不 能满足LR(0)文法的条件,即使是描述一个 算术表达式这样简单的文法也不一定是 LR(0)文法。因此下面将介绍对于LR(0)项 目集规范族中有冲突的项目集(状态)用向前 查看一个符号的办法进行处理,以解决冲 突。这种办法将能满足一些文法的需要, 因为只对有冲突的状态才向前查看一个符 号,以确定做那种动作,因而称这种分析 方法为简单的LR(1)分析法,用SLR(1)表示。 示例例如项目集Ii:Ii ={A→??b ? , B→ ? ?,C→ ? ? } 移进项目 归约项目 此项目集中有 移进-归约冲突 归约-归约冲突 如何解决上述冲突呢? SLR(1)解决方法如果{b}、FOLLOW(B)、FOLLOW(C) 两两不相交,则可用如下方法解决冲突: 若下一个输入符为b,则移进b; 若下一个输入符∈FOLLOW(B) ,则用 B→ ? 归约; 若下一个输入符∈FOLLOW(C) ,则用 C→ ?归约。 此种解决冲突的方法称为SLR(1)解决方 法。 一般情况若 LR(0) 项目集规范族中有项目集Ii含 移进-归 约冲突, 归约-归约冲突: Ii ={A1→?1?b1 ? 1 ,… … , Am→?m?bm ? m, B1→ ? 1 ? ,……, Bn → ? n ? } 若集合{b1 ,b2,… ,bm }、FOLLOW(B1) 、 FOLLOW(B2) ,…,FOLLOW(Bn)均两两不 相交,则可用SLR(1)解决方法解决分析表上第 i行上的冲突问题。 此种解决冲突的方法称为SLR(1)解决方法。 如何解决冲突如何解决冲突:若下一个输入符∈ {b1 ,b2,… ,bm } ,则移 进输入符; 若下一个输入符∈FOLLOW(Bj) ,j=1 ,… , n,则用Bj→ ? j 归约;能用SLR(1)方法解决冲突的文法称为 SLR(1)文法。 SLR(1)文法是无二义的。 示例【例8】算术表达式文法G 8[E]: E→E +T | T T→T * F | F F→ (E)| i 求此文法的识别规范句型活前缀的DFA。 1.将文法拓广将文法拓广为G’[E’]: (0) E’ ?E (1) E ?E +T (2) E ?T (3) T ?T * F (4) T ?F (5) F ?(E) (6) F ?i 2.构造识别规范句型活前缀的DFA I1 E ??E? E ?E?+TI0E E ???E E ??E+T E ??T T ??T*F T ??F F ? ?(E) F ??i T i I2 E ?T? T ?T?*FI6 E ?E+ ? T T E ?E+ T ? I9 T ?T?*F T ??T*F + T ??F F I3 * ( F ? ?(E) i I7 F ? (? E) F ??i I4 I5 I8 E ??E+T E ??T T I E F ? (E ?) + I ( 2 6 T ??T*F E ?E?+T T ??F F I 3 ) ( F ? ?(E) i F ??i I5 F ? (E) ? I11 F T ?F? I3 I5 i I10 F ?i? T ?T* ? F F T ?T* F ? I7 * F ? ?(E) ( F ??i I4 3.判断有无冲突I1 ,I2 ,I9有移进_归约冲突。 I1:E??E? E ?E?+T I2: E ?T ? T ?T ? *F I9: E ?E+T ? T ?T ? *F 考虑能否用SLR(1)方法解决冲突。 SLR(1)解决方法Ii={D ?? ?b ?, A ?? ?, B ?? ?} 若{b}?FOLLOW(A) ? FOLLOW(B)=?则,面 对当前读入符号a,状态Ii的解决方法: 1. 若a=b,则移进。 2. 若a? FOLLOW(A),则用A ?? 进行归约。 3. 若a? FOLLOW(B),则用B ??进行归约。 4. 此外,报错。 对于I1: { E??E? 对于I2: {E?T?E?E?+T} T ?T ? *F}因为:{+} ? FOLLOW(E ?)= {+} ? {#} =? 所以可用SLR(1)方法解决I1的冲突。对于I9: {E ?E+T ? T ?T ?*F}因为: {*} ? FOLLOW(E)= {*} ? {#,),+} = ? 所以可用SLR(1)方法解决I2的冲突。 因为:{*} ? FOLLOW(E)=? 所以可用SLR(1)方法解决I9的冲突。 4.构造SLR(1)分析表构造SLR(1)分析表的方法同LR(0)分析表的构 造算法,只是略有不同,规则2改为: 若归约项目A→α ?属于Ik, 那么,对任何输入符 号a∈FOLLOW(A),置ACTION[k, a]= ri, 表 示用第i个产生式A→α进行归约;其中i为产生式 A→α的编号。 按上述算法构造的SLR(1)分析表,如果每个入 口不含多重定义,则该文法称为SLR(1)文 法。“1”的含义是在分析过程中顶多只要向前 看一个符号。 ACTION状态GOTO0 1 2 3 4 5 6 7 8 9 10 11i s5+ s6 r2 r4*s7 r4( s4)r2 r4# acc r2 r4E 1T 2F 3s5 r6 s5 s5 s6 r1 r3 r5 s7 r3 r5 r6s4 r6 s4 s4 s11 r1 r3 r5 r1 r3 r5 r682 93 3 10SLR(1)分析表 5.给出句子i+i *i的分析过程T F i +EE T F i * T语法树F i 步骤 分析栈 栈顶状态,输入符 剩余输入串 i+i *i# 1 0 Action[0,i]=S5移进i # +i *i# 2 05 Action[5,+]=r6用F → i #i 归约,查GOTO(0,F)=3 +i *i# 3 03 Action[3,+]=r4用T → F #F 归约,查GOTO(0,T)=2 +i *i# 4 02 Action[2, +]= r2用E →T #T 归约,查GOTO(0,E)=1 +i *i # 5 0 1 Action[1, +]= S6移进+ #E 步骤 分析栈 6 0 16 #E+ 7 0165 #E+i 8 0163 #E + F 9 016 9 #E+T 10 0 1 6 9 7 # E+ T *栈顶状态,输入符 Action[6,i]=S5移进iAction[5, *]=r6用F → i 归约,查GOTO(6,F)=3 Action[3, *]=r4用T → F 归约,查GOTO(6,T)=9 Action[9, * ]= S7移进* Action[7,i]= S5移进i剩余输入串 i *i#*i#*i#*i# i# 11 1201697 5 # E+T * i1314Action[5, #]=r6用F → i 归约,查GOTO(7,F)=10 0 1 6 9 7 10 Action[10, #]=r3用T→ T * # E + T * F F归约,查GOTO(6,T)=9 016 9 Action[9, #]=r1用E→ E+T #E+T 归约,查GOTO(0,E)=1 01 Action[1,#]= acc成功接收 #E 输入串# ### 示例【例9】后缀表达式文法G 9[E]: E→E E+ | E E * | a 1.构造此文法的识别规范句型活前缀的DFA; 2.并且判断该文法是何种LR文法; 3.给出句子 aa* 的分析过程。 1.将文法拓广将文法拓广为G’[E’]: (0) E’ ? E (1) E ? E E + (2) E ? E E * (3) E ? a 2.构造识别规范句型活前缀的DFAI0: E’→? E E E→?EE+ E→?EE* E→? a aI2: E→a? a I1:E’→E? E I3:E→EE?+ E→EE ? * E→ E? E + E→E?E+ E E→E?E* E→E?E* E→?EE+ E→?EE+ E→?EE* E→?EE* E→? a E→? a a * + I5:E→EE*? I4:E→EE+? 3.判断是否为LR文法因为上述DFA的I1状态集中有移进-归约 冲突,所以该文法不是LR(0)文法。 那么能否用SLR(1)解决方法解决冲突呢? 对于I1中: 归约项目E’→E? 移进项目E→? a 而: {a} ? FOLLOW(E ?)= {a} ? {#} =? 所以可用SLR(1)方法解决I1的冲突。 所以该文法是SLR(1)文法。 4.构造SLR(1)分析表输 状入 态0 1a S2 S2ACTION + *#acc r3 S4 r1 r2 r3 S5 r1 r2 r3GOTO E 1 332 3 4 5r3 S2 r1 r2r1 r2 5.给出句子aa*的 分析过程EEEaa* 步骤 分析栈 栈顶状态,输入符 剩余输入串 aa* # 1 0 Action[0,a]=S2移进a # a* # 2 02 Action[2,a]=r3用E → a #a 归约,查GOTO(0,E)=1 a* # 3 01 Action[1,a]=S2移进a #E *# 4 012 Action[2, *]= r3用E → a # E a 归约,查GOTO(1,E)=3 *# 5 0 1 3 Action[3, *]= S5移进* #EE 步骤 分析栈 栈顶状态,输入符 剩余输入串 # 6 0 1 3 5 Action[5,#]=r2用E # E E * →EE*归约,查 GOTO(0,E)=1 # 7 01 Action[1,#]=acc成功接 #E 收输入串 5.二义性文法在LR分析法中的应用任何一个二义性文法绝不是LR(k)文法,也不 是一个算符优先文法或LL(k)文法,任何一个 二义性文法不存在与其相应的确定的语法分析 器,但是对某些二义性文法,通过人为地给出 优先性和结合性的规定,从而可能构造出比相 应非二义性文法更优越的LR分析器――即是 指对同一个语言的二义性文法构造的LR分析 器比它的非二义性文法构造的LR分析器的状 态数目少,分析速度快。 示例【例10】算术表达式的二义性文法为: E→E + E | E * E | ( E ) | i 构造此文法的识别规范句型活前缀的DFA。 1.将文法拓广为G’[E’]: (0) E’ ? E (1) E ? E + E (2) E ? E * E (3) E ? ( E ) (4) E ? i 2.构造识别规范句型活前缀的DFA I0E???E E??E+E E??E*E E?? (E) E ? ?iI2 (E??E? E E?E?+E E?E?*EiI3I1E? (?E) E??E+E E??E*E E?? (E) E ??iI9E?i? ( I5 i i I6 E?E*?E I8 E?E*E? E?( E?) E??E+E E E?E?+E E E?E?+E * E??E*E E?E?*E E?E?*E E?? (E) ( I + 2 E ? ?i ( ) + I4 * I4 E?(E)?E??E+E E??E*E i E?? (E) * E ? ?iI4 E?E+?E ++I7E?E+E? E?E?+E E?E?*E * E 3.判断是否为LR文法因为上述DFA的I1 ,I7和I8中有移进-归约 冲突,所以该文法不是LR(0)文法。 那么能否用SLR(1)解决方法解决冲突呢? I1={ E??E?,E?E?+E,E?E?*E} 而: {+, *} ∩ FOLLOW(E ?) = {+, *} ? {#} = ? 所以可用SLR(1)方法解决I1的冲突。 I7:{ E? E+E ?,E?E?+E,E?E?*E} I8:{ E? E*E ?,E?E?+E,E?E?*E} 而: {+, *} ? FOLLOW(E) = {+, *} ? {#,+, *,)}= {+, *} ≠? 所以I7和I8中的冲突不能用SLR(1)方法解决I1的 冲突。 所以该文法也不是SLR(1)文法。 事实上,该二义性文法用LR(k)方法仍不能解 决此冲突。 人为规定解决冲突但是使用优先关系和结合性可以解决这类冲突: 假如规定:*号优先级高于+号,且+、*都服 从左结合,可使用如下方法解决冲突。 对于I7:若下一个输入符是*,则移进*; 若下一个输入符是#,+,) ,则用E→E+E归约。对于I8:若下一个输入符是#, *,+,)则E→E *E归约。 输 状入 态ACTIONi S3 S3 r4 S3 S3 r4 S2 S2 + * ( S2 S2 r4 r4 ) #0 1 2 3 4 5 6 7 8 9GOTO E 16 7 8S4S5accS4 r1 r2 r3S5 S5 r2 r3r1 r2 r3r1 r24. 该 文 法 的 LR 分 析 表 5.给出句子i+i*i的分析过程E EEEEi+i*i 步骤 分析栈 栈顶状态,输入符 剩余输入串 i+i*i # 1 0 Action[0,i]=S3移进i # +i*i # 2 03 Action[3,+]=r4用E → i #i 归约,查GOTO(0,E)=1 +i*i # 3 01 Action[1,+]=S4移进+ #E i*i # 4 014 Action[4, i]= S3移进i #E+ *i # 5 0 1 4 3 Action[3, *]= r4用E → i # E + i 归约,查GOTO(4,E)=7 0147 Action[7, *]=S5移进* # E+ E 7 01475 Action[5,i]=S3移进i # E+ E * 8 0 1 4 7 5 3 Action[3,#]=r4用E → i # E+ E * i 归约,查GOTO(5,E)=8 9 0 1 4 7 5 8 Action[8,#]= r2用E →E *E # E+ E * E 归约,查GOTO(4,E)=7 10 0 1 4 7 Action[7,#]= r1用E →E +E # E+ E 归约,查GOTO(0,E)=1 11 0 1 Action[1,#]=acc成功接收 #E 输入串 6*i #i# # # # # 小结1.语法分析的任务; 2.自顶向下语法分析:1)确定的自顶向下语法分析方法的基本思想, 存在的问题是:左递归和回溯; 2)分析方法:预测分析法。 3.自底向上语法分析1)自底向上语法分析方法的基本思想; 2) 短语、直接短语和句柄底定义,以及如何 利用语法树来寻找某个句型的所有的短语、 直接短语和句柄; 3)自底向上语法分析方法: ①算符优先分析法:基本原理,识别句柄的 方法,最左素短语。 ②LR分析法:活前缀,LR(0)项目,LR(0) 分析法,SLR(1)分析法。
赞助商链接
姓名: 学号: 班级:2 班 第五章 自底向上语法分析一.选择题 1.算符优先分析法每次都是对(1) 进行归约;简单优先分析法每次都是对(2) (1)A.最...自底向上语法分析器实验报告一.问题描述编写语法分析程序, 实现对算术表达式的语法分析。 要求所分析算术表达式由如下的文 法产生。 E -& E+T | E-T | T ...第6 章 自底向上优先分析(8 学时,5 分钟)自底向上分析也称移进――归约...简单优先分析法的基本思想是对一个文法按一定原则求出该文 法所有符号(即终结...设计过程 设计过程: 自底向上语法分析含义: 自底向上分析过程是从所给输入串出发,对其进行最左归约的过程。自底向上归约的过 程也是自底向上构建语法树的过程 ...《编译原理》 课后练习 第 05 章 自底向上的语法分析 课后练习第 05 章 自底向上的语法分析 1. S→aS|bS|a (1) 构造该文法的 LR(0)项目集规范族。 (...(1)文法的定义和判别方法 5.递归下降分析技术的实现思想 6.根据文法画出递归下降分析程序的流程图 第五章:自底向上的语法分析 1.自底向上的语法分析的基本思想...23.自底向上的语法分析方法的基本思想是:从给定的...符号执行器 6.一个句型中的最左(B)称为该句型的...(6) 44.按逻辑上划分,编译程序第二步工作是 C。...《编译原理》课后习题答案第六章 第 6 章 自底向上优先分析 第1题 已知文法 G[S]为: S→a|∧|(T) T→T,S|S (1) 计算 G[S]的 FIRSTVT 和 LASTVT...讲稿第3章 文法和语言 讲稿第4章 词法分析 讲稿第6章 自底向上优先分...1...第5 章 自顶向下语法分析(4 学时,10 分钟)在词法分析完成Y后,入语法分析...第6 章自底向上优先分析 P122 练习 1、已知文法 G[S]为: S a|^|(T) T T,S|S (1)计算 G[S]的 FIRSTVT 和 LASTVT。 (2)构造 G[S]的算符优先...
All rights reserved Powered by
www.tceic.com
copyright &copyright 。文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 前后照应的句子 的文章

 

随机推荐