编译原理(3)语法-4(自顶向下语法分析:LL(1)分析法)
3、若有产生式A →…B,如果存在…Aa…的符号串,可推导得 到…Ba…,因此在这种情况下有FOLLOW(A)⊂FOLLOW(B)
3.3 自顶向下的语法分析
– 关于FIRST与FOLLOW 1、构造FIRST集和FOLLOW集的过程有可能要反复进行多次, 直到每一个非终结符的FIRST集和FOLLOW集都不再增大为止。 2、FIRST集确定了每一个非终结符在扫描输入串时所允许遇到 的输入符号及所应采用的推导产生式(该非终结符所对应的产生 式中的哪一个候选式) 3、FOLLOW集是针对文法中形如“A→ε”这样的产生式的,即 在使用A的产生式进行推导时,面临输入串中哪些输入符号时有 一空字(即ε)匹配而不出错;当然,此时的扫描指针仍指向当前 扫描的输入符号,并不向前推进
重点掌握 LL(1)分析器工作原理 LL(1)分析表的构造 FIRST集合、FOLLOW集合
3.3 自顶向下的语法分析
3.3.2 LL(1)分析法 LL(1)分析法又称预测分析法,是一种不带回溯的非递归自顶 向下分析法。 LL(1)的含义是:第一个L表明自顶向下分析是从左至右扫描 输入串的;第二个L表明分析过程中将用最左推导;“1”表 明只需向右查看一个符号就可决定如何推导(即可知用哪个产 生式进行推导) 类似地,也可以有LL(k)文法,也就是向前查看k个符号才能 确定选用哪个产生式,不过LL(k)(k>1)在实际中极少使用。
(3) 分析表用一个矩阵(或二维数组)M表示,它概括了相应文法 的全部信息。矩阵的每一行与文法的一个非终结符相关联,而 每一列与文法的一个终结符或界符“#”相关联。对M[A, a]来说, A为非终结符,而a为终结符或“#”。分析表元素M[A, a]中的内 容为一条关于A的产生式,表明当A面临输入符号a时,所应该 采用的候选式。
B
B → dB'
B'
B' → bB' B' → ε
[解答] 输入串aadl按控制程序进行的分析过程如表3.2所示。
课本例题3.7
3.3 自顶向下的语法分析
2、LL(1)分析表的构造
– 在表驱动的LL(1)分析器中,除了分析表因文法的不同而异之 外,分析栈、控制程序都是相同的。因此,构造一个文法的表 驱动LL(1)分析器实际上就是构造该文法的分析表。
西北农林科技大学本科教程
第7讲
主讲教师:赵建邦
第三章 语法分析
3.1 文法和语言 3.2 推导与语法树 3.3 自顶向下的语法分析 3.4 自底向上的语法分析 3.5 规范规约的自底向上语法分析方法
本讲目标
第三章《语法分析》 3.3 自顶向下的语法分析 递归下降分析法(上一讲内容) LL(1)分析法
3.3 自顶向下的语法分析
* *
3.3 自顶向下的语法分析
– FIRST集合构造方法
对文法中的每一个非终结符X构造FIRST(X),其方法是连续使 用下述规则,直到每个集合的FIRST不再增大为止。(注:对终 结符a而言,FIRST(‘a’)={a},因而无需构造。)
① 若有产生式 X→a…,且a∈VT,则把a加入到FIRST(X)中; 若存在X→ε,则将ε也加入到FIRST(X)中;
3.3 自顶向下的语法分析
1、表驱动的LL(1)分析器
– LL(1)分析法的基本思想
根据输入串的当前输入符号来惟一确定选用某条规则(产生
式)进行推导;当这个输入符号与推导第一个符号相同时,再取
输入串的下一个符号,继续确定下一个推导应选的规则;如此
下去,直到推导出被分析的输入串为止。
举例:G[A]:A →aBc B → bB | d
3.3 自顶向下的语法分析
– FOLLOW集合构造方法 对文法G[S]的每个非终结符A构造FOLLOW(A)的方法是连续使 用下述规则,直到每个FOLLOW不再增大为止。 ① 对文法开始符号S,置 # 于FOLLOW(S)中(由语句括号“#S#” 中的S# 得到)。 ②若有A→αBβ(α可为空),则将FIRST(β)\{ε}加入到FOLLOW(B) 中;
由F→(E)知FIRST(‘)’) ⊂ FOLLOW(E), 即FOLLOW(E) = {),#};
课本例题3.8
G[E]: E→TE' E'→ + TE' | ε T→FT' T'→*FT' | ε F→(E) | i
③由E→TE' 知FOLLOW(E) ⊂ FOLLOW(E' ), 即FOLLOW(E' ) = {),#};
3.3 自顶向下的语法分析
– 构造分析表M ① 对文法G[S]的每个产生式A→α执行以下②、③步。 ② 对每个终结符a∈FIRST(A),把A→α加入到M[A, a]中,其中 α为含有首字符a的候选式或为惟一的候选式。 ③ 若ε∈FIRST(A),则对任何属于FOLLOW(A)的终结符b,将 A→ε加入到M[A, b]中。 ④ 把所有无定义的M[A, a] 标记为“出错”。
图3-15 LL(1)分析器
1、表驱动的LL(1)分析器
(1) 输入串是待分析的符号串,它以界符“#”作为结束标志。 (注:#∈VT但不是文法符号,是由分析程序自动添加的。)
(2) 分析栈中存放分析过程中的文法符号。分析开始时栈底先 放入一个“#”,然后再压入文法的开始符号;当分析栈中仅 剩“#”,输入串指针也指向串尾的“#”时,分析成功。
课本例题3.8 最后得到文法G[E]的LL(1)分析表如表3.3所示。
表3.3 例3.8的LL(1)分析表
i
+
*
(
)
#
E E→TE'
E→TE'
E'
E'→+TE'
E'→ε E'→ε
T T→FT'
T→ε
T'→*FT'
T'→ε T'→ε
F
F→i
F→(E)
课本例题3.9
例3.9 程序语言中if-else语句的文法G[S]为
M[A, a] 中的产生式右部符号串按逆序逐一压入栈中;如果M[A, a] 中的产生式为A→ε,则只将A自栈顶弹出。
ii.若M[A, a] 中为空,则发现语法错误,调用出错处理程序 进行处理。
1、表驱动的LL(1)分析器
控制程序描述如下:
将“#”和文法开始符依次压入栈中;
把第一个输入符号读入a;
do{
把栈顶符号弹出并放入x中;
if(x∈VT) { if(x==a) {
if(a!=‘#’) 将下一输入符号读入a;
}
else error( ); // 字符串不匹配,语法错误
} else if(M[x,a]=″x→y1y2…yk″) { 按逆序依次把yk、yk−1、…、y1压入栈中; 输出″x→y1y2…yk″; // 显示当前分析所使用的规则
}
else error( );
// 分析表中没有当前产生式,语法错误
} while(x!= ″#″)
课本例题3.7
例3.7 一文法的LL(1)分析表如表3.1所示,试给出输入串aadl的 分析过程。
表3.1 例3.7的LL(1)分析表
a
b
l
d
#
A
A → aA'
A'
A' → ABl
A' → ε
A' → ε
课本例题3.9
G'[S]:S → iESS'| a S' → eS | ε E → b
(2) FIRST集构造: FIRST(S)={i, a};FIRST(S')={e, ε};FIRST(E)={b}。
(3) FOLLOW集构造: ① FOLLOW(S)={#}; ② 由S→…ES… 知FIRST(S)\{ε}⊂FOLLOW(E),即
由E→TE ' 且E ' → ε知FOLLOW(E)FOLLOW(T),即 FOLLOW(T) = {+,),#};
由T→FT ' 知FOLLOW(T)FOLLOW(T‘), 即FOLLOW(T ') = {+,),#};
由T→FT ' 且T ' → ε知FOLLOW(T)FOLLOW(F), 即FOLLOW(F) = {*,+,),#};
– 为了构造分析表M,需要预先定义和构造两族与文法有关的集 合FIRST和FOLLOW
– 关键概念之1:FIRST集合 假定α是文法G[S]的任一符号串(α∈(VT∪VN)*),可定义
FIRST(α) = {a | α * a…, a∈VT}
如果 α * ε,则规定ε ∈FIRST(α)。
也即, FIRST(α)是α的所有可能推导的开头终结符或可能的ε。
G[S]: S → iESeS | iES | a
E → b 其中,e(else)遵从最近匹配原则。试改造文法G[S]并为之构造 LL(1)分析表。
[解答] (1)提取公共左因子后得到文法G‘[S]:
G '[S]: S → iESS' | a
S' → eS | ε
E → b
求出每个非终结符的FIRST集和FOLLOW集。
3.3 自顶向下的语法分析
《编译原理》考试题
《编译原理》考试题一、选择题:(每题2分,共20分)1.文法G所描述的语言是的集合。
A)文法G的字汇表V中所有符号组成的符号串B)文法G的字汇表V的闭包V*中的所有符号串C)由文法的识别符号推出的所有符号串D)由文法的识别符号推出的所有终结符号串2.设有文法G[S]=({b},{S,B},S,{S→b|bB,B→bS}),试问该文法所描述的语言是。
A)L(G[S])={b i|i≥0} B)L(G[S])={b2i|i≥0}C)L(G[S])={b2i+1|i≥0} D)L(G[S])={b2i+1|i≥1}3.一个句型中的最左称为该句型的句柄。
A)短语B)简单短语C)素短语D)终结符号4. 正则文法能产生下面的语言:L={a n b n|n≥1}。
A)存在一个B)存在多个C)不存在D)无法判断5.编译程序中的语法分析器接受以为单位的输入,并产生有关信息供以后各阶段使用。
A)表达式B)产生式C)单词D)语句6.编译方法中,自顶向下的语法分析方法有。
A)简单优先分析方法B)算符优先分析方法C)SLR方法D)LL(1)分析方法7.简单优先分析法每次都是对进行归约。
A)最左短语B)简单短语C)句柄D)最左素短语8.LR语法分析栈中存放的状态是识别的DFA状态。
A)前缀B)可归前缀C)项目D)句柄9.表达式-(a+b)/(c-d)-(a+b*c)的逆波兰表示是(@代表单目运算-)。
A)ab+cd-/@bc*a+- B)ab+/cd@bc*a+--C)ab+@cd-/abc*+- D)ab+cd-/abc*+@-10.乔姆斯基(Chomsky)把文法分成四种类型,即0型、1型、2型和3型。
其中,3型文法是。
A)上下文无关文法B)上下文有关文法C)正则文法D)短语文法二、填空题:(每空1分,共20分)1.假设G是一个文法,S是文法的开始符号,如果S *x,则称x是。
2.已知文法G[E]:E→E+T|T,T→T*F|F,F→(E)|i;该文法的开始符号是,终结符号集合V T是,非终结符号集合V N 是,句型T+T*F+i的短语有T+T*F+i,第一个T,T*F和。
编译原理语法分析-自顶向下
实例分析
1
子规则匹配
根据语法规则,递归地匹配输入的源代码,构建语法树。
2
构建语法树
通过逐步匹配子规则,将语法树逐渐构建起来,形象地表示复杂的程序结构。
3
解释分析结果
对语法树进行解释,执行语义分析和生成中间分析方法,通过递归嵌套和预测分析,将复杂的源代码转换成易于处理的 语法树。
自顶向下分析算法
1 概述
自顶向下分析算法从目标语言的最高级别规则开始,逐步向下查找并匹配规则,构建语 法树。
2 递归下降分析
递归下降分析是自顶向下分析的一种常见方法,它通过递归调用子规则来分析输入的源 代码。
3 LL(1)分析
LL(1)分析是一种基于预测的自顶向下分析方法,它使用一个预测分析表来确定下一步要 采取的动作。
编译原理语法分析-自顶 向下
语法分析是编译器的重要组成部分,它负责将输入的源代码转换成语法树以 进行后续分析和解释。本节将介绍自顶向下的语法分析算法及其挑战。
语法分析概述
1 什么是语法分析
语法分析是编译器的第二个阶段,负责验证 输入的源代码是否符合语言的规范语法。
2 为什么需要语法分析
语法分析可以检查和纠正源代码中的语法错 误,以确保程序的正确性和可读性。
问题和挑战
1 二义性文法
当文法存在多个解释时,会导致语法分析的 困扰和歧义。需要通过合适的方法解决二义 性。
2 左递归文法
左递归文法会导致递归下降分析算法进入无 限循环,需要通过消除左递归来解决。
改进方法
1 消除二义性文法
通过重写或修改文法规则,消除存在二义性 的产生式。
2 消除左递归文法
通过改写产生式,消除文法中的左递归问题, 使得递归下降分析算法不会陷入无限循环。
《编译原理》课后习题答案
第7 题证明下述文法G[〈表达式〉]是二义的。
〈表达式〉∷=a|(〈表达式〉)|〈表达式〉〈运算符〉〈表达式〉〈运算符〉∷=+|-|*|/答案:可为句子a+a*a 构造两个不同的最右推导:最右推导1 〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉a=>〈表达式〉* a=>〈表达式〉〈运算符〉〈表达式〉* a=>〈表达式〉〈运算符〉a * a=>〈表达式〉+ a * a=>a + a * a最右推导2 〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉〈运算符〉a=>〈表达式〉〈运算符〉〈表达式〉* a=>〈表达式〉〈运算符〉a * a=>〈表达式〉+ a * a=>a + a * a第8 题文法G[S]为:S→Ac|aB A→ab B→bc该文法是否为二义的?为什么?答案:对于串abc(1)S=>Ac=>abc (2)S=>aB=>abc即存在两不同的最右推导。
所以,该文法是二义的。
或者:对输入字符串abc,能构造两棵不同的语法树,所以它是二义的。
第9 题考虑下面上下文无关文法:S→SS*|SS+|a(1)表明通过此文法如何生成串aa+a*,并为该串构造语法树。
(2)G[S]的语言是什么?答案:(1)此文法生成串aa+a*的最右推导如下S=>SS*=>SS*=>Sa*=>SS+a*=>Sa+a*=>aa+a*(2)该文法生成的语言是:*和+的后缀表达式,即逆波兰式。
第10 题文法S→S(S)S|ε(1) 生成的语言是什么?(2) 该文法是二义的吗?说明理由。
答案:(1)嵌套的括号(2)是二义的,因为对于()()可以构造两棵不同的语法树。
第11 题令文法G[E]为:E→T|E+T|E-T T→F|T*F|T/F F→(E)|i证明E+T*F 是它的一个句型,指出这个句型的所有短语、直接短语和句柄。
国开电大 编译原理 实验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.SLR(1)分析法是一种规范归约分析法。
()2.算符优先文法可以是二义性文法。
()3.每个短语都是某规则的右部。
()4.语法分析时必须先消除文法中的左递归。
()5.如果两个正规式是等价的,则它们所表示的正规集相同。
()()1.编译程序的输入是高级语言程序,输出是机器语言程序。
()2.文法G[S]:S→iSeS|iS|i是二义文法。
()3.若一个语言的句子有无穷多个,则对应的文法必定是递归的。
()4.上下文无关文法可以产生语言L={a n b n a m b m | n,m≥0}。
()5.设文法G[N]:N→ND|D,D→0|1|2|3|4|5|6|7,则句子3247的最右推导为:N=>ND=>N4=>ND4=>N74=>ND74=>N274=>D274=>3274。
()6.每一个NFA都对应有唯一的一个最小化的DFA。
()7.文法G[S]:S→(S)S|ε不是LL(1)文法。
()8.若文法任一产生式的右部不含两个相继的非终结符(…QR…),则称该文法为算符文法。
()9.优先函数是唯一的,有的优先关系矩阵不存在对应的优先函数。
()10.在LR(1)分析法中,搜索符仅对规约项目才有意义。
1、文法规则的左部就是非终结符号。
2、乔姆斯基定义1型文法对规则的限制比2型文法对规则的限制要多一些。
3、LR(K)分析法能彻底解决冲突。
4、一个程序是正确的是指该程序的语法是完全正确的。
5、每一个编译程序都由完成词法分析、语法分析、语义分析、代码优化和代码生成工作的五部分程序组成。
6、多遍扫描的编译程序优于单遍扫描的编译程序。
7、每个句子都有规范推导;每个句型都有规范推导。
8、存在这样一些语言,它们能被确定有限自动机(DFA)识别,但不能用正规表达式表示。
9、每一个NFA都对应有唯一的一个最小化的DFA。
10、若给定文法G和某个固定的k,则G是否是LR(k)文法是可判定的。
软件工程 编译原理 第五章 自顶向下的语法分析方法
例:文法G(E):
E→TE E→+TE | T→FT PROCEDURE F; T→*FT | IF SYM=‘i’ THEN ADVANCE F→(E) | i ELSE 对应的递归下降子程序为: IF SYM=‘(’ THEN
其中不以P开头。
可以把P的规则等价地改写为如下的非直接左递归 形式: 左递归变 P→P 右递归 P→P|
一般而言,假定P关于的全部产生式是 P→P1 | P2 | … | Pm | 1 | 2|…|n 其中,每个都不等于,每个都不以P开头 那么,消除P的直接左递归性就是把这些规则改写 成:
第5章 自顶向下的语法分析方法
语法分析的作用是识别由词法分析给出 的单词符号序列是否是给定文法的正确句 子(程序)。 目前语法分析常用的方法有: 1、自顶向下(自上而下)分析 2、自底向上(自下而上)分析
5.3非LL(1)文法到LL(1)文法的等价转换
确定的自顶向下分析要求给定语言的文法必
须是 LL(1)形式。然而,不一定每个语言都是 LL(1)文法,对一个语言的非LL(1)文法是否能变
换为等价的LL(1)形式以及如何变换是我们讨论
的主要问题。由LL(1)文法的定义可知若文法中 含有左递归或含有左公共因子,则该文法肯定不 是LL(1)文法,因而,我们设法消除文法中的左 递归,提取左公共因子对文法进行等价变换。
1、提取公共左因子
若文法中含有形如:A→αβ|αγ的产生式,这导 致了对相同左部的产生式其右部的FIRST集相交, 也就是 SELECT(A→αβ)∩SELECT(A→αγ) ≠ φ ,不满足 LL(1)文法的充分必要条件。
编译原理第三章练习题答案
编译原理第三章练习题答案编译原理第三章练习题答案编译原理是计算机科学中的重要学科,它研究的是如何将高级语言代码转化为机器语言的过程。
在编译原理的学习过程中,练习题是不可或缺的一部分,通过完成练习题可以更好地理解和掌握编译原理的知识。
本文将为大家提供编译原理第三章练习题的答案,希望对大家的学习有所帮助。
1. 什么是语法分析?语法分析是编译器中的一个重要模块,它的主要任务是根据给定的语法规则,对输入的源代码进行分析和解释。
语法分析器会根据语法规则构建一个语法树,用于表示源代码的结构和含义。
常用的语法分析方法有递归下降法、LL(1)分析法和LR分析法等。
2. 什么是LL(1)文法?LL(1)文法是一种特殊的上下文无关文法,它具有以下两个特点:(1) 对于任何一个句子,最左推导和最右推导是唯一的。
(2) 在预测分析过程中,只需要向前看一个输入符号就可以确定所采用的产生式。
LL(1)文法是一种常用的文法形式,它适用于递归下降法和LL(1)分析法。
3. 什么是FIRST集合和FOLLOW集合?FIRST集合是指对于一个文法符号,它能够推导出的终结符号的集合。
FOLLOW 集合是指在一个句型中,某个非终结符号的后继终结符号的集合。
计算FIRST集合和FOLLOW集合可以帮助我们进行语法分析,特别是LL(1)分析。
4. 什么是递归下降语法分析法?递归下降语法分析法是一种基于产生式的自顶向下的语法分析方法。
它的基本思想是从文法的开始符号开始,递归地根据产生式进行分析,直到推导出输入符号串或发现错误。
递归下降语法分析法的实现比较简单,但对于某些文法可能会出现回溯现象,影响分析效率。
5. 什么是LR分析法?LR分析法是一种自底向上的语法分析方法,它的基本思想是从输入符号串开始,逐步构建语法树,直到推导出文法的开始符号。
LR分析法具有较好的分析效率和广泛的适用性,常用的LR分析方法有LR(0)、SLR(1)、LR(1)和LALR(1)等。
编译原理课后答案 (3)
编译原理课后答案问题一计算机程序的执行是一个多阶段的过程,其中编译是其中的一环。
请问编译的三个主要阶段分别是什么?答:编译过程一般可以分为三个主要阶段,分别是词法分析、语法分析和代码生成。
下面分别对这三个阶段进行介绍。
1. 词法分析词法分析是编译过程的第一步,也是最基础的一步。
它的任务是将源代码中的字符序列分解成一个个具有独立含义的单词,这些单词被称为“记号”或“词法单元”。
词法分析器根据程序中每一个字符的组合规则,将其转化为一个个词法单元,并记录下词法单元的类型标记。
词法分析器的工作一般通过有限状态自动机来实现,它根据一定的词法规则进行扫描和分析。
2. 语法分析语法分析是编译过程的第二步,它接收词法分析器生成的词法单元流,根据语法规则进行分析,并生成一棵语法树。
语法分析的主要任务是确定输入程序的结构,检查程序的语法正确性,并生成用于后续处理的输入形式。
语法分析器一般采用的是自顶向下或自底向上的分析方法,常用的方法有递归下降法和LR(1)分析法。
3. 代码生成代码生成是编译过程的最后一步,它将语法分析生成的语法树转化为目标机器的可执行代码。
代码生成器通过遍历语法树,将每个语法树节点转化为相应的目标机器代码。
代码生成过程中需要考虑到目标机器的特性和限制,以及优化代码的效率和性能。
问题二请解释一下编译原理中的词法规则是什么?答:编译原理中的词法规则指的是一组规定词法单元模式的规则。
它描述了如何将输入字符序列转换为词法单元,并为每个词法单元定义了一个标记。
词法规则一般使用正则表达式来描述词法单元的模式。
编译器根据词法规则构建词法分析器,用于将源代码分割成一系列的词法单元。
词法规则的灵活性和准确性对编译过程的性能和结果都有较大的影响。
一个完整的词法规则一般包含以下几个部分:1.正则表达式:描述了词法单元的模式,使用特定的正则表达式语法来表示。
2.动作:描述了当词法单元匹配到模式时,需要执行的动作或处理过程。
编译原理(3)语法_4(自顶向下语法分析:LL(1)分析法)
课本例题3.8 第二步:计算非终结符的FOLLOW集合
G[E]: E→TE' E'→ + TE' | ε T→FT' T'→*FT' | ε F→(E) | i ③由E→TE' 知FOLLOW(E) ⊂ FOLLOW(E' ), 即FOLLOW(E' ) = {),#}; 由E→TE ' 且E ' → ε知FOLLOW(E)FOLLOW(T),即 FOLLOW(T) = {+,),#};
特别是当Y1~Yk均含有ε产生式时,应把ε也加到FIRST(X)中。
课本例题3.8 第一步:计算非终结符的FIRST集合 例3.8 试构造表达式文法G[E]的LL(1)分析表,其中: G[E]: E→TE' E'→ + TE' | ε T→FT' T'→*FT' | ε F→(E) | i
[解答] 首先构造FIRST集,步骤如下: ① FIRST(E') = {+, ε}; FIRST(T') = {*, ε}; FIRST(F) = {(, i}; ② T→F… 和E→T…知:FIRST(F) ⊂ FIRST(T) ⊂ FIRST(E) 即有FIRST(F) = FIRST(T) = FIRST(E) = {(,i}。
LL(1)文法分析.
构造预测分析表
在确定的自顶向下分析方法中,又有递归子程序法和预测分 析方法,我们采用的是预测分析的方法。一个预测分析器 由三部分组成: (1)预测分析程序 (2)先进后出栈 (3)预测分析表 其中,只有预测分析表与文法有关。分析表可用矩阵M 表示。M(A,a)中的下标A表示非终结符,a为终结符 或括号,矩阵元素M(A,a)中的内容是一条关于A的产 生式,表明当用非终结符A往下推导时,面临输入符A时, 所应采取的候选产生式,元素内容无产生式时,则表明出 错。为便于辨认,我们令M数组为 Analyze数组。
算法介绍
1、在对输入序列进行LL(1)文法分析之前,首先要对文法进行判 别,看文法是不是LL(1)文法。这个文法应该满足无二义性,无 左递归,无公因子。具体的判别过程是,求出能推出ε的非终结 符,求出FIRST集,求出FOLLOW集,求出SELLECT集,看相 同左部的产生式的SELLECT集是否有交集,有就不是LL(1)文 法。 2、如果输入文法不是LL(1)文法,可以进行转换,转换一般有两 种方法:提取左公因子法和消除左递归法。 3、构造预测分析表,设二维矩阵M。
4、预测分析。
人员分工
• 负责MFC界面制作,程序总控,各个非终结 符能否推出ε的计算,判断是否LL(1),以及人员 分工。 • 消除左递归的实现 • 提取公因子的实现 • 求FIRST集 • 求FOLLOW集 • 求SELLECT集 • 构造预测分析表,分析输入的句子
程序流程
程序开始 InitAndConvertPt(); //读入文法、消除左递归、提取公因子 InitArray(); //初始化N[ ]数组 VnRefresh(Pt); //构造非终结符集 VtRefresh(Pt);//构造终结符集 Create_N_Table(); //判断哪些非终结符可以推出空,存入N[ ]
