- 1、本文档共49页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2.左递归问题 【例】文法G[E]: E→E+T|T T→T*F|F F→(E)|i 给出i*i+i自顶向下的分析过程。 要实行自顶向下分析,必须要消除文法的左递归 从左向右扫描源程序,同时实施最左推导 E E + T E + T E + T … 失败:由于使用最左推导,对左递归文法进行自顶向下分析时,会导致死循环。 将左递归规则改为右递归规则 A→A?|? 【例】文法G[E]: E→E+T| T T→T*F| F F→(E)|i E→TE E→+TE|? T→FT T→*FT|? F→(E)|i 消除左递归 A→?A A→?A|? (1)消除直接左递归 消除直接左递归——课内练习 文法G : P ? PaPb|BaP 转化为: P ?BaPP` P` ?aPbP`| ? 注:只有最左边的P参加变换。 (2)消除间接左递归(了解自学) 先通过产生式进行非终结符置换 将间接左递归变为直接左递归 消除直接左递归 把置换的产生式加入 详例见书文法G6,P89 5.3 某些非LL(1)文法到LL(1)文法的等价转换 消除左递归和提取公共左因子 【例】 G[S]: S→aSb|A A→bAc|bBc B→Ba|a S→aSb|A A→bAc|bBc B→aB B→aB|? 消除左递归 提取公因子 S→aSb|A A→bA A→Ac|Bc B→aB B→aB|? LL(1)文法的判别条件 LL(1)文法 【例】 G[S]: S→aSb|A A→bAc|bBc B→Ba|a 不确定的自顶向下分析思想 当文法不满足LL(1)时,不能用确定的自顶向下分析,但可用不确定的自顶向下分析,也就是带回溯的自顶向下分析法(试探)。 由于相同左部的产生式的右部First集交集不为空引起 由于相同左部非终结符的右部存在能推导出?的产生式,且该非终结符的Follow集中含有其他产生式右部First集的元素 文法含左递归 确定的自顶向下分析方法 递归子程序法 对文法中的每个非终结符(语法成分)编写一个子程序,而子程序的代码结构由相应非终结符的产生式右部所决定: 产生式右部的终结符与输入符号相匹配 非终结符与相应的子程序调用对应 构造方法非常简单 程序结构清晰 递归调用较多,占用内存多、速度慢 如果所采用的高级语言不允许递归,则不能使用此方法 特 点 * 编 译 原 理 S.P O.P 语义分析、生成中间代码 生成目标程序 代码优化 语法分析程序 词法分析程序 错 误 处 理 符 号 表 管 理 知识结构 任务:根据文法规则,从源程序单词符号串中识别出语法 成分,并进行语法检查。 两大类分析方法: 自顶向下分析 自底向上分析 语法分析的任务 + 若x?S 则x?L(G[S]) 否则x?L(G[S]) G[S] 存在主要问题: 回溯问题,左递归问题 主要方法:递归子程序法、 LL分析法 自顶向下分析算法的基本思想为: 自底向上分析算法的基本思想为: + 若x?S 则x?L(G[S]) 否则x?L(G[S]) G[S] 存在主要问题:“可归约串”的识别问题 主要方法:算符优先分析法、 LR分析法 5.1 自顶向下分析法 自顶向下分析的一般过程 从S出发采用最左推导,试图逐步推出输入串α,α?L(G[S])? S作为语法树的根,试图自上而下地为α构造一棵语法树 若叶结点从左向右排列恰好α,则表示α是文法的句子,而这棵语法树就是句子α的语法结构 若构造不出语法树,则α不是文法的句子 自顶向下分析方法分类 确定的 不确定的 回溯 【例】 G1[S]: S → pA |qB A →cAd|a B →d B |c 识别输入串w= pccadd是否是G1[S]的句子 试探推导过程: S pA pcAd pccAdd pccadd 试探成功 这个文法的特点: 1、每个产生式的右部都由终结符号开始 2、如果两个产生式有相同的左部,那么它们的右部由不同的终结符开始 【例】 G2[S]: S → Ap |Bq A →a|cA B →b|dB 识别输入串w= ccap是否是G2[S]的句子 试探推导过程: S Ap cAp ccAp ccap 试探成功 这个文法的特点: 1、产生式的右部不全是由终结符开始 2、如果两个产生式有相同的左部,它们的右部是由不同的终结符或非终结符开始 3、文法中无空产生式 1. FIRST集 FIRST(α):从α可能推导出的所有开头终结符号或ε 对于文法G的所有非终结符的每个候选式?,其终结首符号集称为FIRST集,定义如下: ?,则规定?∈FIRST(?)
文档评论(0)