- 49
- 0
- 约1.31万字
- 约 8页
- 2021-10-10 发布于湖南
- 举报
第四章
习题: 考虑上下文无关文法: S-S S +|S S *|a 以及串 aa + a*
(1) 给出这个串的一个最左推导
S - S S *
- S S + S *
- a S + S *
- a a + S *
- aa + a*
(3) 给出这个串的一棵语法分析树
习题:下面是一个只包含符号 a 和 b 的正则表达式的文法。 它使用 +替代表示并运算的符号 | ,
以避免和文法中作为元符号使用的竖线相混淆:
rexpr rexpr + rterm | rterm
rterm rterm rfactor | rfactor
rfactor rfactor * | rprimary
rprimary a | b
1) 对这个文法提取公因子
2) 提取公因子的变换使这个文法适用于自顶向下的语法分析技术吗?
3) 提取公因子之后,原文法中消除左递归
4) 得到的文法适用于自顶向下的语法分析吗?
解
1) 提取左公因子之后的文法变为
rexpr rexpr + rterm | rterm
rterm rterm rfactor | rfactor
rfactor rfactor * | rprimary
rprimary a | b
2) 不可以,文法中存在左递归,而自顶向下技术不适合左递归文法
3) 消除左递归后的文法
rexpr - rterm rexpr ’
rexpr ’ - + rterm rexpr ’|
rterm- rfactor rterm ’
rterm ’ - rfactor rterm ’|
rfactor- rprimay rfactor ’
rfactor ’ - *rfactor ’|
rprimary- a | b
4) 该文法无左递归,适合于自顶向下的语法分析
习题: 为下面的每一个文法设计一个预测分析器, 并给出预测分析表。 可能要先对文法进行
提取左公因子或消除左递归
(3)S-S(S)S|
(5)S-(L)|a L-L,S|S
解
(3)
①消除该文法的左递归后得到文法
S-S ’
S ’-(S)SS ’|
用类 Pascal 语言构造的一个预测分析器:
PROCEDURE S
BEGIN
S;
WHILE (lookahead== ’ ()
THEN BEGIN
match (();
S;
match ());
END;
ELSE IF (lookahead==a)
THEN match(a)
ELSE error
END;
②计算 FIRST 和 FOLLOW集合
FIRST(S)={(, } FOLLOW(S)={),$}
FIRST(S ’)={(, } FOLLOW(S ’ )={),$}
③构建预测分析表
非终结符号 输入符号
( ) $
S S-S ’ S-S’ S-S ’
S’ S’-(S)SS ’ S’- S’-
(5
原创力文档

文档评论(0)