编译原理 自上而下分析

合集下载

《编译原理》第5章自上而下语法分析

《编译原理》第5章自上而下语法分析

编译原理武汉大学计算机学院编译原理课程组第5章自上而下语法分析·基本思想·存在的问题·解决方法·LL(1)方法·递归子程序法5.0 语法分析的功能及基本思想依据语法规则,逐一分析词法分析时得到的单词,把单词串分解成各类语法单位,即确定它们是怎样组成说明和语句,以及说明和语句又是怎样组成程序的。

分析时如发现有不合语法规则的地方,便将出错的位置及出错性质打印报告给程序员;如无语法错误,则用另一种中间形式给出正确的语法结构,供下一阶段分析使用。

1. 语法分析的功能5.0 语法分析的功能及基本思想2.自上而下语法分析的基本思想从识别符号出发,不断建立直接推导,试图构造一个最左推导序列,最终由它推导出与输入符号串相同的符号串。

从语法树的角度看,自顶向下分析过程将以识别符号为根结点,试图向下构造一棵语法树,其末端结点符号串正好与输入符号串相同。

相应于高级语言的编译过程,自上而下语法分析就是从该高级语言文法的开始符号——<程序>出发,试图推导得到该文法的句子——源程序或与其等价的单词串。

3. 自上而下语法分析遇到的问题5.0 语法分析的功能及基本思想在分析的过程中,匹配失败后,必须退回到出错点,选择其它可能的产生式重新推导,这个过程称为回溯。

如果文法中存在如下形式的产生式A →α1|α2|…|αn那么在自上而下的语法分析过程中,当要对A 展开时,应按哪一个后选式展开呢?即如何确定替换A 的αi 。

如果选择错误,将导致回溯。

5.0 语法分析的功能及基本思想3. 自上而下语法分析遇到的问题当文法中出现左递归时(存在非终结符号U,对于它有+⇒U→U…或U U…),会使分析过程陷入无限循环。

例如对文法G[S]:S→ABA→bB|AaB→Sb|a5.0 语法分析的功能及基本思想4.自上而下语法分析中问题的解决方法·避免回溯·消除左递归5.1 消除左递归的方法1.直接左递归的消除•采用扩充BNF表示[x]——x可以出现零次或一次{x}——x可以出现零次到多次x(y|z)——等价于xy或xz5.1 消除左递归的方法1.直接左递归的消除•采用扩充BNF表示•引进新的非终结符号,将左递归改写为右递归。

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

第四章 编译原理语法分析--自上而下
13
消除左递归 (P69.)

(1)直接左递归:文法存在产生式 A→Aα。 (2)间接左递归:文法不存在产生式 A→Aα, 但存在推导 A + Aα。
消除直接左递归的方法:引入新的非终结符号A‘,将 关于A的如下产生式 A→Aα|β (α非ε且β不以A打头) 替换为 A →βA‘ A‘ →αA‘|ε 注意:不要掉了 A‘ →ε
4
自上而下分析法的思想(P66.)

从文法的开始符号出发,逐步向下推导,不断替换和展开非 终结符,去匹配输入符号串(终结符号串、句子),即寻找输入 串的最左推导,推出句子,(---自上而下的实质) 并按与最左推导相对应的顺序,从文法的开始符号(根结)出 发,自上而下从左到右地建立输入串的语法分析树。---其末 端节点正好与输入符号串相同
3

4.2 自上而下分析法面临的问题

. 本小节首先通过例子P67:

说明自上而下分析的思想 认识自上而下分析时所遇到的主要困难



自上而下分析的主要困难是P66-68 : 文法的左递归性,可能使分析陷入无限循环 回溯的不确定性,要求将已完成的工作推倒重来 为解决这些问题,使得自上而下分析是确定的,考 虑要消除文法左递归和避免回溯。 最后构造确定的有效的自上而下分析器:递归下降 分析器
2
4.1 语法分析器的功能(P66.)

语法分析是编译程序的核心部分。
语法分析是在词法分析识别出单词符号的基础上, 分析并判定(即识别)一串单词符号(称为输入串) 的语法结构是否符合语法规则,是否是文法的一个 句子。
分析判定的方法:


建立输入串α的从文法开始符号S出发的推导 S α1 … αn α 即建立以开始符号S为根的与输入串α相匹配(即α 中的各个符号为叶结点)的语法树

编译原理张晶版 第四章 自上而下语法分析

编译原理张晶版 第四章 自上而下语法分析

1、消除左递归
•1) 什么是左递归 —左递归:文法存在产生式 P + Pa —直接左递归: P —间接左递归:P Pa Aa ,A + Pb
•2)消除左递归
—消除直接左递归 —消除间接左递归
第四章 自上而下语法分析(23)
第二节 自上而下分析法的一般问题 三、不带回溯的自上而下分析算法
2、消除直接左递归
第四章 自上而下语法分析(44)
第三节 预测分析程序与LL(1)文法 二、求串a的终结首符集和非终结符A的随符集
例:对如下文法G(已加上编号)
1. E
4. T 7. F
TE’
FT’ i
2. E’
5. T’ 8. F
+TE’
*FT’ (E)
3.E’
6.T’
e
e
求各非终结符号的终结首符集和随符集
第四章 自上而下语法分析(45)
第四章 自上而下语法分析(47)
第三节 预测分析程序与LL(1)文法 二、求串a的终结首符集和非终结符A的随符集
例:对如下文法G(已加上编号)
1. E
4. T 7. F
TE’
FT’ i
2. E’
5. T’ 8. F
+TBiblioteka ’*FT’ (E)3.E’
6.T’
e
e
求各非终结符号的终结首符集和随符集
第四章 自上而下语法分析(48)
第四章 自上而下语法分析(40)
第三节 预测分析程序与LL(1)文法 三、构造预测分析表
1. 基本思想 1)若A a是一个产生式,a ∈ First(a),那么当A 是栈顶符号且将读入a时,选择a取代A匹配成功的 希望最大,故,M[A,a]元素为A a 2)若A a而a=e,或a + e;当A是栈顶符号且将读 入a时,若a ∈ Follow(A),则栈顶的A应被e匹配; 此时读头不前进,让A的随符与读头下的符号进行 匹配,这样输入串匹配成功的可能最大,故M[A,a] 元素为A a(这里a=e或a + e)

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

编译原理第4章语法分析自上而下
Yn;当Y1 Y2 … Yi-1都ε时,(其中1≤i≤n),则FIRST(Y1){ε}、FIRST(Y2) -{ε} 、…、FIRST(Yi-1)- {ε},FIRST(Yi) 都包含在FIRST(X)中
(e) 当(d)中所有Yi * ε,(i=1,2,…n),则 FIRST(X)=FIRST(Y1)∪FIRST(Y2)∪…∪FIRST(Yn)∪{ε}
一 . 自上而下语法分析方法
给定文法G和源程序串$。从G的开始符 号S出发,通过反复使用产生式对句型中的 非终结符进行替换(推导),逐步推导出$ 。
是一种产生的方法,面向目标的方法。 分析的主旨是选择产生式的合适的侯选 式进行推导,逐步使推导结果与$匹配。
Ch4 语法分析 4.1 语法分析程序综述 4.1.2 语法分析的方法
计算Select集:
B ε | aD C AD | b
每个产生式的Select集合计算为:D aS | c
Select(SAB)= (first (AB) -{ε}) ∪Follow(S)={b,a,#}
Select(S bC)= first (bC)={b}
因为A B
Select(Aε)=(first (ε) -{}) ∪Follow (A)={c,a,#}
A ε | b B ε | aD C AD | b D aS | c
first(C)={first(A)-{}} ∪first(D) ∪first(b)={a,b, c}
first(D)={a} ∪{c}={a,c}
➢求出每个文法符号的FIRST集合后也就不难求出一个符号 串的FIRST集合
✓若符号串α∈V*,α=X1 X2 … Xn,当X1不能
∪{ε}
ε*,则置 ∈

编译原理完整课件_第4章 语法分析-自上而下分析

编译原理完整课件_第4章 语法分析-自上而下分析

2022/3/20
中南大学软件学院 陈志刚
6
第四章 语法分析-自上而下分析
4.2 自上而下分析面临的问题
➢ 顾名思义,自上而下就是从文法的开始符号出 发,向下推导,推出句子。 • 带回溯的分析方法 • 不带回溯的递归子程序(递归下降)分析方 法
➢ 自上而下分析的主旨: 对任意输入串,试图用一切可能的办法,从文 法开始符号(根结)出发,自上而下地为输入 串建立一棵语法树。或者说,为输入串寻找一 个最左推导。
设 ,有P→Pα|β,若α≠>ε,β不以P开头 (否则不可能消除左递归)。
则改写为:
可消除左递归。
2022/3/20
中南大学软件学院 陈志刚
12
第四章 语法分析-自上而下分析
一般地,若 αi≠ε,βj不以P开头, 则可改写为:
从而消除直接左递归。 ■ 例:S→Sabc|Sab|ab ■ 消除直接左递归得:
2022/3/20
中南大学软件学院 陈志刚
13
2、完全消除左递归 分析
第四章 语法分析-自上而下分析
虽不含直接左递归,但
所以含有左递归。
■ 如果文法G不含回路( ),也不含ε产生式,
则下列算法可消除左递归(完全)
①把G的非终结符按任意顺序排列成P1,…,Pn
②for i:=1 to n do
begin for j:=1 to i-1 do
➢ 关键:对一个文法,当给你一串(终结)符号 时,怎样知道它是不是该文法的一个句子呢? 这就要判断,看是否能从文法的开始符号出发 推导出这个字符串。或者,从概念上讲,就是 要建立一棵与输入串相匹配的语法分析树。
2022/3/20
中南大学软件学院 陈志刚

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

编译原理第章自上而下语法分析
当预测失败时,需要回溯到之前的步骤并尝试其 他可能的分支,这可能导致效率低下。
3
对输入符号的依赖
自上而下的语法分析需要在分析过程中不断查看 输入符号,因此对输入符号的依赖较强。
编译原理的发展趋势与挑战
静态代码分析与优化
通过静态代码分析技术,编译器可以在编译时检测出更多的潜在错误,并进行 相应的优化。
非递归预测分析的基本思想
消除左递归
通过改写文法规则,消除直接和间接左递归,使得分析过程能够 顺利进行。
构造预测分析表
根据文法规则和非终结符的FOLLOW集,构造预测分析表,用于 指导分析过程。
栈和输入符号的同步处理
使用栈保存分析过程中的信息,并根据输入符号和栈顶信息进行同 步处理,实现语法分析。
非递归预测分析表的构造
介绍LL(1)文法的定义和判别方法,包括FIRST集和 FOLLOW集的构造。
递归下降分析算法设计
介绍递归下降分析算法的设计方法,包括递归子程序的 编写和错误处理机制。
02
CATALOGUE
语法分析基础
语法分析器的作用
识别语法错误
语法分析器能够检查源代码是否 符合语言的语法规则,识别出语 法错误并提供相应的错误信息。
在推导过程中,如果遇到非终 结符,则根据相应的产生式规 则进行替换,直到最终得到终
结符序列为止。
递归下降分析器的构造
分析函数根据当前输入符号和文 法规则判断应该执行的操作。
如果当前输入符号与文法规则中的某 个终结符相匹配,则消耗掉该输入符 号,并继续分析下一个输入符号。
如果当前输入符号与文法规则中 的某个非终结符相匹配,则调用 相应的分析函数进行递归分析。
预测分析算法的实现
初始化分析栈

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

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

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

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

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

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

1.课程设计目的:1.1 设计目的:通过编程实现语法分析(自上而下,自下而上)的可视化过程,加深对两法分析原理思想的理解。

[目的要求]通过设计编制调试一个具体的语法分析程序,加深对语法分析原理的理解。

并掌握在对程序设计语言源程序进行扫描过程中将其进行语法分析的方法。

[题目分析]递归下降分析方法是一种确定的自上而下分析方法。

它的基本思想是给文法的每一个非终结符均设计一个相应的子程序。

由于文法的产生式往往是递归的,因为这些子程序往往也是递归的。

1.2 开发环境:操作系统:Windows XP辅助工具:Visual Studio 2008编程语言:C#2. 课程设计要求(1)选定一文法,选定一种分析方法(自上而下、自下而上)(2)允许用户输入语句并对该语句进行相应的语法分析(3)要求显示语法树的建立过程以及跟踪分析表和分析栈的状态(4)要提供单步运行,让用户跟踪分析器工作的每一个步骤。

3. 总体设计3.1 设计框架:3.2 程序流程图:4. 设计功能描述:(1)该课程设计对语法分析指定了固定的文法,运行界面为:“开始”,会出现提示:。

(3)用户输入字符串,可以点击“”,软件根据该输入字符串做好初始化工作,再点击“”,开始分析,每一次点击“下一次”,就做分析的一个步骤,并且此时分析栈和输入栈做相应的出栈、入栈的的动作,同时在“分析栈”,“输入栈”,“输出栈”会显示出相应的状态。

(4)分析结果显示在中(5)如果在分析完后,还需要继续输入字符串分析的画,点击“”,可以再次作上述的操作。

(6)如果想退出程序,点击““,此时会弹出提示窗口:,点击“确定”,便退出程序。

分析实例:输入分析的字符串为i*(i+i)结果如下:5. 源程序代码:#region相关初始量(都是全局的)public string[] mystring = { "TC", "FALSE", "FALSE", "TC", "FALSE", "FALSE", "FALSE", "+TC", "FALSE", "FALSE", "ε", "ε", "FD", "FALSE", "FALSE", "FD", "FALSE", "FALSE", "FALSE", "ε", "*FD", "FALSE", "ε", "ε", "i", "FALSE", "FALSE", "(E)", "FALSE", "FALSE" };//分析表数组bool con = true;//控制显示的布尔量private Stack MyStack = new Stack(); //申请一个分析栈private Stack MyInputstack = new Stack();//申请一个输入栈public string[] Term = { "i", "+", "*", "(", ")", "&" }; //终结符数组public string[] unTerm = { "E", "C", "T", "D", "F" };//非终结符数组private int line, row; //定义行,列的全局变量string MyNowString;#endregion“开始”按钮实现的函数private void开始_Click(object sender, EventArgs e){if (Input_richTextBox1.Text == ""){MessageBox.Show("请输入要分析的字符串!");}else{this.MyOutput_listBox3.Items.Add("");MyStack.Push("&");MyStack.Push("E");MyStack_listBox1.Items.Add("&E");MyInput_listBox2.Items.Add(Input_richTextBox1.Text + "&");MyInputstack.Push("&");for (int i = Input_richTextBox1.Text.Length - 1; i >= 0; i--){MyInputstack.Push(Input_richTextBox1.Text[i]);}begin.Enabled = false;}}#region“下一步”按钮实现的函数private void下一步_Click(object sender, EventArgs e){int loc;string MyStackTop, MyStackInputTop;MyStackTop = MyStack.Peek().ToString();MyStackInputTop = MyInputstack.Peek().ToString();MyStackTopOne(MyStackTop);if (MyStackTopOne(MyStackTop)){MyStackTopTwo(MyStackTop, MyStackInputTop);}else if (MyStackTopThree(MyStackTop) &&MyInputStackTopOne(MyStackInputTop)){loc = line * 6 + row;MyNowString = mystring[loc];this.MyOutput_listBox3.Items.Add(MyStack.Peek().ToString() + "-->" + mystring[loc]);Analyse();}else{Rezult_richTextBox2.Text = "分析出错!";nextStep.Enabled = false;con = false;}if (con){ShowMyStack();ShowMyInpuStack();}}#endregion#region显示分析栈里的字符private void ShowMyStack(){string ch = "";int len = MyStack.Count;string display = "";for (int i = 0; i < len; i++){string t;t = MyStack.Pop().ToString();display = display + t;}for (int i = len - 1; i >= 0; i--){ch = ch + display[i];MyStack.Push(display[i]);this.MyStack_listBox1.Items.Add(ch);}#endregion#region显示输入栈里的字符private void ShowMyInpuStack(){int len = MyInputstack.Count;string display = "";for (int i = 0; i < len; i++){string t;t = MyInputstack.Pop().ToString();display = display + t;}for (int i = len - 1; i >= 0; i--){MyInputstack.Push(display[i]);}this.MyInput_listBox2.Items.Add(display);}#endregion#region判断状态栈栈顶元素是否为终结符public bool MyStackTopOne(string stack){bool symbol = false;for (int i = 0; i < Term.Length; i++){if (stack == Term[i]){symbol = true;break;}}return symbol;}#endregion#region状态栈栈顶元素是终结符的处理方法private void MyStackTopTwo(string stack, string input) {if (stack == input)if (stack == "&"){Rezult_richTextBox2.Text = "分析成功!"; nextStep.Enabled = false;con = false;}else{MyStack.Pop();MyInputstack.Pop();this.MyOutput_listBox3.Items.Add(""); }}}#endregion#region返回状态栈栈顶元素在非终结符数组里的下标public bool MyStackTopThree(string stack){bool symbol = false;for (int i = 0; i < unTerm.Length; i++){if (unTerm[i] == stack){line = i;symbol = true;break;}}return symbol;}#endregion#region返回输入栈栈顶元素在终结符数组里的下标private bool MyInputStackTopOne(string myinput){bool symbol = false;for (int i = 0; i < Term.Length; i++){if (Term[i] == myinput){row = i;symbol = true;break;}return symbol;}#endregion#region分析表字符入栈private void Analyse(){if (MyNowString == "FALSE"){Rezult_richTextBox2.Text = "分析出错!";nextStep.Enabled = false;con = false;}else if (MyNowString == "ε"){MyStack.Pop();}else{MyStack.Pop();for (int i = MyNowString.Length - 1; i >= 0; i--) {MyStack.Push(MyNowString[i]);}}}#endregion#region“退出”按钮实现的函数private void exit_button2_Click(object sender, EventArgs e) {DialogResult ret;ret = MessageBox.Show("确定要退出吗?","退出",MessageBoxButtons.OKCancel,MessageBoxIcon.Question,MessageBoxDefaultButton.Button2);if (ret == DialogResult.OK){this.Close();}}#endregion#region“重置”按钮实现的功能private void clear_Button_Click(object sender, EventArgs e){Input_richTextBox1.Clear();Rezult_richTextBox2.Clear();this.MyStack_listBox1.Items.Clear();this.MyInput_listBox2.Items.Clear();this.MyOutput_listBox3.Items.Clear();MyStack.Clear();MyInputstack.Clear();begin.Enabled = true;nextStep.Enabled = true;con = true;}#endregionprivate void button1_Click(object sender, EventArgs e){pictureBox1.Visible = true;}}6. 总结:通过本次课程设计,对于语法分析的原理与方法有了进一步的体会,在通过使用visual studio 2008的同时让我们对c#和语法分析有了更深的理解。

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

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

• 例 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)所得的文法。即去除那些从开始符号出发永 远无法到达的非终结符的产生规则。

编译原理笔记8 自上而下语法分析-带回溯的自顶向下分析技术

编译原理笔记8 自上而下语法分析-带回溯的自顶向下分析技术

1.自上而下分析法的一般问题。

1)自上而下语法分析定义:从文法的开始符号开始,反复使用不同产生式进行推导以谋求与输入符号串相匹配。

注:此处的输入符号串是指词法分析结果的一串二元式。

2)一般方法:
a) 基本构成:设下推栈的初始状态包括两个符号:‘#S’,其中‘#’为栈
底,‘S’为文法开始符号。

整个分析过程在语法分析程序控制下进行。

在语法分析中用到的文法产生的表,称为语法表。

b) 算法
i. 若栈顶符号x是非终结符,查询语法表,找出一个以x为左部的产生
式,x出栈,并将其右部反续入栈,且输出带上记下产生式编号——
推导。

ii. 若栈顶符号x是终结符,且读头下的符号也是x,则x出栈,读头指向下一个符号——匹配。

iii. 若栈顶符号x是终结符,但读头下的符号不是x,则匹配失败。

这说明可能前面推导时选错了候选式,退回到上次推导现场(包括栈顶
符号、读头的指针和输出带上信息)——回溯。

iv. 回溯后选取另一候选式进行推导,若没有候选式可选,则进一步回溯。

若回溯到开始符号又已无候选式可选,则识别失败。

v. 若栈内仅剩下“#”,且读头也指向“#”,则识别成功。

c) 带回溯的自上而下分析法的缺陷
i. 如果文法存在左递归,语法分析会无限循环下去。

ii. 若产生式存在多个候选式,选择哪个进行推导完全是盲目的。

iii. 回溯会引起时间和空间的大量耗费。

iv. 如果被识别的语句是错的,算法无法指出错误的确切位置。

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

编译原理第四章  语法分析—自上而下分析
经过反复提取左因子,就能够把每个非终 结符(包括新引进者)的所有候选首符集变 成为两两不相交。
国防科技大学计算机系602教研室
4.3.3 LL(1)分析条件
E→TE E→+TE | T→FT T→*FT | F→(E) | i
i + i
国防科技大学计算机系602教研室
E
i+i
IP
G(E): E→TE E→+TE | T→FT T→*FT | F→(E) | i
END
3. 化简由2所得的文法。去除那些从开始符号出发永 远无法到达的非终结符的产生规则。
国防科技大学计算机系602教研室
例 考虑文法G(S)
S→Qc|c Q→Rb|b R→Sa|a
令它的非终结符的排序为R、Q、S。 对于R,不存在直接左递归。 把R代入到Q的有关候选后,把Q的规则
变为 Q→Sab | ab | b
通 一常 步,或用若干1步,可n 以表推示出:从n。1出发,经过
*
用 1 n 表示:从1出发,经过0步或Leabharlann 若干步,可以推出n。*
所以 : 即 或
定义:假定G是一个文法,S 是它的开始符号。
如 号果的句S型 是*一个,句则子。称文是法一G个所句产型生。的仅句含子终的结全符
体是一个语言,将它记为 L(G)。
一个文法消除左递归的条件: 不含以为右部的产生式 不含回路。
PP
国防科技大学计算机系602教研室
消除左递归的算法:
1. 把文法G的所有非终结符按任一种顺序排列成P1, P2,…,Pn;按此顺序执行;
2. FOR i:=1 TO n DO
BEGIN FOR j:=1 TO i-1 DO

编译原理笔记7 自上而下语法分析-下推自动机

编译原理笔记7 自上而下语法分析-下推自动机

1.引言
1)语法分析的地位:是编译程序的核心部分。

2)语法分析的任务:识别由词法分析得到的单词序列是否是给定文法的句子。

3)语法分析的理论基础:上下文无关文法和下推自动机。

4)语法分析的方式:(1)自上而下语法分析:反复使用不同产生式进行推导以谋求与输入符号串相匹配。

(2)自下而上语法分析:对输入符号串寻找不同产生式进行规约直到文法开始符号。

注:这里所说的输入符号指词法分析所识别的单词。

2.下推自动机:
1)下推自动机模型
2)下推自动机的形式定义:
注:a.由此定义的PDA肯定是不确定的PDA。

这给语法分析会带来不确定性。

我们在构造PDA M的算法的时候,要对PDA做一些限制。

b.PDA采用“|-”来表示PDA做了一步动作。

C.输入串能为PDA所接受,仅当输入串读完,下推栈为空;或者输入串读完,控制器到达某些终态。

D.有时,下推自动机还配置输出带,以记录推导或规约过程所有的产生式编号。

e.对于形如A->ω的产生式,有§(q,空串,A)=(q,ω),这称为推导。

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

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

二、算符优先文法和优先表的构造
1 算符优先文法(OPG文法)
两个非终结符相邻
(1)算符文法(OG文法):设有一文法G,若G中没有形如
S→…QR…产生式,(S,Q,R∈VN)则称文法G为算符文 法。 (2)定义优先关系:设文法G是一个OG文法,令a,b是任意两 个终结符号,P , G , R 是非终结符号,定义: . ① a = b 当且仅当文法G中含有形如P→…ab…或 P→…aQb…规则。 ② a <. b 当且仅当文法G中含有形如P→…aR…的 规则, 其中:R=>b…或R=>Qb…。 ③ a .> b 当且仅当文法G中含有形如P→…Rb…的 规则, 其中:R=>…a 或 R=>…aQ。
3
S S→aAcBe A→b | Ab a A c B e B→d 问abbcde是不是该文法的句子? A b d 步骤 符号栈 输入流 动作 0 # abbcde# b 1 #a bbcde# 移进 2 #ab bcde# 移进 3 #aA bcde# 归约,用A→b 4 #aAb cde# 移进 5 #aA cde# 归约,用A→Ab 6 #aAc de# 移进 7 #aAcd e# 移进 8 #aAcB e# 归约,用B→d 9 #aAcBe # 移进 10 #S # 归约,用S →aAcBe 4 11 #S # 成功 例:设文法G[S]:
10
优先关系的例子

文法:S→bAb
A→(B | a B→Aa) //S→bAb //A→(Aa)|a
语言:{bab, b(aa)b, b((aa)a)b, } 可以从语法树里面导出部分优先关系。

S b b<a A a b a>b
S
b

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

《编译原理》第4章自上而下语法分析
• 从语法树的角度看,从根节点出发,反复使用 所有可能的产生式,谋求输入串的匹配,试图 向下构造一棵语法树,其末端节点正好与输入 符号串相同。
• 需要反复试探。
•问题1:回溯(P67)
x
S A y
• 例1:设有文法 (1) S xAy (2) A **|* 现有输入串:x*y 其分析过程如右:
•消除回溯
• 方法是:反复 “提取公共左因子”,使得文法 的每个非终结符号的各个候选式的首终结符集 两两不相交,来避免回溯。 设产生式为: A→δ α1|δ α2|…|δ αn
替换为:
Aδ A' A' α1|α2|…|αn
• 例3:有如下两个产生式:
<IF语句> if E then S1 else S2; <IF语句> if E then S1;
First(A1) = {a} First(A2) = {c} First(B1) = {b} First(B2) = {d}
• 在右边给定的文法中,A 的候选式有两个,其首终 结符集为: First(A1) = {*} First(A2) = {*} 相交,就会产生回溯
(1) S xAy
(2) A **|*
结论:能够从开始符号出发推导出给定的输入串,
因此,是句子。
• 常用的语法分析方法:
根据建立语法分析树的方法来分,有两大类,分四小类:
自顶向下分析法: 从文法的开始符号出发,向下推导(使用最左推 导) ,尽可能使用各种产生式,推导出与输入串 匹配的句子,从而建立语法树。
自底向上分析法: 从输入符号串开始,逐步进行归约(最右推导的 逆过程),直至归约到文法的开始符号,从而建 立语法树。 具体分类:

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

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

第五章语法分析——自下而上分析要紧内容:[1]自下而上分析的大体问题[2]算符优先分析法[3]算符优先分析表和优先函数的构造[4]LR分析器的大体原理大体要求:[1]明白得自下而上分析法的大体思想[2]明白得有关归约、短语、句柄、标准归约等概念[3]把握算符优先分析法[4]了解算符优先表和优先函数的构造技术[5]了解LR 分析器大体原理和工作方式教学要点:本章介绍自下而上语法分析方式。

所谓自下而上分析法确实是从输入串开始,慢慢进行“归约”,直至归约到文法的开始符号;或说,从语法树的结尾开始,步步向上“归约”,直到根结。

讲义摘要:5.1 自下而上分析大体问题自下而上分析法的大体思想:从输入串开始,慢慢进行“归约”,直到文法的开始符号。

即从树结尾开始,构造语法树。

所谓归约,是指依照文法的产生式规那么,把产生式的右部替换成左部符号。

自上而下分析的核心问题是:如何判定符号串的可归约性,和如何归约。

即,识别可归约串的问题。

归约自下而上分析法事实上确实是一种“移进-归约”法,即,采纳“移进-归约”思想进行。

实现思想是:对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄时,(该句型对应某产生式的右部,即栈顶生成了某产生式的右部的文法符号串),就将栈顶的这一部份替换成 (归约为) 该产生式的左部符号,这称为归约。

重复这一进程直到归约到栈中只剩文法的开始符号时那么为分析成功,也就确认输入串是文法的句子。

现举例说明。

例1:设文法G[S]为:(1) S→aAcBe(2) A→b(3) A→Ab(4) B→d试对abbcde进行“移进-归约”分析。

步骤: 1 2 3 4 5 6 7 8 9 10解:动作: 进a 进b 归(2) 进b 归(3) 进c 进d 归(4) 进e 归(1)表1符合栈的转变进程自下而上语法分析的进程也可看成自底向上构造语法树的进程,每步归约都是构造一棵子树,最后当输入串终止时恰好构造出整个语法树,如图1所示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本章在编译程序中的地位表词法分析器语法分析器源程序单词符号出2• 上下文无关文法的定义:G G=(V T V N S P)– V T ( )– V N ( ) V T ∩ V N =∅ – S S ∈V N– P ( )P →α P ∈V N α ∈ (V T ∪ V N )*– S复习• + *G= {i + * ( )} {E} E PPE → iE → E+EE → E*EE → (E)(i+i)E⇒(E)⇒(E+E)⇒(i+E)⇒(i+i)34},|{)(*TV S G L ∈⇒=+αααq 定义:假定G是一个文法,S 是它的开始符号。

如果Sα ,则α称是一个句型。

仅含终结符号的句型是一个句子。

文法G所产生的句子的全体是一个语言,将它记为 L(G)。

• α1 αn α1 αn+ ⇒α1 αn α1 0 αn* ⇒ 所以 : α1 αn 即 α1=αn , α1 αn* ⇒ + ⇒ * ⇒第4章 自上而下语法分析• 消除文法左递归,消除回溯,计算FIRST集、FOLLOW集,LL(1)分析条件, LL(1)文法的概念,预测分析表的构造。

• :自上而下分析方法的基本思想, 自上而下分析的过程。

• 4.14.24.3 LL(1)4.4重点难点4.5*4.6 LL(1)564.1 语法分析器的功能• 是在词法分析识别出单词符号串的基础上,分析判断程序的 是否符合语法规则。

• 是编译过程的核心部分。

• 有自上而下和自下而上两类。

两种方法反映了两种语法树的构造过程。

74.1 语法分析器的功能• " " 推导。

也就是从文法的开始符号开始,将它做为语法树的根,向下逐步建立语法树,使语法树的结果正好是输入符号串.• “归约”也就是从输入符号串开始,以它做为语法树的结果,自底向上地构造语法树.注:这里所说的输入符号串指词法分析所识别的单词。

84.2 自上而下分析面临的问题• – . – .• 例4.1文法:⑴ S→xAy⑵ A→** ⑶ A→*输入串 α=x*y,分析α是否该文法的句子?指示器IP指向 语法树 最左推导 说明x*y S S, x序号 ip 指向 语法树 最左推导 说明S x*yx A y A →** AS ⇒xAy ⇒x**y* *x*y* , ip S序号 ip 指向 语法树 最左推导 说明x*y Sx A yA →* AS ⇒xAy ⇒x*y * x*y * , ip Sx A y12自上而下分析• 从文法的开始符号出发,向下推导,试图推出句子,匹配输入符号串,寻找输入串的最左推导,并按与最左推导相对应的顺序,自上而下从左到右地建立输入串的语法分析树。

• – , , , ,– ip• 13自上而下分析※※ “ ”• – 14候选式的确定与回溯问题 • 自上而下分析是一种反复用可能的候选式去进行试探的过程,不能预知本次试探是否会成功,若不成功则需要回溯。

• S →xAy A →**|*x*y• S x A y * * 不成功,回溯 S x A y* 成功x*y 是句子左递归• P +Pα– 直接左递归:P → Pα– 间接左递归:存在推导P → Aα, A + Pβ • 文法具有左递归性,采用自上而下方法分析,可能164.2 自上而下分析面临的问题• :– ,– , • 174.2 自上而下分析面临的问题1. 如果文法存在左递归,自上而下语法分析会无限循环下去;※ 一个文法含有左递归,如存在非终结符P: P → P α ※ 会使分析陷入无限循环:即当使用P去匹配新的串时,在没识别任何输入符号,却要从新使用P去匹配2. 产生式存在多个候选式,选择哪个推导完全是盲目的;3. 回溯会引起时间和空间的大量消耗;4. 如果被识别语句是错的,算法无法指出错误的确切位置;4.3 不带回溯的自上而下分析法 • 文法不含左递归左递归的存在可能使自上而下分析过程陷入无限循环, 故使用自上而下分析法必须消除文法的左递归 。

• 分析过程无回溯回溯的存在可能使已做的大量语法和语义分析推倒重来, 这会严重影响效率, 故使用自上而下分析法必须消除回溯。

18194.3.1 左递归的消除• 直接左递归的消除设有文法G=(V N ,V T ,P,S),其中产生式 P→Pα|β (α非ε且β不以P打头) 替换为 P→βP’ P’ →αP’|ε 方法: 引入一个新的非终结符,把含有左递归的产生式改写为右递归形式。

20 • 例4.2 文法G(E): E →E +T | TT →T*F | FF →(E) | i消去直接左递归后变成: E →TE ʹE ʹ→+TE ʹ | εT →FT ʹT ʹ→*FT ʹ | ε F →(E) | i P→Pα|β 替换为 P→βP’ P’ →αP’|ε21消除下面文法的左递归 : (1) G(H): HM → d|aHb解: 消除左递归后的文法:(1) G(H): H → MH ’ H ’ → ;MH ’|εM → d|aHb (2) G(A): A →aAb1|a B (2) G(A): A → aAb1|aB →dB ’ B ’→bB ’|ε消除左递归 练习 1H → H;M|M B →Bb|d22 消除左递归 练习 2消除下面文法的左递归 :G(P): P → 解: 消除左递归后的文法:G(P): P → BaPP ’P ’→ aPbP ’|εP α β23消除直接左递归的一般方法• 直接左递归的消除一般而言,假定P关于的全部产生式是:P→Pα1| Pα2|…| Pαm | β1| β2 |… | βn其中,每个α都不等于ε,而每个β都不以P开头 • 消除P的直接左递归性就是把这些规则改写成 P→ β1 P’| β2 P’|…| βn P’P’ →α1P’| α2P’| …| αm P’| ε , E →E +T |E −T |T :E →TE'E'→+T E'|−T E'|ε24消除间接左递归• 间接左递归的消除:先将间接左递归变为直接左递归,再按消直接左递归的方法消除。

4.3(1) A →Bb (2)B →Ac (3) B →dA B (1) (2) B →Bbc B → Bbc|d :A →BbB →dB’B’→bcB’|ε254.4(1)A →Bb (2)B →Ac (3)B →d(2)(3) (1) : A →Acb|db , :A →dbA’A’ →cbA’|εB , B• 26消除左递归算法: P70(1)文法的所有非终结符排序为P 1,P 2,…,P n ;(2)将间接左递归改为直接左递归,消除之; for (i=1; i<=n; i++){ for (j=1; j<=i −1; j++)P i →P j γ|β P j →δ1|…|δkP i →δ1γ|…|δk γ| β ;P i ; }(3)化简, 删去那些不可达的产生式。

v :, ;27:(1) : (P->P) ε-(2) ,(3)28• 4.5 G(S)S →Qc|cQ →Rb|bR →Sa|aR Q S R S RQ R Q R QQQ →Sab|ab|b S Q29• 4.5 G(S)S →Qc|cQ →Rb|bR →Sa|aR Q S QQ →Sab | ab | bS Q S Q S S S →Sabc | abc | bc | c30 • 4.5 G(S) S →Qc|cQ →Rb|bR →Sa|aSS →Sabc | abc | bc | c S S →abcS ʹ | bcS ʹ | cS ʹ S ʹ→abcS ʹ | ε Q →Sab |ab | b R →Sa|a31S,Q,R, G''[S]: S →Qc | c Q →Rb | b R →bcaR' |caR' |aR' R'→bcaR' |ε• 4.5 G(S) S →Qc|c Q →Rb|b R →Sa|a S S →abcS ʹ | bcS ʹ | cS ʹS ʹ→abcS ʹ | εQ →Sab |ab | bR →Sa|aQ R G'[S]: S →abcS ʹ | bcS ʹ | cS ʹS ʹ→abcS ʹ | ε32游戏:抓出头鸟• 游戏目标: “ ” “ ” A “ ” A ε FIRST(A) • 游戏规则:(1)若 A a… ,则a ∈ FIRST(α); (2)若A ε,则ε ∈ FIRST(α); (3)若A →B…,则FIRST(B)的所有非ε 元素属于FIRST(A)。

* ⇒ * ⇒33游戏开始……有文法G[E]:E →TE'E'→+TE' |εT →FT'T'→*FT' |εF →(E)∣I求FIRST(E)、FIRST(E ’)、 FIRST(T)、 FIRST(T ’)、 FIRST(F)。

解: FIRST(E')={+,ε};FIRST(T')={*,ε};FIRST(F)={(,i };由T→F…知,把FIRST(F)的所有非ε元素加入FIRST(T),故:FIRST(T)= {(,i };由E→T…知,把FIRST(T)的所有非ε元素加入FIRST(E),故:FIRST(E)= {(,i }。

3435FIRST(α)集合 (终结首符集) P71 • 令G是一个不含左递归的文法, α∈{V T ∪V N }* • 定义α的终结首符集为:FIRST(α)={ a| α a … 且 a ∈V T } • 特别是,若α ε,则规定ε ∈ FIRST(α)。

• 即FIRST(α)集合 α ε* ⇒* ⇒36复习• :– ,– , • 374.3.2 消除回溯、提左因子• 产生回溯的原因:进行推导时,若产生式存在多个候选式,选择哪一个候选式进行推导存在不确定性。

• 消除回溯的基本原则:文法G 的任何非终结符,若能根据当前读头下的符号,准确的选择一个候选式进行推导,那么回溯就可以消除。

• 消除回溯的方法:预测和提左因子384.3.2 消除回溯、提左因子• 预测:39• A A →α|β a A a A a ∈FIRST(α) a ∈FIRST(β) A →α a ∈FIRST(α) a ∈FIRST(β) A →βa ∈FIRST(α) a ∈FIRST(β) a ∈FIRST(α) a ∈FIRST(β) …… …40 求FIRST(α)的方法 P78 • α=X 1X 2……X n FIRST(α X i FIRST(X i ) α 的首符集。

41• α=X 1X 2……X n FIRST(α), FIRST :(1) FIRST(α)= FIRST(X 1)-{ε}(2) X 1……X i-1⇒ε, FIRST(α)=FIRST(α)∪(FIRST(X i )-{ε}) (3) X 1……X n ⇒ε FIRST(α)= FIRST(α)∪{ε}• FIRST(α) α FIRST ε, 求FIRST(α)的算法:**42例4.10 文法G[S]:S→LUL→Ui:|εU→e=i|εFIRST(U)={e,ε}FIRST(L)={e,i,ε}FIRST(S)={e,i,ε}FIRST(LU)={e,i,ε}FIRST(Ui:)={e,i}FIRST(e=i)={e} 例4.11:文法G[S]: S→Aa|d A→baS|ε FIRST(A)={ε,b} FIRST(S)={b, a, d} FIRST(Aa)={a,b}43• A A →α|β a A a A a ∈FIRST(α) a ∈FIRST(β) A →α a ∈FIRST(α) a ∈FIRST(β) A →βa ∈FIRST(α) a ∈FIRST(β) a ∈FIRST(α) a ∈FIRST(β)44• , , , FIRST(αi )∩FIRST(αj )=φ (i ≠j)• A →α1| α2|…|αn A a , – ,• ?公共左因子公共左因子45• 如何把一个文法改造成所有候选式的终结首符集两两不相交呢?• 。

相关文档
最新文档