Exam
1. 正则表达式与自动机
- 结合RE,使用Thompson构造法构造等价NFA,状态的合并需要体现出来(比如状态1和状态8),使用0-n进行编号
- 使用子集构造法构造等价的DFA:使用A-Z进行编号
s t e p 1 : A = { 0 , 1 , 2 , 4 , 7 } ⇔ ϵ − c l o s u r e ( 0 ) s t e p 2 : B = { 1 , 2 , 3 , 4 , 6 , 7 , 8 } n o t e : A → N F A a { 3 , 8 } → m o v e ϵ − c l o s u r e B . . . step1: A = \{0, 1, 2, 4, 7\} \Leftrightarrow \epsilon-closure(0) \\ step2: B = \{1, 2, 3, 4, 6, 7, 8\} \\ note: A \xrightarrow[NFA]{a} \{3, 8\} \xrightarrow[move]{\epsilon-closure} B \\ ... \\ step1:A={0,1,2,4,7}⇔ϵ−closure(0)step2:B={1,2,3,4,6,7,8}note:AaNFA{3,8}ϵ−closuremoveB...
- 最小化DFA:识别等价状态,使用划分的方法,首先分离终止状态,使用0-n进行编号
s ≁ t ⇔ ∃ a ∈ Σ . ( s → a s ′ ) ∧ ( t → a t ′ ) ∧ ( s ′ ≁ t ′ ) s \not\sim t \Leftrightarrow \exist a \in \Sigma. (s \xrightarrow{a} s')\wedge(t \xrightarrow{a} t') \wedge (s' \not\sim t') s∼t⇔∃a∈Σ.(sas′)∧(tat′)∧(s′∼t′)
- 最小DFA转换为RE:一共做状态数次
![]() | ![]() |
---|---|
![]() | ![]() |
- 别忘了画终止状态标识
2. First、Follow集合与LL(1)文法
- 计算First集合
- 计算Follow集合:注意开始符号的含义是第一条表达式的左侧元素
- 得到文法分析表
t ∈ F i r s t ( α ) ( 1 ) α ⇒ ∗ ϵ ∧ t ∈ F o l l o w ( A ) ( 2 ) \begin{array}{l} t \in First(\alpha) & (1)\\ \alpha \xRightarrow{*} \epsilon \wedge t \in Follow(A) & (2)\\ \end{array} t∈First(α)α∗ϵ∧t∈Follow(A)(1)(2)
t t t | |
---|---|
A A A | A → α A \rightarrow \alpha A→α |
- 判断是否为LL(1)文法:是否无冲突,检查是否有一个单元格中有超过一个表达式
- 得到LL(1)语法分析器的伪代码
3. LR语法分析器
3.1. LR(0)
- 增广文法:增加生成式 L ′ → L L' \rightarrow L L′→L
- 使用
·
来代表栈顶 - 非acc的栈顶执行规约操作
- 闭包计算
- 表中没有冲突项则LR(0)文法是无二义的
3.2. SLR(1)
- 规约:$(3) [k:A \rightarrow \alpha·] \in I_i \wedge A \neq S’ \Rightarrow \forall t \in Follow(A) \cup {$}. ACTION[i, t] = rk , 要 规 约 就 是 我 们 发 现 了 完 整 的 右 部 ( ,要规约就是我们发现了完整的右部( ,要规约就是我们发现了完整的右部(A \rightarrow \alpha , 并 且 当 前 符 号 为 ,并且当前符号为 ,并且当前符号为t$),如果t不在Follow(A)中,那么不可能有一个句型包含t。
- 只需要在LR(0)的基础上检查follow集合:检查规约的表达式的具体情况( L → P ⋅ L\rightarrow P· L→P⋅)
- 规约过程见例题:要仔细注意规约表达式的使用。
3.3. LR(1)
- $[A \rightarrow \alpha·\beta, a] (a \in T \cup {$}) , 此 处 , a 是 向 前 看 符 号 , 数 量 为 1 , 使 用 a 来 记 住 ,此处, a是向前看符号, 数量为1,使用a来记住 ,此处,a是向前看符号,数量为1,使用a来记住\gamma$
- 闭包计算(务必注意):注意是在原生成式上的操作,是否执行规约操作和a中的元素有关
3.4. LALR(1)
- 将相同的状态进行合并
4. 语法制导的翻译方案
- S属性
- 节点N上的综合属性只能通过N的子节点或N本身的属性来定义。
- 直观上就是要么能被子节点计算得到,要么是自身持有。
- L属性:继承属性,从父节点或兄弟节点获取到的
5. 中间代码生成
- 添加语句的语义规则:注意label、goto和code即可
- 为代码片段生成中间代码
- 基于布尔表达式与控制流语句回填翻译方法为语句设计回填方案:引入非终结符
- 使用回填方案为以下代码片段生成中间代码