4.2.1
考虑上下文无关文法:
S→S S +
| S S *
| a,
以及串aa+a*
1)给出这个串的一个最左推导
S→S S *
→S S + S *
→a S + S *
→a a + S *
→a a + a *
2)给出这个串的一个最右推导
S→S S *
→S a *
→S S + a *
→S a + a *
→a a + a *
3)给出这个串的一棵语法分析树
4.2.2(1-3, 5, 7)[只做4.2.1的1-3小问]
对下列的每一对文法和串重复练习4.2.1
1.S->0 S 1|0 1 和串000111
a.最左推导
S->0 S 1
->0 0 S 1 1
->0 0 0 1 1 1
b.最右推导
S -> 0 S 1
->0 0 S 1 1
->0 0 0 1 1 1
c.语法分析树
2.S-> + S S | * S S | a和串+*aaa
a.最左推导
S-> + S S
-> + * S S S
-> + * a S S
-> + * a a S
-> + * a a a
b.最右推导
S-> + S S
-> + S a
-> + * S S a
-> + * S a a
-> + * a a a
c.语法分析树
3.S->S ( S ) S |ε和串(()())
a.最左推导
S -> S ( S ) S
-> ( S ) S
-> ( S ( S ) S ) S
-> ( S ( S ) S ( S ) S ) S
-> ( ( S ) S ( S ) S ) S
-> ( ( ) S ( S ) S ) S
-> ( ( ) ( S ) S ) S
-> ( ( ) ( ) S ) S
-> ( ( ) ( ) ) S
-> ( ( ) ( ) )
b.最右推导
S -> S ( S ) S
-> S ( S )
-> S ( S ( S ) S )
-> S ( S ( S ) )
-> S ( S ( ) )
-> S ( S ( S ) S ( ) )
-> S ( S ( S ) ( ) )
-> S ( S ( ) ( ) )
-> S ( ( ) ( ) )
-> ( ( ) ( ) )
c.语法分析树
4.S->( L ) | a以及L->L,S | S和串((a,a),a,(a))
a.最左推导
S -> ( L )
-> ( L , S )
-> ( L , S , S )
-> ( S , S , S )
-> ( ( L ) , S , S )
-> ( ( L , S ) , S , S )
-> ( (S , S ) , S , S )
-> ( ( a , S ) , S , S )
-> ( ( a , a ) , S , S )
-> ( ( a , a ) , a , S )
-> ( ( a , a ) , a , ( L ) )
-> ( ( a , a ) , a , ( S ) )
-> ( ( a , a ) , a , ( a ) )
b.最右推导
S -> ( L )
-> ( L , S )
-> ( L , ( L ) )
-> ( L , ( S ) )
-> ( L , ( a ) )
-> ( L , ( a ) )
-> ( L , S , ( a ) )
-> ( L , a , ( a ) )
-> ( S , a , ( a ) )
-> ( ( L ) , a , ( a ) )
-> ( ( L , S ) , a , ( a ) )
-> ( ( L , a ) , a , ( a ) )
-> ( ( S , a ) , a , ( a ) )
-> ( ( a , a ) , a , ( a ) )
c.语法分析树
5.下面的布尔表达式对应的文法:
bexpr->bexpr or bterm | bterm
Bterm->bterm and bfactor | bfactor
bfactor->not bfactor | (bexpr) | ture |false
a.最左推导
b.最右推导
c.语法分析树
(这题没看懂,如有友友知道的欢迎留言)
4.2.3(1-2)为下面的语言设计文法:
1.所有由0和1组成的并且每个0之后都至少跟着一个1的串的集合。
答:
正则表达式:(0?1)*
文法:
S -> S T
|ε
T -> 0 1
| 1
2.所有由0和1组成的回文(palindrome)的集合,也就是从前面和从后面读结果都相同的串的集合。
答:
文法:
S -> 0 S 0
| 1 S 1
| 0
| 1
| ε
4.2.5
使用练习4.2.4中描述的括号表示法来简化如下的关于语句块和条件语句的文法。
stmt -> if expr then stmt else stmt
| if stmt then stmt
| begin stmtList end
stmtList -> stmt ; stmtList | stmt
括号表示法:一个常用的扩展的文法表示方法,在这个表示方法中,产生式体中的方括号和花括号是元符号(如->或|),且具有如下含义:
1.一个或多个文法符号两边的方括号表示这些构造是可选的。因此,产生式A -> X[Y]Z和两个产生式A -> XYZ及A -> XZ具有相同的效果。
2.一个或多个文法符号两边的花括号表示这些符号可以重复任意多次(包括零次)。因此,证明这两个扩展并没有增加文法的功能。也就是说,由带有这些扩展表示的文法生成的任何语言都可以由一个不带扩展表示的文法生成。
答:
stmt -> if expr then stmt [else stmt]
| begin stmtList end
stmtList -> stmt [; stmtList]或stmtList -> stmt {; stmt}
4.4.1(1-3,5)
为下面的每一个文法设计一个预测分析器,并给出预测分析表。你可能先要对文法进行提取左公因子或消除左递归的操作。
1.练习4.2.2(1)中的文法:S -> 0 S 1 | 0 1
答:
提取左公因子:
S -> 0 S’
S’ -> S 1 | 1
FIRST/FOLLOW/NULLABLE集:
预测分析表:
2.练习4.2.2(2)中的文法:S -> + S S | * S S | a
答:
FIRST/FOLLOW/NULLABLE集:
预测分析表:
3.练习4.2.2(3)中的文法:S -> S ( S ) S |ε
答:
消除左递归:
S -> S’
S’ -> ( S ) S
-> ε
FIRST/FOLLOW/NULLABLE集:
预测分析表:
4.练习4.2.2(5)中的文法:S -> ( L ) | a以及L -> L , S | S
答:
消除左递归:
S -> ( L ) | a
L -> S L’
L’ -> , S L’
| ε
FIRST/FOLLOW/NULLABLE集:
预测分析表:
4.4.4
计算练习4.2.2中各个文法的FIRST和FOLLOW集合。
1.S -> 0 S 1 | 0 1
2.S -> + S S | * S S | a
3.S -> S ( S ) S |ε
4.S -> S + S | S S | ( S ) | S * |a
5.S -> ( L ) | a以及L -> L , S | S
6.S -> a S b S| b S a S |ε
7.下面的布尔表达式对应的文法:
bexpr->bexpr or bterm | bterm
bterm->bterm and bfactor | bfactor
bfactor->not bfactor | (bexpr) | true |false
4.6.5
说明下面的文法:
S -> A a A b | B b B a
A -> ε
B -> ε
是LL(1)的,但不是SLR(1)的。
答:
1.是LL(1)的:A a A b和B b B a都不能推导出ε;FIRST(A a A b)={a},FIRST(B b B a)={b},不相交,所以该文法是LL(1)的。
2.不是SLR(1)的:
状态S_0:
S ->·A a A b
S ->·B b B a
A ->·ε
B ->·ε
当接受ε时,状态S_0进入到S_1状态:
A ->ε·
B ->ε·
此时会发生规约冲突,故该文法不是SLR(1)的。
4.6.6
说明下面的文法:
S -> S A | A
A -> a
是SLR(1)的,但不是LL(1)的。
答:
1.是SLR(1)的:
构造增广文法:
0:S’ -> S
1:S -> S A
2: | A
3:A -> a
SLR分析表:
SLR分析表中没有冲突。故是SLR(1)的。
2.不是LL(1)的:
由产生式S -> S A | A可知,S A和A都不能推出ε;FIRST(SA)={a},FIRST(A)={a},相交,故该文法不是LL(1)的。
4.7.2(5)
为文法S ->( L ) | a以及L->L,S | S构造:
1.规范LR项集族
2.LALR项集族
答:
构造增广文法:
0:S’ -> S $
1:S -> ( L )
2: | a
3:L -> L , S
4: | S
规范LR项集族:
LALR项集族:
对LR(1)进行同项合并。LR(1)中可以合并的产生式集如下图颜色标出:
合并后得到LALR项集族:
4.7.5
说明下面的文法:
S -> A a | b A c | B c | b B a
A -> d
B -> d
是LR(1)的,但不是LALR(1)的
答:
构造增广文法:
0:S’ -> S $
1:S -> A a
2: | b A c
3: | B c
4: | b B a
5:A -> d
6:B -> d
1.是LR(1)的:
LR(1)项集图:
从项集图可以看出,LR(1)没有冲突。故该文法是LR(1)的。
2.不是LALR(1)的:
找出可合并的项,用相同颜色标出:
合并后得到LALR(1):
可以看出,状态5会产生规约冲突,故该文法不是LALR(1)的。