【编译原理】第五章课后习题(王原生第三版)

前言

  • 课本: 编译原理(第三版)[王生原、董渊…等编著]
  • 习题: 主要习题内容是第一章到第八章,具体内容如下表
章节内容链接
第一章课后部分选择题https://blog.csdn.net/Zchengjisihan/article/details/136243955
第二章课后部分选择题https://blog.csdn.net/Zchengjisihan/article/details/136243955
第三章课后习题1(4)、5、9https://blog.csdn.net/Zchengjisihan/article/details/136264182
第四章课后习题1、2、3https://blog.csdn.net/Zchengjisihan/article/details/136264485
第五章课后习题1、4https://blog.csdn.net/Zchengjisihan/article/details/136264816
第六章课后习题11、15https://blog.csdn.net/Zchengjisihan/article/details/136276626
第七章课后习题2https://blog.csdn.net/Zchengjisihan/article/details/136277222
第八章课后习题1https://blog.csdn.net/Zchengjisihan/article/details/136277222

1. 已知文法G[S]为

S → a ∣ ∧ ∣ ( T ) S\to a|\wedge|(T) Sa(T)
T → T , S ∣ S T\to T,S|S TT,SS
(1) 计算G[S]的FIRSTVT和LASTVT
(2) 构造G[S]的算符优先关系表并说明G[S]是否为算符优先文法
(3) 计算G[S]的优先函数
(4) 给出输入串 ( a , a ) # (a,a)\# (a,a)# ( a , ( a , a ) ) # (a,(a,a))\# (a,(a,a))#的算符优先分析过程

请添加图片描述请添加图片描述
请添加图片描述

在这里插入图片描述
请添加图片描述

4. 已知文法G[S]为

S → S ; G ∣ G S\to S;G|G SS;GG
G → G ( T ) ∣ H G\to G(T)|H GG(T)H
H → a ∣ ( S ) H\to a|(S) Ha(S)
T → T + S ∣ S T\to T+S|S TT+SS
(1) 构造G[S]的算符优先关系表,并判断G[S]是否为算符优先文法
(2) 给出句型 a ( T + S ) ; H ; ( S ) a(T+S);H;(S) a(T+S);H;(S)的短语、句柄、素短语和最左素短语
(3) 给出输入串 a ; ( a + a ) a;(a+a) a;(a+a) ( a , a ) + (a,a)+ (a,a)+的分析过程,说明他们是否为G[S]的句子
(4) 给出(3)中输入串的最右推导,分别说明两个输入串是否为G[S]的句子
(5) 由(3)和(4)说明了算符优先分析的哪些缺点
(6) 算符优先分析过程和规范规约过程都是最右推导的逆过程吗

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述


结束语

如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!

### 编译原理第四章答案解析 #### 构造 LL(1) 分析表 对于给定的文法: ``` Expr → Expr ExprTail Expr → (Expr) Expr → Var ExprTail → Expr ExprTail → ε Var → id VarTail VarTail → (Expr) VarTail → ε ``` 为了构造 LL(1) 分析表,需要计算 FIRST 和 FOLLOW 集合。 - **FIRST 集合** - `FIRST(Expr)` = {`(`, `id`} - `FIRST(ExprTail)` = {`(`, `ε`} - `FIRST(Var)` = {`id`} - `FIRST(VarTail)` = {`(`, `ε`} - **FOLLOW 集合** - `FOLLOW(Expr)` = {$, `)`, `_`} - `FOLLOW(ExprTail)` = {$, `)`, `_`} - `FOLLOW(Var)` = {$, `)`, `_`} - `FOLLOW(VarTail)` = {$, `)`, `_`} 基于上述集合,可以构建如下 LL(1) 分析表[^3]: | | (` | ) | id | $ | _ | |-------|--------|---------|--------|---------|---------| | Expr | Expr → (Expr) | | Expr → Var | | Expr → Var | | ExprTail | ExprTail → Expr | | | ExprTail → ε | ExprTail → ε | | Var | | | Var → id | | | | VarTail | VarTail → (Expr) | VarTail → ε | | VarTail → ε | VarTail → ε | --- #### 句子分析过程 目标句子为:`id _id((id))` 通过 LL(1) 分析表逐步推导该句子的过程如下: | 步骤 | 当前栈状态 | 输入串 | 动作 | |------|--------------------------|-------------------------|----------------------------------------| | 0 | `$ S` | `id _id((id))$` | 将 `S` 替换为 `Expr` | | 1 | `$ Expr` | `id _id((id))$` | 查找 `(id,_id((id)))` 对应规则替换 `Expr` 为 `Var` | | 2 | `$ Var` | `id _id((id))$` | 查找 `(id,id(_id((id))))` 对应规则替换 `Var` 为 `id VarTail` | | 3 | `$ id VarTail` | `id _id((id))$` | 匹配输入中的 `id` 并移除 | | 4 | `$ VarTail` | `_id((id))$` | 查找 `(_,_)` 对应规则替换 `VarTail` 为 `(Expr)` | | ... | 继续匹配直到完成... | | | 最终成功匹配整个字符串并清空栈,则表明语法正确。 --- #### LALR 分析器的应用 如果进一步扩展到 LALR 分析器的设计,可以通过构造项目集族来实现。LALR 的核心在于合并具有相同核的状态,并利用 ACTION 表和 GOTO 表指导分析过程。针对句子 `a+ba*` 的具体分析过程需遵循类似的思路,即先定义文法规则,再依据 LR(1) 或 SLR(1) 方法生成对应的 DFA 和表格[^2]。 ```python # 示例 Python 实现简单的词法分析框架 class Token: def __init__(self, type_, value=None): self.type = type_ self.value = value def lexer(input_string): tokens = [] i = 0 while i < len(input_string): char = input_string[i] if char.isdigit(): num = "" while i < len(input_string) and input_string[i].isdigit(): num += input_string[i] i += 1 tokens.append(Token("NUMBER", int(num))) continue elif char.isalpha(): ident = "" while i < len(input_string) and input_string[i].isalnum(): ident += input_string[i] i += 1 tokens.append(Token("IDENTIFIER", ident)) continue elif char in "+-*()": tokens.append(Token(char)) i += 1 else: raise ValueError(f"Unexpected character: {char}") tokens.append(Token("$")) # EOF marker return tokens ``` 此代码片段展示了如何将输入字符串转换成标记流以便后续语法制导翻译使用[^1]。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SheathedSharp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值