编译原理第4章语法分析自上而下

合集下载

编译原理-第4章 语法分析--习题答案

编译原理-第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)文法。

中国科学技术大学陈意云编译原理全套参考资料chapter4

中国科学技术大学陈意云编译原理全套参考资料chapter4

中国科学技术大学陈意云编译原理全套参考资料chapter4 第四章语法制导的翻译在3.7节用Yacc写的例子中,我们看到一种有用的描述形式:语言结构的属性附加在代表语言结构的文法符号上,这些属性值由附加在文法产生式的语义动作来计算,这些语义动作在归约对应的产生式时进行计算,由此得到结果。

这种描述形式可用来描述编译器的语义分析,因此本章系统地研究这种称之为“语法制导下的语言翻译”的描述方法及其实现。

它的语义动作(有时称为语义规则)的计算可以产生代码、把信息存入符号表、显示出错信息、或完成其它工作。

语义规则的计算结果就是我们所要的记号流的翻译。

本章讨论语义规则和产生式相联系的两种方式:语法制导的定义和翻译方案。

语法制导定义是较抽象的翻译说明,它隐蔽了一些实现细节;而翻译方案陈述了一些实现细节,主要是指明了语义规则的计算次序。

在第五章说明语义检查和第七章描述中间代码生成时,大量使用这两种方法。

本章还讨论语法制导定义和翻译方案的实现方法。

概念上的方法是,首先分析输入的记号串,建立分析树,然后从分析树得到描述结点属性间依赖关系的有向图,从这个依赖图得到语义规则的计算次序,然后进行计算,最终得到翻译的结果。

实际的实现并不需要按上面步骤逐步进行,本章将讨论几种不同限制下的实现方法。

4.1 语法制导的定义语法制导的定义是上下文无关文法的推广,其中每个文法符号都有一个属性集合,它分成两个子集,分别叫做该文法符号的综合属性集合和继承属性集合。

如果我们把分析树上的结点看成是保存对应文法符号的属性的记录,那么属性对应记录的域。

属性可以表示任何东西:串、数、类型、内存单元,或其它想表示的东西。

分析树结点的属性值由该结点所用产生式的语义规则定义。

在语法制导定义中,我们把其中的文法称为基础文法。

本节介绍语法制导定义的形式及其概念上的实现模型。

4.1.1 语法制导定义的形式在语法制导定义中,每个文法符号有一组属性,每个文法产生式A , ,有一组形式为b := f (c, c, …, c )的语义规则,其中f 是函数,b和c, c, …, c 是该产生式的文法符号的12k12k属性,并且:(1) 如果b是A的属性,c , c , …, c 是产生式右部文法符号的属性或A的其它属12k性,那么b叫做文法符号A的综合属性。

北方工业大学编译原理第4章习题

北方工业大学编译原理第4章习题
procedure T; begin if sym=ˊ(ˊor sym=ˊaˊ or sym=ˊbˊ or sym=ˊ∧ˊ then begin F; T end else error end;
(4)构造它的递归下降分析程序。
procedure T ; begin
if sym= ˊ(ˊ or sym= ˊaˊ or sym= ˊbˊ or sym= ˊ∧ˊ then T else if sym= ˊ*ˊ then error end;
(3)该文法不含左递归,而且每一个 非终结符的各个产生式的候选首符集两 两不相交。
FIRST(A)= {a}
FOLLOW(A)={d, #}
FIRST (A) = { ε, a} FOLLOW(A)={d, #}
FIRST(B) = {d} FOLLOW(B )={e}
FIRST(B) = {ε ,b} 法G ’
(S): S → a∣∧∣(T) T → ST ’ T’ → ,ST’ | ε
其中:过程advance把输入串指示器IP调至指向下一个输入 符号;sym是指IP当前所指的那个输入符号;error为出错诊 断处理程序。
(2)经改写后的文法是否是LL(1)的?给出它的预测分析表。
else error end else error end;
4.2 试消除下面文法G[A] 中的左递归,并提取公共左因子, 判断改写后的文法是否为LL(1)文法?
A→aABe∣a
B→Bb∣d
解: (1)首先消除左递归
A→aABe∣a B →dB B →bB | ε (2)提取公共左因子 A → aA A → ABe | ε B → dB B →bB | ε
证明:对于具有形如A|的产生式有: A → ABe | ε B →bB | ε

国开电大 编译原理 实验4:语法分析实验报告

国开电大 编译原理 实验4:语法分析实验报告

国开电大编译原理实验4:语法分析实
验报告
1. 实验目的
本实验的目的是研究和掌握语法分析的原理和实现方法。

2. 实验内容
本次实验主要包括以下内容:
- 设计并实现自顶向下的LL(1)语法分析器;
- 通过语法分析器对给定的输入串进行分析,并输出相应的分析过程;
- 编写测试用例,验证语法分析器的正确性。

3. 实验步骤
3.1 设计LL(1)文法
首先,根据实验要求和给定的语法规则,设计LL(1)文法。

3.2 构建预测分析表
根据所设计的LL(1)文法,构建预测分析表。

3.3 实现LL(1)语法分析器
根据预测分析表,实现自顶向下的LL(1)语法分析器。

3.4 对输入串进行分析
编写程序,通过LL(1)语法分析器对给定的输入串进行分析,并输出相应的分析过程和结果。

3.5 验证语法分析器的正确性
设计多组测试用例,包括正确的语法串和错误的语法串,验证语法分析器的正确性和容错性。

4. 实验结果
经过实验,我们成功设计并实现了自顶向下的LL(1)语法分析器,并对给定的输入串进行了分析。

实验结果表明该语法分析器具有较好的准确性和容错性。

5. 实验总结
通过本次实验,我们对语法分析的原理和实现方法有了更深入的了解。

同时,我们也学会了如何设计并实现自顶向下的LL(1)语
法分析器,并验证了其正确性和容错性。

这对于进一步研究编译原理和深入理解编程语言的语法结构具有重要意义。

6. 参考资料
- 《编译原理与技术》
- 课程实验文档及代码。

编译原理作业集第四章修订版

编译原理作业集第四章修订版

第四章语法分析—自上而下分析本章要点1. 语法分析器的功能;2. 自上而下分析方法,LL(1)文法3. 递归下降分析程序构造;4. 预测分析表的构造及预测分析过程;5. LL(1)分析中的错误处理。

本章目标理解和掌握语法分析器的功能、自上而下分析所面临的问题、LL(1)分析法、递归下降分析的构造过程、预测分析程序等内容。

本章重点1.语法分析器的功能,自上而下的基本概念2.LL(1)文法的条件及其判别,计算first集和follow集3.递归下降分析方法、预测分析表的构造及其预测过程。

本章难点1. 非终结符的First集合,产生式候选的First集合,非终结符的follow集合的求解;2. 左递归消除;3. 递归下降分析程序的编写;作业题一、单项选择题:1. 高级语言编译程序常用的语法分析方法中,递归下降分析法属于分析法。

a. 自左至右b. 自顶向下c. 自底向上d. 自右向左 2. 上下文无关文法可以用 来描述。

a. 正则表达式b. 正规文法c. 扩展的BNFd. 翻译模式 3. 自上而下分析面临的四个问题中,不包括a. 需消除左递归;b. 存在回朔;c. 虚假匹配;d. 寻找可归约串4. 语法分析器接收以________为单位的输入,并产生有关信息供以后各阶段使用。

a. 表达式;b. 产生式;c. 单词;d. 语句;5. 自上而下分析的主旨是,对任何单词符号串,试图用一切可能的办法,从文法开始符号(根结点)出发,________。

a. 为输入串寻找最右推导;b. 为输入串寻找最左直接子树;c. 为输入串建立最右直接子树;d. 为输入串寻找最左推导;6. 把规则T→F | T*F 表示成扩展的巴克斯范式以后,画出它的语法图应该是 。

图a图b图c图d7. 下列文法中,_______是LL(1)文法。

a. S →aSb|abb. S →ab|Sabc. S →aS|bd. S →aS|a 8. 设有文法G : S→Ap|Bq A→a|cAB→b|dB则,First(Ap)={_______________} a. a,c b. b,d c. p, q d. A, p一.答案:1. b ;2. c ;3. d ;4. c ;5. d ;6. 图a ;二、填空题:1. 语法分析器的工作本质上就是按____________________,识别输入符号串是否为一个句子。

编译原理-自上而下的语法分析

编译原理-自上而下的语法分析

高效性
由于从文法的最顶端开始分析, 一旦发现不匹配,就可以立即终 止当前分支的搜索,避免不必要 的计算,提高了编译器的效率。
易于处理左递归文

自上而下的分析方法可以很方便 地处理含有左递归的文法,而左 递归是许多实际编程语言的重要 特征。
局限性
无法处理左边界问题
自上而下的分析方法在处理某些含有左边界的文法时可能 会遇到问题,因为这种方法会优先匹配最左边的符号,而 左边界问题需要从右往左匹配符号。
案例三
在编译器优化中,自上而下的语法分析被用 于识别和修改源代码中的冗余和低效的语法 成分。例如,在C编译器的实现中,自上而 下的语法分析可以用于优化循环结构,减少 不必要的循环次数,提高程序的执行效率。
自上而下的语法分析还可以用于代码生成和 代码生成器的实现。通过识别和解析源代码 中的语法成分,可以生成更高效、更安全的 机器代码或字节码,提高程序的执行效率和
安全性。
THANKS
感谢观看
详细描述:递归下降分析算法易于理解,每个产生式规 则对应一个函数,函数的实现相对简单明了。
详细描述:对于每个产生式规则,需要编写相应的递归 函数,可能会导致代码冗余。
移入-规约分析算法
总结词
基于栈的算法
详细描述
移入-规约分析算法是一种自上而下的语法分 析算法,它将目标语句从左到右依次读入, 并根据文法的产生式规则进行移入或规约操 作,直到找到目标语句的语法结构。
词法分析
词法分析是编译过程的第一步,也称为扫描或词法扫描。它的任务是从左 到右读取源代码,将其分解成一个个的记号或符号。
词法分析器通常使用正则表达式或有限自动机来识别和生成记号,这些记 号可以是关键字、标识符、运算符、标点符号等。

编译原理 第4章 语法分析—自顶向下分析

编译原理 第4章 语法分析—自顶向下分析

例 S::=aABbcd|ε,A::=ASd|ε,B::=SAh|eC|ε,
C::=Sf|Cg|ε,求此文法的每一个非终结符号的
FOLLOW集。
解:FOLLOW(S)={#}∪FIRST(d) ∪(FIRST(Ah)-{ε}) ∪FIRST(f)
={#}∪{d}∪{a,d,h}∪{f} = {a,d,h,f,#}
4)若对于一切1≤i≤n,ε∈FIRST(Xi),则将ε符号加 进FIRST(α)。
例4-1(P62) 有文法: E→TE′ E′→+TE′ E′→ε T→FT′ T′→*FT′ T′→ε F→(E)|i 求文法中非 终结符号以及各 产生式右部符号 串的FIRST集。
解:该文法的非终结符号有E、E′、 T、T′和F。 FIRST(E)=FIRST(TE′) =FIRST(FT′E′)={ ( ,i } FIRST(+TE′)={ + } FIRST(ε)={ε} FIRST(E′)=FIRST(+TE′) ∪FIRST(ε)={+ ,ε} FIRST(T)=FIRST(FT′)={ ( ,i } FIRST(*FT′)={ * } FIRST(T′)=FIRST(*FT′) ∪FIRST(ε)={* ,ε} FIRST((E))={ ( } FIRST(i)={ i } FIRST(F) =FIRST((E)) ∪FIRST(i)={( ,i}
分析法算符优先分析法简单优先分析法优先分析法自底向上带回溯递归下降分析法分析法不带回溯自顶向下语法分析lr回溯示例41p61自顶向下的分析方法就是从文法的开始符号出发按最左推导方式向下推导试图推导出要分析的输开始符号输入符号串自底向上的分析方法从输入符号串开始按最左归约方式向上归约到文法的开始符号

编译原理LL(K)

编译原理LL(K)
S a a A b c b a A S b c
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时的情形。

编译原理分知识点习题自上而下语法分析 (1)

编译原理分知识点习题自上而下语法分析 (1)

1.设有文法G[S]:S→ABA→bB|AaB→Sb|a试消除该文法的左递归。

解:本题考查消除左递归的方法。

应用消除文法左递归的算法对文法G[S]消除左递归的过程如下:(1)将非终结符排序为:U1=S,U2=A,U3=B(2)进入算法排序:i=1时,对文法无影响i=2,j=1时:A→Aa有直接左递归,消去该直接左递归,得A→bBA’A’→aA’|εi=3,j=1时:改写文法,有B→ABb|aj=2时:改写文法,有B→bBA’Bb|a无左递归。

(3)所以文法G[S]消除左递归后变为:G’[S]:S→ABA→bBA’A’→aA’|εB→bBA’Bb|a2.设有文法G[E]:E→Aa|BbA→cA|eBB→bd试按照递归子程序法为该文法构造语法分析程序。

解:本题考查递归子程序的构造方法。

首先判断文法是否满足递归子程序法对文法的要求,然后再构造递归子程序。

因为:(1)该文法无左递归。

(2)文法的产生式E→Aa|Bb和A→cA|eB的右部有若干选项,判断这两条产生式右部各候选式的终结首符号集合是否两两互不相交。

对产生式E→Aa|Bb,有FIRST(Aa)∩FIRST(Bb)={c,e}∩{b}=ø对产生式A→cA|eB,有FIRST(cA)∩FIRST(eB)={c}∩{e}=ø文法中其他产生式都只有一个非空ε的右部。

综合(1)、(2),该文法可以采用自上而下分析方法进行语法分析而不会出现回朔和无限循环。

下面为该文法的每一个非终结符号构造递归子程序。

假设用READAWORD代表读下一个单词。

用P(E)、P(A)、P(B)分别表示非终结符号E、A、B对应的子程序名。

约定输入符号串以“#”作为输入结束符。

P(E)的递归子程序为:PROCEDURE P(E);BEGINIF WORD IN FIRST(Aa)THENBEGINP(A);READAWORD;IF WORD=’a’THEN READAWORDELSE ERRORENDELSE IF WORD IN FIRST(Bb)THENBEGINP(B);READAWORD;IF WORD=’b’THEN READAWORDELSE ERRORENDELSE ERROREND;P(A)的递归子程序为:PROCEDURE P(A);BEGINIF WORDD=’c’THENBEGINREADAWORD;P(A)ENDELSE IF WORD=’e’THENBEGINREADWORD;P(B)ENDELSE ERROREND;P(B)的递归子程序为:PROCEDURE P(B);BEGINIF WORD=’b’THENBEGINREADAWORD;IF WORD=’d’THEN READAWORDELSE ERRORENDELSE ERROREND;主程序中的主要内容为:READAWORD;P(E);IF WORD=”#”THEN WRITE(“RIGHT!”)ELSE WRITE(“ERROR!”)3.已知文法G[E]:G[E]:E→E+T|TT→T*F|FF→i|(E)请按递归子程序法为其构造语法分析程序。

编译原理教程第五版课后答案

编译原理教程第五版课后答案

编译原理教程第五版课后答案第一章:引言问题1答:编译器是一种将高级编程语言源代码转换为目标机器代码的软件工具。

它由多个阶段组成,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和代码生成等。

问题2答:编译器的主要任务包括以下几个方面: - 词法分析:将源代码划分为词法单元,如标识符、关键字、操作符等。

- 语法分析:根据语法规则,将词法单元组成语法树。

- 语义分析:对语法树进行语义检查,如类型匹配、变量声明等。

- 中间代码生成:将语法树转换为中间代码表示形式。

- 代码优化:对中间代码进行优化,以提高程序的效率。

- 代码生成:将优化后的中间代码转换为目标机器代码。

第二章:词法分析问题1答:词法单元是编译器在词法分析阶段识别的最小的语法单位,它由一个或多个字符组成。

常见的词法单元包括关键字、标识符、常量和运算符等。

问题2答:识别词法单元的方法包括以下几种: - 正则表达式:通过正则表达式匹配字符串,识别出各类词法单元。

- 有限自动机:构建有限状态自动机,根据输入字符的不同状态转移,最终确定词法单元。

- 递归下降法:使用递归下降的方式,根据语法规则划分出词法单元。

第三章:语法分析问题1答:语法分析是编译器的一个重要阶段,它的主要任务是根据给定的语法规则,将词法单元序列转换为语法树。

语法分析有两个主要的方法:自顶向下的分析和自底向上的分析。

问题2答:自顶向下的分析是从文法的起始符号开始,根据语法规则逐步向下展开,直到生成最终的语法树。

常见的自顶向下的分析方法包括LL(1)分析和递归下降分析。

问题3答:自底向上的分析是从输入串开始,逐步合并词法单元,最终生成语法树。

常见的自底向上的分析方法包括LR分析和LALR分析。

第四章:语义分析问题1答:语义分析的主要任务是对语法树进行语义检查和类型推断。

语义分析阶段会检查变量的声明和使用是否合法,以及类型是否匹配等。

问题2答:常见的语义错误包括变量未声明、类型不匹配、函数调用参数不匹配等。

编译原理第四章语法分析-自上而下分析

编译原理第四章语法分析-自上而下分析

• 例 4.4
4.4 递归下降分析程序构造
• 递归下降分析器:
这个分析程序由一组递归过程组成的,每个过程对应 文法的一个非终结符。 E→TE’ E’→+TE’| T→FT’ T’→*FT’| F→(E)|i
PROCEDURE E BEGIN T ; E’ END PROCEDURE E’ IF SYM=‘+’THEN BEGIN ADVANCE ; T ; E’ END
4.2 自上而下分析面临的问题
• 例4.1 假定有文法
(1) SxAy (2)A**|*
对输入串x*y,构造语法树。 • 构造过程:
(1)把S作为根 (2)用S的产生式构造子树 (3)让输入串指示器IP指向输入串的第一个符号。
S x A y x
S
A y x
S
A y
*
*
*
(4)调整输入串指示器IP与叶结点进行匹配。 (5)如果为非终结符,用A的下一个产生式构建子树。 (6)如果匹配成功则结束;否则,回溯到步骤(4)。
• 一个反例:
– 文法:SQc|c;QRb|b;RSa|a虽然不是直接 左递归,但S、Q、R都是左递归。
• 消除左递归算法:
– 算法的思想是:
• • • • 首先构造直接左递归; 再利用一般转换规则,消除直接左递归 化简文法。 下面算法在不含PP,也不含在右部产生式时可以消除 左递归。
• 消除一个文法的左递归算法:
(1) 把文法 G 的所有非终结符按任一种顺利排列成 P1…Pn;按此顺序执行; (2) FOR i:=1 TO n DO
BEGIN FOR j:=1 TO i-1 DO 把形如Pj+1→Pj 的规则改写成 Pj+11|1|…k| 。其中 Pj1|1|…k 是关于 Pj 的 所有规则; 消除关于Pi规则的直接左递归性。 END 化简由(2)所得的文法。即去除那些从开始符号出发永 远无法到达的非终结符的产生规则。

编译原理教程课后习题答案——第四章

编译原理教程课后习题答案——第四章

第四章语义分析和中间代码生成4.1 完成下列选择题:(1) 四元式之间的联系是通过实现的。

a. 指示器b. 临时变量c. 符号表d. 程序变量(2) 间接三元式表示法的优点为。

a. 采用间接码表,便于优化处理b. 节省存储空间,不便于表的修改c. 便于优化处理,节省存储空间d. 节省存储空间,不便于优化处理(3) 表达式(┐A∨B)∧(C∨D)的逆波兰表示为。

a. ┐AB∨∧CD∨b. A┐B∨CD∨∧c. AB∨┐CD∨∧d. A┐B∨∧CD∨(4) 有一语法制导翻译如下所示:S→bAb {print″1″}A→(B {print″2″}A→a {print″3″}B→Aa) {print″4″}若输入序列为b(((aa)a)a)b,且采用自下而上的分析方法,则输出序列为。

a. 32224441 b. 34242421c. 12424243d. 34442212【解答】(1) b (2) a (3) b (4) b4.2 何谓“语法制导翻译”?试给出用语法制导翻译生成中间代码的要点,并用一简例予以说明。

【解答】语法制导翻译(SDTS)直观上说就是为每个产生式配上一个翻译子程序(称语义动作或语义子程序),并且在语法分析的同时执行这些子程序。

也即在语法分析过程中,当一个产生式获得匹配(对于自上而下分析)或用于归约(对于自下而上分析)时,此产生式相应的语义子程序进入工作,完成既定的翻译任务。

用语法制导翻译(SDTS)生成中间代码的要点如下:(1) 按语法成分的实际处理顺序生成,即按语义要求生成中间代码。

(2) 注意地址返填问题。

(3) 不要遗漏必要的处理,如无条件跳转等。

例如下面的程序段:if (i>0) a=i+e-b*d; else a=0;在生成中间代码时,条件“i>0”为假的转移地址无法确定,而要等到处理“else”时方可确定,这时就存在一个地址返填问题。

此外,按语义要求,当处理完(i>0)后的语句(即“i>0”为真时执行的语句)时,则应转出当前的if语句,也即此时应加入一条无条件跳转指令,并且这个转移地址也需要待处理完else之后的语句后方可获得,就是说同样存在着地址返填问题。

编译原理语法分析—自上而下分析

编译原理语法分析—自上而下分析

对文法G的任何符号串=X1X2…Xn构造集 合FIRST()。
1. 置FIRST()=FIRST(X1)\{};
2. 若对任何1ji-1,FIRST(Xj), 则把FIRST(Xi)\{}加至FIRST()中; 特别是,若所有的FIRST(Xj)均含有, 1jn,则把也加至FIRST()中。显 然,若=则FIRST()={}。
T→T*F | F
F→(E) | i
经消去直接左递归后变成:
E→TE E→+TE | T→FT T→*FT | F→(E) | i
(4.2)
例如文法G(S): S→Qc|c Q→Rb|b R→Sa|a
虽没有直接左递归,但S、Q、R都是左递归的
SQcRbcSabc
(4.3)
一个文法消除左递归的条件: 不含以为右部的产生式 不含回路。
即A的任何两个不同候选 i和 j FIRST(i)∩FIRST( j)=
当要求A匹配输入串时,A就能根据它所面临的第
一个输入符号a,准确地指派某一个候选前去执
行任务。这个候选就是那个终结首符集含a的。
提取公共左因子:
假定关于A的规则是 A→ 1 | 2 | …| n | 1 | 2 | … | m (其中,每个 不以开头)
*
特别是,若S A ,则规定
#FOLLOW(A)
构造不带回溯的自上而下分析的文法条件
1. 文法不含左递归,
2. 对于文法中每一个非终结符A的各个产生式 的候选首符集两两不相交。即,若
A→ 1| 2|…| n 则 FIRST( i)∩FIRST( j)= (ij)
3. 对文法中的每个非终结符A,若它存在某个 候选首符集包含,则
1)算符优先分析法:按照算符的优先关系和结 合性质进行语法分析。适合分析表达式。

编译原理-清华大学-第4章-自顶向下语法分析方法(3+1)

编译原理-清华大学-第4章-自顶向下语法分析方法(3+1)

(2)一个文法提取了左公共因子后,只解决 了相同左部产生式右部的FIRST集不相交问 题,当改写后的文法不含空产生式,且无左 递归时,则改写后的文法是LL(1)文法,否 则还需用LL(1)文法的判别方式进行判断才 能确定是否为LL(1)文法。
• FIRST(Ap)={a,c} • FIRST(Bq)={b,d}
2、非终结符A后跟符号FOLLOW集的定义:
• 定义:设 G = (VT ,VN , S , P) 是上下文无关文 法,A∈VN , S是开始符号。 FOLLOW(A)={a|S * …Aa… ,a∈VT} 若S *…A,则规定 #∈FOLLOW(A)
(3)反复使用规则(2)直到每个非终结符的 FOLLOW集不再增大
S→AB S→bC A→ε A→b B→ε B→aD C→AD C→b D→aS D→c
FOLLOW(S)={#}∪FOLLOW(D) FOLLOW(A)=( FIRST(B)-{ε} )∪
FOLLOW(S) ∪ FIRST(D) FOLLOW(B)=FOLLOW(S) FOLLOW(C)=FOLLOW(S) FOLLOW(D)=FOLLOW(B)∪FOLLOW(C)
• 1表示:只需向右看1个输入符号便可决定 如何推导(即选择哪个产生式进行推导)。
• 类似也可以有LL(K)文法:需向前查看K个 输入符号才可确定选用哪个产生式。
• 文法G[S]是否是LL(1)文法: S→aA S→d A→bAS A→ε
SELECT(S→aA) ={a} SELECT(S→d)={d} SELECT(A→bAS)={b} SELECT(A→ε)={a,d,#} SELECT(S→aA)∩SELECT(S→d)={a}∩{d}=Φ SELECT(A→bAS)∩SELECT(A→ε)={b}∩{a,d,#}=Φ

精品文档-编译原理基础(第二版)(刘坚)-第4章

精品文档-编译原理基础(第二版)(刘坚)-第4章
式(4.1)中属性之间的依赖关系,实质上反映了属性 计算的先后次序,即所有属性ci被计算之后才能计算属性b。
第4章 语法制导翻译生成中间代码
4.1.3 语义规则的两种形式 根据属性表示的抽象程度,语义规则可以有两种表示方
式。用抽象的属性和运算符号表示的语义规则称之为语法制导定 义,而用具体属性和运算表示的语义规则称之为翻译方案,语义 规则也被习惯地称为语义动作。
本章的重点是语义分析,为了突出重点并使分析过程 简单明了,许多的文法都采用简化了的二义文法,而默认解决 二义性的方法是为文法符号规定常规意义下的优先级和结合性。 例如表达式中算符的优先级是乘除法高于加减法,if-thenelse语句中else是右结合(移进先于归约)等等。
第4章 语法制导翻译生成中间代码
第4章 语法制导翻译生成中间代码
语法制导定义仅考虑“做什么”,用抽象的属性 表示文法符号所代表的语义,如用.post表示表达式的后缀 式;并用抽象的算符表示语义的计算,如用“||”表示两 个子表达式后缀式的连接运算。属性和运算的具体实现细 节不在语法制导定义的考虑范围。根据定义4.1可知.post 是一个综合属性。
第4章 语法制导翻译生成中间代码 【例4.1】 为下述文法所描述的中缀形式的算术表达式
加上适当的语义,得到表达式的后缀表示。其语法制导定义和翻 译方案可分别表示如下。
产生式
语法制导定义
翻译方案
L→E E → E1 + E2
E → num
print(E.post) E.post := E1.post || E2.post || '+';
第4章 语法制导翻译生成中间代码
产生式 L→E E → E1 + E2 E → num

编译原理---第4章-语法分析和语法分析程序

编译原理---第4章-语法分析和语法分析程序

A
(S
A)
(S A) • S
(b
a)
(S
A)
(b
a)
z11 z21
z12
1
z12
z22
z11 z21
z12 z22
S
A
z11
z21
z12 z22
Sbz11 | az21 Abz12 | az22 z11 | Az21 z12Az22 z21Sz11 z22 | Sz12
等式不成立)
X
X
ai
12
2021/4/6
4.1.4 预测分析法
构造FIRST集的方法
令XVN,aVT,X的产生式具有下述3种形式
X
Xa或Xa
a… {a} FIRST(A)
X X {} FIRST(A)
X Y1 Y2 … Yk
XFIRSYT1(YY21…)-{Yk} FIRST(X) 若∈FIRST(Y1),则FIRST(Y2…Yk} FIRST(X)
z12 z22
a b
c z11
z21
z12 z22
9
2021/4/6
4.1.1 消除文法的左递归
课堂练习
消除文法SAS|b, ASA|a的左递归。
10
2021/4/6
4.1.1 消除文法的左递归
课堂练习
消除文法SAS|b, ASA|a的左递归。
S=SΦ+AS+b A=SA+AΦ+a
13
2021/4/6
4.1.4 预测分析法
构造FIRST集的方法
遍历所有左部为X的产生式
set FIRST(X) { ft = ; if (XVT) return {X}; if (X P) ft += {}; for each(XY1Y2…YkP ) { for each(Yi) { if (FIRST(Yi)) { ft += (FIRST(Yi) - {}); if (i == k) ft += {}; } else { ft += FIRST(Yi); break; } } } return ft;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

消除G的左递归
三、LL(1)文法
根据前面的讨论容易看出:能够使用确定自顶向下分析技 术的文法正是LL(1)文法:
第一个L表明自顶向下分析是从左向右扫描输入串
第二个L表明分析过程中将用最左推导 1表明只需向右看一个符号便可决定如何推导即选择哪个 产生式(规则)进行推导 LL(k)文法,也就是需向前查看k个符号才可确定选用
4.2 不确定的自上而下分析法
4.2.1 一般自上而下分析法
(1) S → cAd
(2) A → ab |a Step3: a
S c A d
$ = cad
b
Ch4 语法分析
4.2 不确定的自上而下分析法
4.2.1 一般自上而下分析法
(1) S → cAd
S c A d
(2) A → ab |a
Step4:
文法为: S为开始符 Follow(S)={#} 号,#加入 S AB | bC Follow(A)={a,#,c} follow(S)中。 A ε | b Follow(B)={#} B ε | aD Follow(C)={#} C AD | b Follow(D)={#} D aS | c
S AB | bC A ε | b
B ε | aD
C AD | b
first(A)={b} ∪{}={b, }
first(B)={} ∪{a}={a, }
D aS | c
first(C)={first(A)-{}} ∪first(D) ∪first(b)={a,b, c}
first(D)={a} ∪{c}={a,c}

B
A

a * a + aε
$
Ch4 语法分析
4.2 不确定的自上而下分析法
4.2.1 一般自上而下分析法
自上而下的语法分析的一般过程
设有如下文法 G和字符串 $ = cad
(1) S → cAd (2) A → ab |a
Step1: Step2: a
S
$ = cad
c A d
b
$ = cad
Ch4 语法分析
方法二: 根据关系图法求非终结符Follow集。步骤如下: (1) 文法G中的每个符号和“#”对应图中的一个结点, 对应终结符和“#”的结点用符号本身标记。对 应非终结符的结点(如A Vn),则用Follow(A) 或first (A)标记。 (2) 从开始符号S的Follow(S)结点到“#”号的结点连 一条箭弧。 (3) 如果文法中有产生式ABX ,且 ε,则从 Follow(B)结点到first (X)结点连一条箭弧,当X Vt时,则与X相连。
因为A B
Select(Aε)=(first (ε) -{}) ∪Follow (A)={c,a,#} Select(Bε)= (first (ε) -{}) ∪Follow (B)={ #}
Select(BaD)= first (aD) ={a}
Select(CAD)= first (AD) ={b,a,c}
*
S AB | bC A ε | b
计算Select集:
B ε | aD D aS | c
C AD | b
每个产生式的Select集合计算为: Select(S bC)= first (bC)={b} Select(Ab)= first (b) ={b }
Select(SAB)= (first (AB) -{ε}) ∪Follow(S)={b,a,#}
例4.1 设有文法G和输入串 $
G: S → aA | a
A → BaA | ε B → +| – |*|,
$: a*a+a
推导过程:
S => aA => aBaA => a*aA => a*aBaA => a*a+aA => a*a+a = $ ∈L(G)
Ch4 语法分析
4.1 语法分析程序综述
I I I 0 0
L(G)=a(a|0)*
按照自上而下分析法对
输入串$产生分析树,则对非
终结符的最左推导会使分析
树无休止的延伸,使自上而
下分析陷入死循环。

ch4 语法分析 4.2 不确定的自上而下分析法 4.2.2 不确定性原因与解决方法
不确定性的原因 假匹配 回溯 无止境的匹配
G的左递归
提取左公因子
(b)若A→α Bβ 是一个产生式,则把FIRST(β )的非空元素加入
FOLLOW(B) * 中。 如果β ε 则把FOLLOW(A)也加入FOLLOW(B)中 (c)反复使用(b)直到每个非终结符的FOLLOW集不再增大为止
例 若有文法G[A]:
A →Bf|cB B →e FOLLOW(A)=? FOLLOW(B)=?
式进行匹配,直到归约到G的S为止 。
Ch4 语法分析
4.1 语法分析程序综述
4.1.2 语法分析的方法
例4.2 设有文法G和输入串 $
G: S → aA | a A → BaA| ε B→+|-|*|, $: a*a+a 推导过程: S A B A
S

S => aA => aBaA => aBaBaA=> aBaBa => aBa+a => a*a+a = $
计算FIRST集:
① 根据定义计算: 对每一文法符号X∈V 计算FIRST(X)
(a) 若X∈VT,则FIRST(X)={X}
(b) 若X∈VN,且有产生式X→a…,a∈VT, 则 a∈FIRST(X)
(c) 若X∈VN,X→ε,则ε∈FIRST(X)
(d) 若X, Y1,Y2,…,Yn都∈VN,且有产生式X→Y1 Y2 … Yn;当Y1 Y2 … Yi-1都ε时,(其中1≤i≤n),则FIRST(Y1){ε}、FIRST(Y2) -{ε} 、…、FIRST(Yi-1)- {ε},FIRST(Yi) 都包含在FIRST(X)中
• Select(Cb)= first (C) ={b } • Select(DaS)= first (aS) ={ a } • Select(Dc)= first (c) ={c}
i 1 j 2

(FIRST(Xj)-{ε})∪FIRST(Xi) ∪{ε}
当所有FIRST(Xj)(1≤j≤n)都含有{ε}时,则
j1
(FIRST(X ))
j
n
每个产生式的右部符号串的开始符号集合为:
FIRST(AB)={a,b,ε }
FIRST(bC)={b} FIRST(ε )={ε } FIRST(b)={b} FIRST(aD)={a} FIRST(AD)={a,b,c} FIRST(b)={b}
误。
Ch4 语法分析
4.1 语法分析程序综述
4.1.1 语法分析程序的功能
语法分析程序的构造要素
源程序串 (L1形式) 处理对象 分析依据 分析结果
源语言的文法G
识别出的语法范畴的表示
完成语法分析任务的程序称为语法分析 器,或语法分析程序。
Ch4 语法分析
4.1 语法分析程序综述
4.1.2 语法分析的方法
FIRST(aS)={a}
FIRST(c)={c}
2、后跟符号集合的定义:
设G=(VT,VN,S,P)是上下文无关文法,A ∈ VN ,S是开
始符号,#是输入串的结束符(输入串括号) FOLLOW(A)={a | S * μAβ且a ∈ V ,
T
a ∈FIRST( β ),μ ∈ VT*, β ∈ V+} * * 若S μAβ且β ε ,则# ∈ FOLLOW(A)
#
f, #
计算FOLLOW集:
① 根据定义计算:
对文法中每一 A∈VN 计算 FOLLOW(A) (a)设S为文法中开始符号,把{#}加入FOLLOW(S)中(这里“#‖ 为 句子括号)
(b)若A→α Bβ 是一个产生式,则把FIRST(β )的非空元素加入
FOLLOW(B) * 中。 如果β ε 则把FOLLOW(A)也加入FOLLOW(B)中 (c)反复使用(b)直到每个非终结符的FOLLOW集不再增大为止
4.1.2 语法分析的方法
语法树的从左到右叶结点=$,则 $∈L(G)。
S
a B
A a
S

A B a
A
*

$∈L(G)
+
ε
$
Ch4 语法分析
4.1 语法分析程序综述
4.1.2 语法分析的方法
二 . 自下而上语法分析方法
从给定的输入串$开始,不断寻找子串与 文法G中某个产生式P的候选式进行匹配,并 用P的左部代替(归约)之,逐步归约到S。 是一种辨认的方法,基于目标的方法。 分析的主旨是寻找合适的子串与P的侯选
也可以定义为:
* FOLLOW (A)={a | S „Aa „, a ∈ VT} 若有S * „A,则规定# ∈ FOLLOW(A)
计算FOLLOW集:
① 根据定义计算:
对文法中每一 A∈VN 计算 FOLLOW(A) (a)设S为文法中开始符号,把{#}加入FOLLOW(S)中(这里“#‖ 为 句子括号)
求出每个文法符号的FIRST集合后也就不难求出一个符号 串的FIRST集合
若符号串α∈V*,α=X1 X2 … Xn,当X1不能 FIRST(α)= FIRST(X1) * ε,则置 ∈
若对任何j(1≤j≤i-1,2≤i≤n), ε∈FIRST(Xj), ε
FIRST(Xi)则 FIRST(α)= FIRST(α)=
Ch4 语法分析
4.1 语法分析程序综述
相关文档
最新文档