第五章自上而下的语法分析
语法分析(自上而下分析)实验报告
实习二语法分析-自上而下分析
一、实验目的
使用预测分析方法对输入的表达式进行分析,掌握其具体的使用并且学会去分析一个文法。
二、实验内容
1.设计表达式的语法分析器算法(使用预测分析)
2.编写一段代码并上机调试查看其运行结果
三、实验要求
使用LL(1)分析算法设计表达式的语法分析器
LL(1)文法是一个自上而下的语法分析方法,它是从文法的开始符号出发,生成句子的最左推导,从左到右扫描源程序,每次向前查看一个字符,确定当前应该选择的产生式。
实现LL(1)分析的另一种有效方法是使用一张分析表和一个栈进行联合控制。
预测分析程序的总控程序在任何时候都是按STACK栈顶符号X 和当前a的输入符号行事的。对于任何(X,a),总控程序每次都执行三种可能的动作之一。
1.若X=a=“#”,则宣布分析成功,停止分析过程
2.若X=a≠“#”,则把X从STACK栈顶逐出,让a指向下一个
输入符号。
3.若X是一个非终结符,则查看分析表。
四、运行结果
(本程序只能对由'i','+','*','(',')'构成的以'#'结束的字符串进行分析)
五、源程序实现
/*LL(1)分析法源程序,只能在VC++中运行 */
#include
#include
#include
#include
char A[20];
char B[20];
char v1[20]={'i','+','*','(',')','#'};/*终结符 */
char v2[20]={'E','G','T','S','F'};/*非终结符 */
int j=0,b=0,top=0,l;/*L为输入串长度 */
第5章 语法分析(2)自下而上分析
动作
预备 读入 i1 , i1进栈 归约,Fi 归约,T F 读入* , *进栈 读入 i2 , i2进栈 归约,F i 归约,T T*F 归约,E T 读入+ , +进栈 读入 i3 , i3进栈 归约, F i 归约, T F 归约,E E+T 接受
句型和句柄
i1 * i2 + i3 F * i2 + i3 T * i2 + i3
T * F + i3 T + i3 E + i3
E+F E+T E 开始符号
回顾:
自下而上语法分析方法 --- ‚移进-归约‛法
符号栈顶 没有形成 可归约串, 决定是 形成 移进 归约
定义可归约串要解决:
1. 定义什么样的符号串是可归约串; 2. 在分析时怎样判定符号栈顶出现了可归约串; 3. 如何归约。
A
A a b b c B d e
5.1.1
归约
归约与推导关系:
推导与归约互逆关系 最右推导称为 规范推导
最右推导得到的句型称为规范句型
最左归约称为 规范归约
12
5.1.2
规范归约简述
令G是一个文法,S是文法的开始符号 短语 假定是文法G的一个句型,如果有:
S*A 且 A +
自上而下语法分析
输入串,栈和句型
由算法5.1构造的非确定的PDA的一个有趣
特性是由下面的定理表示出来的。
• 定理5.2 令(q,y,h)是某个文法G相关的 NDPDA的任意构形,其中输入串是xy,如果
(q,xy,S)├*(q,y,h)
• 那么xh是G的一个最左句型,换言之,S=* >xh(S是G的开始符号)。
• 上述定理反过来也成立:给定G中的任何句型xh,
U→ yU U → xU • 其中U是新引进的非终结符号。显然,这种 形式与原形式是等价的,即从A推出的符号串 是相同的。
• 直接左递归更一般的形式 U→ Ux1Ux2…Uxmy1y2…yn
其中,xi (i=1, 2, …, m) yi (i=1, 2, …, n), yj的头字符都不是U, xi 都不 是,则有
(3)B→(d|aBc)Bˊ
(4)Bˊ→bcBˊ|ε
5.2.4 消除所有左递归的算法
若一个文法不含形如A=+>A的推导,也不含有以ε为右部 的产生式,那么,执行下面的算法将保证消除该文法中的所 有左递归:
• U①n。将文法G的所有非终结符整理成某一顺序U1,U2,…, • ② for i:= 1 to n do
由行1
• (p,00,GGBBR) ├
或 ├(Q,001100,ε) 由行7(阻
(p,0,BGGBBR) 由行4
编译原理自上而下语法分析
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)如果想退出程序,点击““,此时会弹出提示窗口:
软件工程 编译原理 第五章 自顶向下的语法分析方法
换为等价的LL(1)形式以及如何变换是我们讨论
的主要问题。由LL(1)文法的定义可知若文法中 含有左递归或含有左公共因子,则该文法肯定不 是LL(1)文法,因而,我们设法消除文法中的左 递归,提取左公共因子对文法进行等价变换。
1、提取公共左因子
若文法中含有形如:A→αβ|αγ的产生式,这导 致了对相同左部的产生式其右部的FIRST集相交, 也就是 SELECT(A→αβ)∩SELECT(A→αγ) ≠ φ ,不满足 LL(1)文法的充分必要条件。
左递归 变 右递归
P→1P | 2P | … | nP P→1P | 2P |… | mP |
例 文法G(E): E→E+T | T T→T*F | F F→(E) | i
经消去直接左递归后变成: E→TE E→+TE | P→P1 | P2 | … | Pm | 1 | T→FT 2|…|n T→*FT | P→1P | 2P | … | nP F→(E) | i
BEGIN ADVANCE; E; IF SYM=‘)’ THEN ADVANCE ELSE ERROR END ELSE ERROR;
主程序: PROGRAM PARSER; BEGIN ADVANCE; E; IF SYM <>’#’ THEN ERROR END;
对应的递归下降子程序为:
第5章 自顶向下的语法分析方法
语法分析—自下而上分析
LASTVT(F
各种自下而上分析法的共同特点: 边输入单词符号(移进符号栈),边归约。
即:在从左到右移进输入串的过程中,一旦发现栈顶呈 现可归约串就立即进行归约。
12
5.1 自下而上分析基本问题
二.规范归约简述
1.定义:令G是一个文法,S是G的开始符号, 假定αβδ是文法G的一个句型,
即S⇒αβδ* (1)短语:若S⇒*αAδ且A⇒β+,则称β是句型αβδ相对于
3
#T *i2+i3#
4
#T* i2+i3#
动作 预备 进 归,用F→i 归,用T→F 进
25
• G(E):
E T | E+T T F | T*F F (E) | i
步骤 4 5 6 7 8 9
符号栈 #T* #T*i2 #T*F #T #E #E+
输入串 i2+i3# +i3# +i3# +i3# +i3# i3#
动作 进 进 归,用F→i 归,用T→T*F 归,用E→T 进
26
步骤 9 10 11 12 13 14
• G(E):
E T | E+T T F | T*F F (E) | i
符号栈 #E+ #E+i3 #E+F #E+T #E #E
输入串 i3# # # # # #
编译原理分知识点习题_自上而下语法分析
1. 设有文法G[S]:
S—AB
A—bB|Aa
B—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|a
j=2 时:改写文法,有
B—bBA Bb|e无左递归。
(3)所以文法G[S]消除左递归后变为:
G'[S:] S—AB
A—bBA'
A'—aA' £|
B—bBA'Bb|a
2. 设有文法G[E]:
E—Aa|Bb
A—cA|eB
B—bd 试按照递归子程序法为该文法构造语法分析程序。解:本题考查递归子程序的构造方法。
首先判断文法是否满足递归子程序法对文法的要求,然后再构造递归子程序。
因为:
( 1 ) 该文法无左递归。
(2)文法的产生式E—Aa|Bb和A—cA|eB的右部有若干选项,判断这两条产生
式右部各候选式的终结首符号集合是否两两互不相交。
对产生式E—Aa|Bb,有
FIRST(Aa) n FIRST(Bb)={c , e} n {b}= ?
对产生式A—cA|eB,有
FIRST(cA)n FIRST(eB)={c} n {e}= ? 文法中其他产生式都只有一个非空&的右部。
综合( 1)、(2),该文法可以采用自上而下分析方法进行语法分析而不会出现回朔和无限循环。
下面为该文法的每一个非终结符号构造递归子程序。
第五章自上而下语法分析
第五章⾃上⽽下语法分析
第五章⾃上⽽下语法分析
1、教学⽬的及要求:
本章介绍编译程序的第⼆个阶段语法分析的设计⽅法和实现原理,包括⾃上⽽下分析的⽆回朔的递归下降分析、 LL(1)分析法。要求理解递归下降分析、LL(1)⽂法的基本概念;掌握⽆回朔的递归下降分析的设计和实现、LL(1)分析表的构造与分析⽅法。
◇能够对⼀个给定的⽂法判断是否是LL(1)⽂法;
◇能构造预测分析表;
◇能⽤预测分析⽅法判断给定的输⼊符号串是否是该⽂法的句⼦;
◇能对某些⾮LL(1)⽂法做等价变换:
①消除左递归
②提取左公共因⼦
可能会变成LL(1)⽂法。这样可扩⼤⾃顶向下分析⽅法的应⽤。
2、教学内容:
语法分析器的功能,⾃上⽽下语法分析(递归下降分析法,预测分析程序),LL(1)分析法,递归下降分析程序构造,预测分析程序。
3、教学重点:
递归下降⼦程序,预测分析表构造,LL(1)⽂法。
4、教学难点:
对⼀个⽂法如何判断是否是LL(1)⽂法,由于在判断 LL(1)⽂法时⽤到⽂法符号串的开始符号集合(FIRST集)和⾮终结符后跟符号集合(FOLLOW集)的计算,⽽⼀般学⽣往往因概念不清或不够细⼼对这两个集合的计算常常出错,导致判断和分析结果的错误。
5、课前思考
为了了解⾃顶向下(⾃上⽽下)分析的⼀般过程和问题,请学⽣⾸先回顾本章之前介绍的有关基本概念:
◇句⼦、句型和语⾔的定义是什么?
◇什么叫最左推导?
◇什么叫最右推导和规范推导?
◇什么叫确定的⾃顶向下语法分析?
◇⾃顶向下语法分析是从⽂法的开始符号出发,反复使⽤各种产⽣式,寻找与输⼊符号匹配的推导。
编译原理-自上而下的语法分析
语法制导翻译
语法制导翻译是自上而下语法分析的核心部分,它根据源程序的语法结构,生成相应的中间代码或目 标代码。
语法制导翻译的核心思想是根据文法的产生式规则,将源程序的语法结构映射到相应的语义动作或指令。
在语法制导翻译过程中,通常使用语法分析树或抽象语法树作为中间表示,以便更方便地进行语义分析 和代码生成。
移入-规约分析算法
总结词
能够处理左递归
详细描述
移入-规约分析算法能够处理文法中的 左递归,通过将左递归转化为右递归 或循环规约操作,避免进入无限循环 。
移入-规约分析算法
总结词:效率较高
详细描述:移入-规约分析算法在处理目标语句时,每次只涉及一个字符的操作,因此效率较高。
03
自上而下语法分析的实现
预测分析算法
总结词
无法处理左递归
详细描述
预测分析算法无法处理文法中的左递归,因为左递归会导致预测分析算法进入无限循环。
递归下降分析算法
总结词:基于递归的算法 总结词:易于理解 总结词:代码冗余
详细描述:递归下降分析算法是一种自上而下的语法分 析算法,它将文法的产生式规则转化为相应的递归函数 ,通过递归调用函数来分析目标语句的语法结构。
语义分析
1
语义分析是编译过程中的重要步骤,它对源程序 的语义进行静态检查,确保其合法性和正确wk.baidu.com。
第五章 语法分析(自上而下分析法)
例 考虑文法G(S)
S→Qc|c Q→Rb|b R→Sa|a
令它的非终结符的排序为R、Q、S。 Q的规则变为 Q→Sab | ab | b 现在的Q不含直接左递归,把它代入到S的有 关候选后,S变成 S→Sabc | abc | bc | c
例 考虑文法G(S)
S→Qc|c Q→Rb|b R→Sa|a
S A * S A * y y
③回溯,注销掉A子树,并把IP 回退到进入A前的位置,然后 取出A的第二个候选。此时匹 配获得成功。IP向前移动到下 一个符号。
x*y IP x*y IP x x
S A S A * y y
④下面该对S的第三个子结点y进行 匹配。由于这个子结点和最后一 个输入符号相符,所以,就完成 了为a构造语法树的任务。
一、 语法分析器的任务与分类
1.语法分析的任务 在词法分析识别出单词符号的基础上,分析判定程序 的语法结构是否符合语法规则。 对于任意给定的w∈VT*,判断w ∈L(G) 语言的语法结构是用上下文无关文法描述的,因此语 法分析器的工作本质上就是按文法的产生式识别输 入串是否为一个句子。这里所说的输入串是指由单 词符号组成的有限序列。
ห้องสมุดไป่ตู้
用 α 1 ⇒ α n 表示:从α1出发,经过0步或若 干步,可以推出αn。 所以 : α ⇒ β 即 α = β
*
*
语法分析自下而上分析
显然这是一个最右推导。
规范归约是关于是一个最右推导的逆过程
最左归约
规范推导
由规范推导推出的句型称为规范句型。
.
5.2 算符优先分析
四则运算的优先规则:
先乘除后加减,同级从左到右
考虑二义文法文法G(E): G(E): E i| E+E|E-E|E*E|E/E|(E)
它的句子有几种不同的规范规约。 归约即计算表达式的值。归约顺序不同,
.
从算符优先文法G构造优先关系表的算法。
通过检查G的每个产生式的每个候选式,可 找出所有满足a b的终结符对。
首先需要对G的每个非终结符P构造两个集合 FIRSTVT(P)和LASTVT(P):
F I R S T V T ( P ) { a |P a , 或 P Q a , a V 而 Q V }
.
如果把这个算法稍为形式化一点,我们 可得如下所示的一个程序(包括一个过程 和主程序):
PROCEDURE INSERT(P,a); IF NOT F[P,a] THEN BEGIN
F[P,a]:=TRUE; 把(P,a)下推进STACK栈 END;
.
主程序:
BEGIN
FOR 每个非终结符P和终结符a DO F[P,a]:=FALSE;
IF in-2且Xi和Xi+2都为终结符 但Xi+1为非终结符 THEN 置Xi Xi+2;
第五章自顶而下语法分析方法课外训练
第五章自顶而下语法分析方法
(一)内容
本章介绍编译程序的第二个阶段语法分析的第一种设计方法和实现原理即自上而下分析的原理及无回朔的递归下降分析、 LL(1)分析法和相应程序构造。
(二)本章重点
自上而下分析的思想,LL(1)文法,LL(1)预测分析,递归下降分析程序的构造。
(三)本章难点
消除左递归,预测分析表的构造,求First集和Follow集,预测分析中的出错处理。(四)本章考点
LL(1)文法的判定。
递归下降分析程序的构造。
预测分析程序的构造与分析方法。
(五)学习指导
理解自上而下分析面临的问题,理解递归下降分析、LL(1)文法,掌握无回朔的递归下降分析方法的设计和程序实现、LL(1)分析表的构造与分析方法。语法分析是在词法分析的基础上判定程序的语法结构是否符合语法规则的过程。词法分析器的构造技术是编译器的主要技术。词法分析分为自上而下的分析(LL(K))和自下而上的分析(算符优先、LR(K))。本章先学习在逻辑概念上易于接受的自上而下的分析,即从文法开始符号出发,自上而下地为输入串建立一棵语法树,或者说为输入串寻找一个最左推导。LL(1)分析法是本章的学习重点。
附训练试题:
1试构造与下列文法G[S]等价的无左递归文法。
G[S]: S→Sa|Nb|c (1)
N →Sd|Ne|f
2:文法G的规则集为;
P →begin d : X end
X →d : X | sY
Y→: sY | e
做出该文法LL(1)分析表。
3 设有以下文法:
G[S]: S→eEfGh | g
E→FSG | h
F→SEc | cG | ε
第5章自顶向下语法分析方法
示例
【例4.1】设有以下文法G1[S]: S→aAB A→bA|c B→dBe|de 输入串abbcde的最左推导如下: S aAB abAB abbAB abbcB abbcde 因此,输入串abbcde是该文法G1的句子。
下面从建立语法树来 S 看句子的推导过程。 为了自顶向下地构造 a A B 输入串 abbcde 的语法 树,首先按文法的开 A d 始符号产生根节点 S , b 再根据产生式规则自 b A 顶向下地生长这棵语 法树。语法树的建立 过程如图所示。
最左推导 过程 1 S
2 aAB
所选产生式
输入串
acbad#
(当前要替换的非 终结符,输入符)
(S,a) (A,c)
S→aAB
acbad#
3 acAB
4 acbBB 5 acbaB 6 acbad
A→cA
A→bB B→a B→d
acbad#
acbad# acbad# acbad#
自顶向下分析法中存在的问题
回溯问题 左递归问题
回溯问题
回溯时需要恢复到出错点位置,删去曾 经匹配过的符号,还包括一些语义处理。 因此处理回溯是一项复杂的工作,在回 溯时,要清除在回溯之前编译程序所做 的大量记录工作,然后重新开始记录, 这就降低了语法分析的效率。避免回溯 是自顶向下语法分析中需要解决的问题 之一。
第5章自上而下语法分析
5.1 5.2 5.3 5.4 5.5
消除左递归方法 LL(k)文法的判别 确定的LL(1)分析器的构造 递归下降分析程序及其设计 带回溯的自上而下分析方法
1
语法分析概述
功能:根据文法规则,从源程序单词符号串中
识别出语法成分,并进行语法检查。
基本任务:识别符号串S是否为某语法成分 两大类分析方法:
R→Sa|a
Q→Sab|ab|b
4.把Q代入S的右部选择 5.消除S的直接左递归
最后得到文法为:
S→Sabc|abc|bc|c S→(abc|bc|c)S‟ S‟ →abc S‟|ε S→(abc|bc|c)S‟ S‟ →abc S‟|ε Q→Sab|ab|b R→Sa|a
15 15
最后得到的文法: S→(abc|bc|c)S‟ S‟ →abc S‟|ε Q→Sab|ab|b R→Sa|a
消 除 所 有 左 递 归 的 算 法
14
例:文法G[s]为 S →Qc|c Q →Rb|b R →Sa|a
非终结符顺序 重新排列
R→Sa|a Q→Rb|b S→Qc|c
该文法是无直接左递归,但有间接左递归 SQc Rbc Sabc ∴S+ Sabc
1.检查规则R是否存在直接左递归
2.把R代入Q的有关选择,改写规则Q 3.检查Q是否直接左递归
编译原理作业集-第五章-修订
第五章语法分析—自下而上分析
本章要点
1. 自下而上语法分析法的基本概念:
2. 算符优先分析法;
3. LR分析法分析过程;
4. 语法分析器自动产生工具Y ACC;
5. LR分析过程中的出错处理。
本章目标
掌握和理解自下而上分析的基本问题、算符优先分析、LR分析法及语法分析器的自动产生工具YACC等内容。
本章重点
1.自下而上语法分析的基本概念:归约、句柄、最左素短语;
2.算符优先分析方法:FirstVT, LastVT集的计算,算符优先表的构造,工作原理;3.LR分析器:
(1)LR(0)项目集族,LR(1)项目集簇;
(2)LR(0)、SLR、LR(1)和LALR(1)分析表的构造;
(3)LR分析的基本原理,分析过程;
4.LR方法如何用于二义文法;
本章难点
1. 句柄的概念;
2. 算符优先分析法;
3. LR分析器基本;
作业题
一、单项选择题:
1. LR语法分析栈中存放的状态是识别________的DFA状态。
a. 前缀;
b. 可归前缀;
c. 项目;
d. 句柄;
2. 算符优先分析法每次都是对________进行归约:
(a)句柄(b)最左素短语(c)素短语(d)简单短语
3. 有文法G=({S},{a},{S→SaS,S→ε},S),该文法是________。
a. LL(1)文法;
b.二义性文法;
c.算符优先文法;
d.SLR(1)文法;
4. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,和LL(1)分析法属于自顶向下分析;
a. 深度分析法
b. 宽度优先分析法
c. 算符优先分析法
d. 递归下降子程序分析法
编译原理-自上而下语法分析
若一个文法G满足以上条件,则称G为LL(1)文法
4.3.4 LL(1)分析条件(三)
LL(1)的含义
第一个L 从左至右扫描输入串 第二个L 最左推导 1 分析时每一步只需向前查看一个符号
对于一个LL(1)文法
可以对其输入串进行有效的无回溯的自上而下
分析
4.3.4 LL(1)分析条件(四)
4.3.2 左递归的消除(六)
例4.3 考虑文法G(S) S→Qc|c Q→Rb|b R→Sa|a
令它的非终结符的排序为R、Q、S 对于R,不存在直接左递归 把R代入到Q的有关候选后,把Q的规则变为
Q→Sab | ab | b 现在的Q不含直接左递归 把Q代入到S的有关候选后,S变成 S→Sabc | abc | bc | c
4.4 递归下降分析程序构造
语法分析器的功能 自上而下分析面临的问题 LL(1)分析法 递归下降分析程序构造
递归下降分析器 扩充的巴科斯范式
语法图
预测分析程序 LL(1)分析中的错误处理
4.4.1 递归下降分析器
递归下降分析器
当文法满足LL(1)条件时,构造不带回溯的自
假定关于非终结符P的规则为
P→P |
其中不以P开头
那么,我们可以把P的规则等价地改写为如下
的非直接左递归形式: P→P P→P|
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.2 LL(1) 文法的判别
判断某一文法是否是LL(1)文法的步骤
1、求出文法中所有能推出的非终结符号; 2、计算文法中每一个产生式右部符号串的FIRST集; 3、计算文法中每一个非终结符号的FOLLOW集; 4、根据定义计算文法中每一个产生式的SELECT集; 5、计算文法中具有相同左部产生式的SELECT集的交集, 根据LL(1)文法定义确定该文法是否为LL(1)文 法。 补充例:
对给定的文法,求其非终结符A的集合follow(A),
应用下列规则,直到follow(A)不能再加入任何终结
符号为止。 (1)若A是开始符号,则输入符号的结束标志 #∈follow(A)。 (2)如果存在产生式B→Aβ,则把first(β)除ε之外
的所有符号加入follow(A)。
(3)如果存在产生式B→A或 B→Aβ,且first(β) 包含ε,即β ε,则把 follow(B) 加入 follow(A)。
自顶向下语法分析
文法有0—3型,语法分析方法有两种: 自顶向下和自下而上 自顶向下分析过程: 为输入串从开始符 开始构造语法树从文法开始符出发向 下推导,推出句子。
5.1 确定的自顶向下分析
见例5.1
输入串: W=pccadd
文法:
S→ p A S→ q B
A→ c A d
A →a
特点:1,产生式右部由终 结符开始; 2,相同左部的产生式其 右部由不同终结符开始
把first(y2)加入first(X)。
后跟符号集的定义:
设G=(VN、VT、P、S)是上下文无关文法, AVN ,S是开始符号,则文法符号A的后跟符 号集为: FOLLOW(A) ={a|S * A 且 aVT,aFIRST(), VT*,V+ } * A,且 * ,则# FOLLOW(A) 若S
首符号集的定义:
设G=(VN、VT、P、S)是上下文无关文法, 则该文法的符号串的开始符号集为:
FIRST( )={a|
若
*
*
a,aVT,、V*}
,则 FIRST( )
设α是文法G的任一符号串,定义α的首符号集 first(α)是由α推导出来的串中作为第一个符号的 所有终结符的集合;如果α*ε ,则ε ∈ first(α )。
递归下降分析法是直接以程序的方式模拟
产生式产生语言的过程。它为每一个非终结符构造一个子程 序,每一个子程序的过程体中按该产生式的候选项分情况展 开,遇到终结符直接匹配,而遇到非终结符就调用相应非终 结符的子程序。该分析从调用文法开始符号的子程序开始, 直到所有非终结符都展开为终结符并得到匹配为止。若分析
3)去掉无用产生式
5.4 不确定的自顶向下分析
由于相同左部的产生式的右部First集 交集不为空而引起回溯 由于相同左部非终结符的右部能* 且该非终结符Follow集中含有其右部 First集的元素。 由于文法含有左递归而引起回溯
5.5 确定的自顶向下分析
递归子程序法 预测分析法
E→TE' E'→+TE'∣ε T→FT' T'→FT'∣ε F→(E)∣i
设A为一个非终结符号,定义A的后随符号集follow(A)为任 意句型中紧跟在A之后出现的所有终结符号的集合。
补充定义:
即:若存在推导S * Aaβ, 、β是任意语
法符号串,follow(A)为所有可能的终结符号a 的集合。应该注意,在推导过程中,在A和a之 间可能出现其它符号串γ,但推导的结果 γ * ε,这样,仍然有a ∈follow(A)。
5.3 非LL(1)文法的等价变换
提取左公共因子 文法中,如果同一非终极符的不同可选 右部包含相同的前缀,则在最左推导过 程中,对同一输入符号不能唯一地确定 应该使用的产生式,于是只能尝试,造 成回溯
wenku.baidu.com
结论
产生式中含有左递归的文法不是LL(1) 文法 相同左部的产生式中含有左公共因子的文 法不是LL(1)文法
特点:1,产生式右部不全由终结符 开始;
2,相同左部的产生式其右部由不同 终结符或非终结符开始;
3,文法无空产生式
产生式右部串的第一个符号
即fristα
需要看后 跟符号即 follow
自顶向下分析总是根据当前句型中的符 号和当前输入的符号决定下一步应执行的分 析动作。如果句型中当前为终结符且与输入 符号匹配,则读下一个输入符号;如果当前 为非终结符号,则根据输入符号选择该非终 结符的一个产生式进行下一步推导,为了分 析方便,能够对输入串确定句型所选择的产 生式需要定义两个集合:即文法符号串的首 符号集First和非终结符的后跟符号集Follow。
递归子程序法:
递归下降分析法是确定的自上而下分析法.这种分析 法要求文法一定是LL(1)的。 它的基本思想是:对文法中的每个非终结符编写一个 函数(或子程序),每个函数的功能是识别由该非终结 符所表示的语法成分。由于描述语言的文法常常是 递归定义的,因此相应的这组函数必然以相互递归的 方式进行调用,将此种分析法称为递归下降分析法。
左公共因子
一般地如有产生式: A 12 … n
当输入符号为从推导出来的非空串时,则不能立即决定 使用产生式 A 1 ,还是2 …,在此情况下,为了避免回 溯,把产生式改写为:
A A A 1 2 … n
其中称为左公因子。于是,对当前非终极符A若输入为 中推导出来的串,则唯一地使用产生式A A。
式,对某一个i若有Y1Y2...Yi-1*ε ε 加入first(X)。
且a∈first(Yi),
则a∈first(X);如果ε ∈first(Yj),j=1,2,…k,则把 例如,first(Y1)中的每个元素都属于first(X);如果Y1
不能推导出ε ,则first(X)=first(Y1); 如果Y1*ε ,则
A1 A 2A … m Aε
回溯:回溯是指否定前面的工作而退回到某环 节重新做起。
消除左递归
消除直接左递归 消除间接左递归 消除文法中所有左递归
如何消除一个文法的一切左递归呢?如果一 个文法不含回路(形如AA的推导),且产生式的右 部也不含ε的候选式,那么,下述算法将消除文 法的左递归: (1) 将文法G[S]的所有非终结符按一给定的 顺序排列:A1、A2、…、An ; (2) 执行下述循环语句将间接左递归改为直 接左递归: for (i=1;i<=n;i++) for (j=1;j<=i−1;j++)
选用集定义如下:
1)若 ,且不存在推导 +,则产生式A
的选用集select(A )= first()
2) 若 ,但存在推导 +, 则产生式A
的选用集select(A )= first() ∪follow(A)
3) 若 = ,即产生式为A , 则其选用集
过程中达到这一步则表明分析成功,否则表明输入中有语法
错误。递归下降分析对文法的限制是不能有公共左因子和左 递归。
构造递归下降分析程序:
构造递归下降分析程序时,每个函数名是相应的非 终结符,函数体则是根据规则右部符号串的结构编 写。 当遇到终结符a 时,则编写语句 if (当前读来的输入符号==a) 读下一个输入符号; 当遇到非终结符A 时,则编写语句调用A(); 当遇到A →ε规则时,则编写语句 if (当前读来的输入符号 FOLLOW(A) ) error() ; 当某个非终结符的规则有多个候选式时,按LL(1) 文法的条件能唯一地选择一个候选式进行推导。
求首符号集: 即:为了求出给定文法关于符号X 的首符号集first(X),应用下列规 则,直到再没有任何终结符号或 ε能加到该首符号集为止。
补充定义:
(1)如果X是终结符,则first(X)={X}。
(2)如果X→ε 是一个产生式,则ε ∈ first(X)。 (3)如果X是非终结符,并且X→Y1Y2...YK 是一个产生
选择集合SELECT:
给定上下文无关文法的产生式A ( AVN, V* ),
若
若
*
*
,则SELECT( A )= FIRST( )
,则SELECT( A )=
(FIRST( )\{})∪ FOLLOW(A)
即设 A → 是文法G的任意产生式,该产生式的
关于E'的产生式:E'→+TE'∣ε 即E'有两个候选;第一个候选的开头终结符为+,第二 个候选为ε。这就是说,当E'面临输入符号“+”时就令 第一个候选进入工作,而当面临任何其它符号时,E' 就自动认为获得了匹配。递归函数E'就是根据这一原 则设计的。 例如,我们将递归函数的调用以栈的形式模拟来 分析输入串 # i1*(i2+i3)# 的语法分析过程;在此, “#”为输入串i1*( i2+i3)的分隔符。进行语法分析时, 首先将“#”和文法开始符E压入栈中,当语法分析进行 到栈中仅剩“#”而输入串扫描指针已指向输入串尾部 的“#”时,则语法分析成功,分析过程如下图所示。
左递归
对文法中一切左递归的消除要求文法中不含回 路即无A+ A的推导。满足这个要求的充分
条件是:文法中不包含形如A A 的有害规则
和 A 的空产生式.
左递归
直接左递归的形式为: A A1 A2 … Am12… n
消除左递归后可改写为:
A1 A 2 A … n A
第五章 自顶向下语法分析
本章内容:从识别符号出发,不断建立直接推导,试图 构造一个推导序列,最终由它推导出与输入符号串相同 的符号串。从语法树的角度看,自顶向下分析过程是以 识别符号为根结点,试图向下构造一棵语法树,使其末 端结点符号串正好与输入符号串相同。 基本知识点:自上而下语法分析的基本思想和面临的问 题,消除左递归的方法,避免回溯对文法的要求,递归 子程序法,LL(1)分析法。 重点:消除左递归的方法,递归子程序的构造方法, LL(1)文法,LL(1)分析表的构造方法。 难点:符号串的FIRST集合的求法,文法非终结符号 FOLLOW集合的求法以及LL(1)分析,表的构造。
{ 把一个形如:
A i → A j γ∣ β 1 ∣ β 2 ∣ … ∣ β n A j→ δ 1 ∣ δ 2 ∣ … ∣ δ k
的产生式改写为: Ai→δ1γ∣δ2γ∣…∣δkγ∣β1∣β2∣…∣βn ; 按消除直接左递归的方法消除Ai 的直接左递归; } (3) 化简由(2)所得的文法,即去掉那些从开始符号S 出发,在推导中无法出现的非终结符的产生式(去掉多 余产生式)。
消除文法中一切左递归的算法:
算法步骤:
1)把文法的所有非终结符按某一顺序排列;如A1,A2,…An
2)从A1开始消除左部为A1的产生式的直接左递归,然后把 左部为A1的所有规则的右部逐个替换左部为A2右部以A1开 始的产生式中的A1,并消除左部为A2的产生式中的直接左 递归。继而以同样方式把A1,A2的右部代入左部为A3右部 以A1或A2开始的产生式中,消除左部为A3的产生式之直接 左递归,直到把左部为A1,A2,…A n-1的右部代入左部为 A n的产生式中,从A n中消除直接左递归。
递归下降分析:
文法的扩展BNF表示(Extended BNF, EBNF)的产生式事实上已经可以被看作 是程序的抽象。用某种程序设计语言表 示出来,并且加上适当的数据结构与基 本函数,就形成了非终结符的递归下降 子程序。
例:对文法:
递 归 下 降 分 析 程 序
Sym:输入串指 针IP所指符号; Advance:把IP 调至下一个输 入符号; Error:出错诊 断程序
select(A )= follow(A)
LL(1)文法的定义
一个上下文无关文法是LL(1)文法的充 要条件是:
对每个非终结符A的两个不同产生式, A
A ,满足 SELECT(A)∩ SELECT(A )= ,其中、 不能同时 *
即关于任一非终结符的不同产生式其选用集 互不相交,则称G为LL(1)文法。