如果使用预测分析法来进行语法分析,为什么文法必须先转化为ll文法再做分析

如果使用预测分析法来进行语法分析,为什么文法必须先转化为ll文法再做分析,第1张

一、 理解确定的自顶向下分析思想
确定的自顶向下分析方法,是从某文法的开始符号出发,考虑如何根据当前的输入符号(单词符号)唯一地确定选用哪个产生式替换相应非终结符往下推导,或如何构造一棵相应的语法树,其末端结点以从左向右的顺序连接正好为给定的输入符号串,则所给的输入符号串为该文法的句子。
二、 掌握LL(1)文法的判别步骤
一个文法中含有左递归和左公共因子绝对不是LL(1)文法,所以也就不可能用确定的自顶向下分析法。
某些含有左递归和左公共因子的文法在通过等价变换把它们消除以后可能变为LL(1)文法,但需要用LL(1)文法的定义判别,也就是说文法中不含左递归和左公共因子,只是LL(1)文法的必要条件。
掌握LL(1)文法的定义。熟练掌握FIRST集、FOLLOW集和SELECT集的计算方法。
三、某些非LL(1)文法到LL(1)文法的等价交换
理解两种非LL(1)文法的等价变换方法,特别要注意的是:消除了左递归、提取了左公共因子后不一定就能满足LL(1)文法的条件。
四、确定的自顶向下分析方法
掌握递归下降子程序的特点以及用PL/0程序分析PL/0编译程序的语法分析过程。
掌握如何构造预测分析表;
能用预测分析方法判断给定的输入符号串是否是该文法的句子。

如果题目是单纯求first、follow集合,不需要消除左递归但是,如果求first、follow集合是为了判断文法是否为LL(1)文法的话,可以直接得出否定的结论(因为含有左递归的文法绝对不是LL(1)文法)可以先对文法进行改写,一般是消除左递归和提取左公共因子,然后再判断

预备知识

FIRST集、FOLLOW集、SELECT集的异同:

同 :求终结符的结合

异 :FIRST集、FOLLOW集的对象是非终结符;SELECT的对象是产生式

详细说明

FIRST集:非终结符 前面 的终结符—组成的集合(非终结符能取ε时,ε也算)

FOLLOW集:非终结符 后面紧跟着的 终结符—组成的集合(如有ε,要写成#,代表停止)

SELECT集:产生式 右端 的 第一个 终结符 组成的集合(如果是终结符,则直接写。如果是非终结符,一般为非终结符的FIRST集;若非终结符能取到ε,则ε后的第一个终结符也包括在内)

例题

考虑文法

G[S]:S → aSAb | Ab

           A → cA | ε

(1)求出该文法的每个非终结符的FIRST集、FOLLOW集

FIRST(S) = {a, c, ε}        FOLLOW(S) = {c, b, ε} ( 说明 ,由于S的后面没有终结符,只有非终结符A,所以先将A的first集算入,即c;而且A能取到ε,则先将ε算进来,然后将A → ε代入到S的两个产生式中,代入后S后面紧跟着的终结符就变成了b,所以b也算入S的FOLLOW集)

FIRST(A) = {c, ε}            FOLLOW(A) = {b, #}(说明,在S的产生式中,A后面跟着b,所以b算入其中,A能取到ε的情况,所以ε也算入其中,由于存在A → ε时,程序停止,所以在FOLLOW集中要将ε写成#,表示停止)

(2)求出各个产生式的SELECT集

SELECT(S → aSAb) = {a}

SELECT(S → Ab) = (A能推出ε) FIRST(A) - {ε} + FOLLOW(A) = {b, c}

SELECT( A → cA) = {c}

SELECT( A → ε) = (直接取FOLLOW,并且去掉#) {b}

(3)证明该文法是LL(1)文法

其实,我们求FIRST集、FOLLOW集、SELECT集的的目的就是为了判断文法是否是LL(1)文法

LL(1)文法的含义:

第一个L表明自顶向下分析是从左向右扫描输入串;

第二个L表示分析过程中将用最左推导,

1表示 只需向右看一个符号便可决定选择哪个产生式进行推导 。

所以,若存在一个产生式,向右看一个符号还不能决定选择哪个产生式的时候,该文法不是LL(1)文法。

在此题中,由于SELECT(S → aSAb) ∩ SELECT(S → Ab) = {a} ∩ {b, c} = ∅,

SELECT( A → cA) ∩ SELECT( A → ε) = {c} ∩ {b} = ∅,即向右看一个符号就能决定选择哪个产生式,所以是LL(1)文法。

回答下列问题:(30分)
(6分)对于下面程序段
program test (input, output)
var i, j: integer;
procedure CAL(x, y: integer);
begin
y:=yy; x:=x-y; y:=y-x
end;
begin
i:=2; j:=3; CAL(i, j)
writeln(j)
end
若参数传递的方法分别为(1)传值、(2)传地址,(3)传名,请写出程序执行的输出结果。
答: (1) 3 (2) 16 (3) 16 (每个值2分)
(6分)计算文法G(M)的每个非终结符的FIRST和FOLLOW集合,并判断该文法是否是LL(1)的,请说明理由。
G(M):
M → TB
T → Ba |
B → Db | eT |
D → d |
解答:
计算文法的FIRST和FOLLOW集合:(4分)
FIRST(M) = { a,b,e,d, } FIRST(T) = { a,b,e,d, }
FIRST(B) = {b,e,d, } FIRST(D) = {d,}
FOLLOW (M) = {#} FOLLOW (T) = { a,b,e,d,#}
FOLLOW (B) = {a,# } FOLLOW (D) = { b}
检查文法的所有产生式,我们可以得到:
1 该文法不含左递归,
2 该文法中每一个非终结符M,T,B,D的各个产生式的候选首符集两两不相交。
3 该文法的非终结符T、B和D,它们都有候选式,而且
FIRST(T)∩FOLLOW(T)={ a,b,e,d }≠
所以该文法不是LL(1)文法。(2分)
(4分)考虑下面的属性文法
产 生 式 语 义 规 则
S→ABC
A→a
B→b
C→c Bu := Su
Au := Bv + Cv
Sv := Av
Av :=3Au
Bv := Bu
Cv := 1
画出字符串abc的语法树;
对于该语法树,假设Su的初始值为5,属性计算完成后,Sv的值为多少。
答:(1) (2分)
(2) Sv的值为18 (2分)
(4分)运行时的DISPLAY表的内容是什么?它的作用是什么?
答:DISPLAY表是嵌套层次显示表。每当进入一个过程后,在建立它的活动记录区的同时建立一张嵌套层次显示表diaplay假定现在进入的过程层次为i,则它的diaplay表含有i+1个单元,自顶向下每个单元依次存放着现行层、直接外层、…、直至最外层(主程序,0层)等每层过程的最新活动记录的起始地址。通过DISPLAY表可以访问其外层过程的变量。
(5分)对下列四元式序列生成目标代码:
A:=BC
D:=E+A
G:=B+C
H:=GD
其中,H在基本块出口之后是活跃变量, R0和R1是可用寄存器。
答: 目标代码序列
LD R0 B
MUL R0 C
LD R1 E
ADD R1 R0
LD R0 B
ADD R0 C
MUL R0 R1
ST R0 H
(5分)写出表达式a+b(c-d)对应的逆波兰式、三元式序列和抽象语法树。
答:
逆波兰式:(abcd-+) (1分)
三元式序列: (2分)
OP ARG1 ARG2
(1) - c d
(2) b (1)
(3) + a (2)
抽象语法树:(2分)
(8分)构造一个DFA,它接受={a,b}上所有包含ab的字符串。
答:
(2分)构造相应的正规式:(a|b)ab(a|b)
(3分)
a a
a b
b b
(3分)确定化:
I
{0,1,2} {1,2,3} {1,2}
{1,2,3} {1,2,3} {1,2,4,5,6}
{1,2} {1,2,3} {1,2}
{1,2,4,5,6} {1,2,3,5,6} {1,2,5,6}
{1,2,3,5,6} {1,2,3,5,6} {1,2,4,5,6}
{1,2,5,6} {1,2,3,5,6} {1,2,5,6}
b b
b a
a a a a
a b b
b
最小化:
{0,1,2} {3,4,5}
{0, 2},1, {3,4,5}
(6分)写一个文法使其语言为L(G)={anbncm| m,n≥1,n为奇数,m为偶数}。
答:
文法G(S):
(8分)对于文法G(S):
1 写出句型b(Ma)b的最右推导并画出语法树。
2 写出上述句型的短语,直接短语和句柄。
答:
1 (4分)
2 (4分)
短语: Ma), (Ma), b(Ma)b
直接短语: Ma)
句柄: Ma)
(12分)对文法G(S):
S → a | ^ | (T)
T → T,S | S
(1) 构造各非终结符的FIRSTVT和LASTVT集合;
(2) 构造算符优先表;
(3) 是算符优先文法吗
(4) 构造优先函数。
答:
(1) (4分)
(2) (4分)
a ^ ( ) ,
a > >
^ > >
( < < < = <
) > >
, < < < > >
(3) 是算符优先文法,因为任何两个终结符之间至多只有一种优先关系。 (1分)
(4) 优先函数(3分)
a ^ ( ) ,
F 4 4 2 4 4
G 5 5 5 2 3
(8分)设某语言的do-while语句的语法形式为
S do S(1) While E
其语义解释为:
针对自下而上的语法分析器,按如下要求构造该语句的翻译模式,将该语句翻译成四元式:
(1) 写出适合语法制导翻译的产生式;
(2) 写出每个产生式对应的语义动作。
答:(1) 适合语法制导翻译的文法(4分)
G(S):
R do
UR S(1) While
SU E
(2) (4分)
R do
{ RQUAD:=NXQ }
UR S(1) While
{ UQUAD:=RQUAD;
BACKPATCH(SCHAIN, NXQ) }
SU E
{ BACKPATCH(ETC, UQUAD);
SCHAIN:=EFC }
答案二:
(1) S do M1 S(1) While M2 E
M ε (4分)
(2) M ε { MQUAD := NXQ } (4分)
S do M1 S(1) While M2 E
{
BACKPATCH(S(1)CHAIN, M2QUAD);
BACKPATCH(ETC, M1QUAD);
SCHAIN:=E FC
}
(10分)将语句
while C>0 do if A B=0 then C:=C+D else C:=CD
翻译成四元式。
答:
100 (j>, C, 0, 102)
101 (j, -, -, 112)
102 (jnz, A, -, 106)
103 (j, -, -, 104)
104 (j=, B, 0, 106)
105 (j, -, -, 109)
106 (+, C, D, T1)
107 (:=, T1, -, C)
108 (j, -, -, 100)
109 (, C, D, T2)
110 (:=, T2, -, C)
111 (j, -, -, 100)
112
(10分)设有基本块如下:
T1:=3
T2:=AB
T3:=9+T1
M:=AB
T4:=C-D
L:=T3T4
T2:=C+D
N:=T2
画出DAG图;
设L,M,N 是出基本块后的活跃变量,请给出优化后的四元式序列。
答:
1 (6分)
L

T2,M T4 T2,N
- +
T1 T3
3 A B 12 C D
2 (4分)
M:=AB
S1:=C-D
L:=12S1
N:=C+D
(8分)文法G(S)及其LR分析表如下,请给出串baba#的分析过程。
(1) S → DbB (2) D → d (3) D → ε
(4) B → a (5) B → Bba (6) B → ε
LR分析表
ACTION GOTO
b D a # S B D
0 r3 s3 1 2
1 acc
2 s4
3 r2
4 r6 S5 r6 6
5 r4 r4
6 s7 r1
7 S8
8 r5 r5
解答:
步骤 状态 符号 输入串
0 0 # baba#
1 02 #D baba#
2 024 #Db aba#
3 0245 #Dba ba#
4 0246 #DbB ba#
5 02467 #DbBb a#
6 024678 #DbBba #
7 0246 #DbB #
8 01 #S # acc
哈哈,估计认识!!


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12854709.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-28
下一篇2025-08-28

发表评论

登录后才能评论

评论列表(0条)

    保存