编译原理 | 第二章课后习题答案

本文为编译原理(第三版)【清华大学出版社】部分课后答案
本答案均截取自网络,如有错误,望指正

编译原理(第三版)【清华大学出版社】

📌第1题

【题目】

【答案】

📌第2题

【题目】

【答案】

📌第3题

【题目】

【答案】

📌第4题

【题目】

【答案】

📌第5题

【题目】

【答案】

📌第6题

【题目】

【答案】

📌第7题

【题目】

【答案】

📌第8题

【题目】

【答案】

📌第9题

【题目】

【答案】

📌第10题

【题目】

【答案】

📌第11题

【题目】

【答案】

📌第12题

【题目】

【答案】

📌第13题

【题目】

【暂无】

📌第14题

【题目】

【暂无】

📌第15题

【题目】

【答案】

📌第16题

【题目】

【暂无】

📌第17题

【题目】

【暂无】

📌第18题

【题目】

【答案】

📌第19题

【题目】

【暂无】

📌第20题

【题目】

【暂无】

📌第21题

【题目】

【暂无】

### 编译原理第四章答案解析 #### 构造 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]。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值