diff --git a/.DS_Store b/.DS_Store index 496411c..15f0384 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/NJU-Notes/Chapter-0-Overview.pdf b/NJU-Notes/Chapter-0-Overview.pdf deleted file mode 100644 index 57083ed..0000000 Binary files a/NJU-Notes/Chapter-0-Overview.pdf and /dev/null differ diff --git "a/NJU-Notes/Chapter-1-\350\257\215\346\263\225\345\210\206\346\236\2201.pdf" "b/NJU-Notes/Chapter-1-\350\257\215\346\263\225\345\210\206\346\236\2201.pdf" deleted file mode 100644 index d7cd3cc..0000000 Binary files "a/NJU-Notes/Chapter-1-\350\257\215\346\263\225\345\210\206\346\236\2201.pdf" and /dev/null differ diff --git "a/NJU-Notes/Chapter-2-\350\257\215\346\263\225\345\210\206\346\236\2202.pdf" "b/NJU-Notes/Chapter-2-\350\257\215\346\263\225\345\210\206\346\236\2202.pdf" deleted file mode 100644 index fb37760..0000000 Binary files "a/NJU-Notes/Chapter-2-\350\257\215\346\263\225\345\210\206\346\236\2202.pdf" and /dev/null differ diff --git a/NJU-Notes/Chapter-3-REandAutomata.pdf b/NJU-Notes/Chapter-3-REandAutomata.pdf deleted file mode 100644 index 095b1cb..0000000 Binary files a/NJU-Notes/Chapter-3-REandAutomata.pdf and /dev/null differ diff --git a/NJU-Notes/Lecture0_Overview.md b/NJU-Notes/Lecture0_Overview.md new file mode 100644 index 0000000..f0b1fc0 --- /dev/null +++ b/NJU-Notes/Lecture0_Overview.md @@ -0,0 +1,73 @@ +# Chapter 0 Overview + +>- this is the my notes of Compilers in 2024 +>- the course is taught by Prof. [Hengfeng Wei @NJU](https://github.com/hengxin) + +## Credits + +- Course Homepage: [NJU-Compilers-Spring-2024](http://docs.compilers.cpl.icu/#/) +- Piazza: [NJU-Compilers-Chatting](https://2024-compilers-at-software-nju.zulipchat.com/#narrow/stream/419310-general) +- Course Online: [Bilibili-NJU-Compilers-Spring-2024](https://space.bilibili.com/479141149/channel/collectiondetail?sid=2312309) + +## Introduction + +1. 高级” 语言 ⇒ (通常) “低级” 语言 (如, 汇编语言) +2. 汇编语言经过汇编器生成机器语言 +3. 汇编语言网站:[godblot](https://godbolt.org/) +4. 采用的指令集:[RISC-V](https://riscv.org/) +5. RISC-V references: + - https://riscv-programming.org/book.html + - http://www.riscvbook.com/ +6. RISC-V Simulator: + - https://github.com/TheThirdOne/rars +7. 语言类应用程序: + - 配置文件解析 (.properties) + - CSV 文件 (Comma-Separated Values) + - JSON 文件 (JavaScript Object Notation) + - SQL 引擎 (Structured Query Language) + - TLA+/TLAPS (TPaxos.tla) + - (Java) 字节码解释器 + - C/C++ 语言编译器 + - 排版工具 (LATEX) + - 绘图工具 (TikZ, Dot/Graphviz) + - L-System (Cantor Set) +8. 语法分析器生成器 ANTLR + - https://www.antlr.org/index.html + - https://www.antlr.org/tools.html (IntelliJ Plugin) + - http://lab.antlr.org/ (Online lab) +9. LLVM + - https://llvm.org/ +10. Reference Books + - http://docs.compilers.cpl.icu/#/2024/resources + +## Overview + +- IR: Intermediate Representation (中间表示) +- Source Program -> _Front End_ -> IR -> _Back End_ -> Target Program + - 前端 (分析阶段): 分析 __源语言__ 程序, 收集所有必要的信息 + - 后端 (综合阶段): 利用收集到的信息, 生成 __目标语言程序__ +- Clang: a C language family frontend for LLVM + - https://clang.llvm.org/ +- _机器无关_ 的 __中间表示优化__ + +## Slide + +[0-overview](https://github.com/courses-at-nju-by-hfwei/compilers-lectures/blob/master/2024/0-overview/overview-handout.pdf) + +## Supplementary Materials + +- [LLVM](https://www.bilibili.com/video/BV1RF411K7F5/?vd_source=e3cbbf5ca80db268fa006d63626e267e) +- [Assembly Language](https://www.bilibili.com/video/BV1Y94y1D7at/?spm_id_from=333.788&vd_source=8a3dd36862125e80dc439254ef65d959) +- [Ruby](https://www.bilibili.com/video/BV1PU4y1z7Fs/?spm_id_from=333.788&vd_source=8a3dd36862125e80dc439254ef65d959) +- [Perl](https://www.bilibili.com/video/BV1qB4y1G7B3/?spm_id_from=333.788&vd_source=8a3dd36862125e80dc439254ef65d959) +- [Lua](https://www.bilibili.com/video/BV14t4y1E7Zr/?spm_id_from=333.788&vd_source=8a3dd36862125e80dc439254ef65d959) +- [Unity](https://www.bilibili.com/video/BV1ZB4y1V7KB/?spm_id_from=333.788&vd_source=8a3dd36862125e80dc439254ef65d959) +- [Temple OS](https://www.bilibili.com/video/BV13g411r7bY/?spm_id_from=333.788&vd_source=8a3dd36862125e80dc439254ef65d959) +- [Fortran](https://www.bilibili.com/video/BV1Qd4y1R7vX/?spm_id_from=333.788&vd_source=8a3dd36862125e80dc439254ef65d959) +- [WebAssembly](https://www.bilibili.com/video/BV12B4y1B7xq/?spm_id_from=333.788&vd_source=8a3dd36862125e80dc439254ef65d959) +- [Haskell](https://www.bilibili.com/video/BV1cS4y1b7kH/?spm_id_from=333.788&vd_source=8a3dd36862125e80dc439254ef65d959) +- [Swift](https://www.bilibili.com/video/BV1Ya411378N/?spm_id_from=333.788&vd_source=8a3dd36862125e80dc439254ef65d959) +- [Elixir](https://www.bilibili.com/video/BV1at4y1L7Ty/?spm_id_from=pageDriver&vd_source=8a3dd36862125e80dc439254ef65d959) +- [Kotlin](https://www.bilibili.com/video/BV1AW4y1B74G/?spm_id_from=333.788&vd_source=8a3dd36862125e80dc439254ef65d959) +- [redis](https://www.bilibili.com/video/BV1Wd4y1X7wy/?p=14&spm_id_from=pageDriver) + diff --git a/NJU-Notes/Lecture10_StackandHeap.md b/NJU-Notes/Lecture10_StackandHeap.md new file mode 100644 index 0000000..5f334c9 --- /dev/null +++ b/NJU-Notes/Lecture10_StackandHeap.md @@ -0,0 +1,108 @@ +# Chapter 10 Runtime Space + +## 运行时存储空间 + +编译程序是将源程序的**算法描述部分和数据说明部分**, 分别翻译成**机器目标代码和数据存储单元**, 最终获得目标程序. + +目标程序在目标机环境中运行时, 都置身于自己的一个运行时存储空间.在基于操作系统之上运行的情况下, 目标程序将在自己的逻辑地址空间内运行并存储数据.编译程序在生成代码时, 负责明确各类对象在逻辑地址空间是如何存放的, 以及目标代码运行时, 如何使用逻辑地址空间. + +在编译过程中, 源程序的对象地址分配往往是相对于运行存储空间的偏移量, 对象访问采用“基地址+偏移量”寻址方式进行, 使得可以选择内存的任意可用区域作为目标程序运行时的存储区.这样生成的目标代码称为浮动地址代码 + +> **注:“基地址”是指运行存储空间之首址.** + +**重点:符号表的内容、组织, 过程调用实现, ** + +**静态存储分配、动态存储分配的基本方法.** + +**难点:参数传递, 过程说明语句代码结构, ** + +​ **过程调用语句的代码结构, ** + +​ **过程调用语句的语法制导定义, ** + +​ **栈式存储分配. + +编译程序生成的代码大小通常是固定的, 一般存放在专用的区域, 即代码区; +目标程序运行过程中, 需要创建和访问的数据对象存放在数据区. + +![alt text](./photo/stack.png) + + +数据空间分配是将**源程序数据对象名与给定的数据存储空间地址建立映射关系**. + +数据对象名与数据存储地址可能是一对多的关系, 因为在源程序中说明的一个数据对象, 在运行时可能对应不同的存储地址, 如递归程序中的局部变量. + +## 静态存储分配 + +静态存储管理是一种最简单的存储管理. + +**当在编译阶段能够确定源程序中各个数据实体的存储空间大小**时, 就可以采用静态存储管理.一般而言, 适于静态管理的语言必须满足下面的条件: + +1. 数组的上下界必须是常数; +2. 过程调用不允许递归; +3. 不允许用户动态地建立数据实体 + +对于静态存储分配, 数据空间仅需要有静态数据区即可. + +在源程序翻译时, 对于所有数据对象, 其分配的存储地址都是相对于静态数据区的偏移量. + +这个偏移量就是登记在符号表中数据对象的地址( .place)属性值. + +在目标程序运行时, 访问数据对象的绝对地址是: + +**绝对地址=静态数据区首址+偏移量.** + +## 动态存储分配 + +如果源语言允许递归调用、可变数组和允许运行期间自由申请与释放空间, 那么其需占用的存储空间在编译阶段无法确定, 这样数据对象就需要采用动态存储分配的策略. + +所谓动态存储分配是指在运行期间, 动态进行存储地址分配. + +•**基于控制栈的原理, 存储空间被组织成栈, 活动记录的推入和弹出分别对应于活动的开始和结束.** + +•**与静态分配不同, 在每次活动中把局部名字和新的存储单元绑定, 在活动结束时, 活动记录从栈中弹出, 因此局部名字的存储空间也随之消失.** + +### 栈式动态存储分配 + +由于过程允许递归, 在某一时刻一个过程A 很可能已被自己调用了若干次, 但只有最近一次正处于执行状态, 而其余各次则处于等待返回被中断的那次调用的状态. + +这样, 属于每次调用相应的数据区中的内容就必须保存起来, 以便于调用返回时继续使用 + +对于这种语言来说, 其存储分配策略必须采用栈式存储管理, 即引入一个运行栈, 让过程的每一次执行和过程的调用记录相对应, 每调用一次过程, 就把该过程的相应调用记录推入栈中, 过程执行结束时再把栈顶的调用记录从找中弹出. + +> 在运行期间以子程序数据区为基本单位, 在数据空间栈中进行动态地址分配. +> +> 当调用子程序时, 在数据空间栈顶, 给子程序分配所需的子程序数据区; +> +> 当子程序返回时, 从数据空间栈顶, 收回分配给子程序所占用存储区. +> +> 当子程序被递归调用时, 同一个子程序可能在数据空间中同时拥有多个子程序数据区, 每个数据区对应于同一个子程序的一次执行过程. + +### 堆式动态存储分配 + +某些程序设计语言(如C 和PASCAL等)允许程序在运行时, 为其中的一些变量动态地申请和释放所需的存储空间, 并且申请和释放这两类操作可以在任何时间、以任意的顺序来进行, 这就需要一种更为灵活和更加有效的动态分配策略, 即堆式存储分配来完成上述工作. + +堆式分配的基本思想是:**为正运行的程序划出一适当大的存储区域, 称之为堆(Heap) ; 每当该程序提出申请时, 就按某种分配原则在堆的自由区(可占用区) 中, 找出一块能满足其需求的存储空间分配给它, 对于释放操作, 则是将程序不再占用的存储空间归还给堆的自由区.** + +可能遇到的各种情况与操作系统给进程分配存储空间时遇到的极其相似, 如同样会出现“碎片”现象等, 其根本差异就在于分配的层次和分配对象的粒度. + +## 活动记录 + +1.活动记录本质是什么? + +> 活动记录本质上是每次为函数调用时分配的一大块内存.一个函数的活动记录只由在函数被调用时才会创建, 并且当函数返回时就会被销毁. + +2.活动记录是如何存在的? + +> 活动记录被组织在栈中, 栈可以是物理上的实体也可以是逻辑上的概念.在数据结构中的栈是一个逻辑上的概念, 而芯片中也可以根据这个概念来设计一部分电路, 这部分能够模拟栈操作的电路就是物理意义上的栈了. +> 主函数的活动记录位于栈底, 当一个函数调用另外一个函数时, 被调用函数的活动记录就会被压入栈.或当记录所在的栈满足数据结构中的栈的特性:FILO(first in last out).这个限制使得当主调函数和被调函数中出现了同名函数时, 在执行被调函数时主调函数的变量对被调函数来说是不可见的. +> 特别提醒:大部分计算机为活动记录栈分配内存地址都是从高到低! + +3.活动记录是如何进行入栈出栈的? + +> 由于活动记录是位于一个栈中的, 所以要近栈就需要知道栈结束处的位置, 当出栈时就需要知道当前活动记录之前的一个活动记录的结束点. +> 所以编译器和硬件都会维护两个很重要的值:栈指针, 帧指针. +> 栈指针:始终指向战结束处(注意不是栈底!)的地址, 如果有新的活动记录入栈, 那里就是新活动记录的起始地址所在. +> 帧指针:保存着先前那个活动记录的结束处的地址, 在当前函数返回后, 栈指针就会指向那里. +> 栈指针和帧指针就是用来界定活动记录的, 并操作活动记录 + diff --git a/NJU-Notes/Lecture1_Lexer1.md b/NJU-Notes/Lecture1_Lexer1.md new file mode 100644 index 0000000..77aca57 --- /dev/null +++ b/NJU-Notes/Lecture1_Lexer1.md @@ -0,0 +1,44 @@ +# Chapter 1 Lexer-1 + +>main topic: 词法分析器生成器 ANTLR v4 + +## Course Note + +对于词法分析器: + +- 输入: 程序文本/字符串 s (CharStream) + 词法单元 (token) 的规约 +- 输出: 词法单元流 (TokenStream) + +交互过程: + +- 源程序 -> 词法分析器 _<-_/-> _getNextToken_/词法单元 _<-_/-> 语法分析器 -> 输出至语义分析 +- 符号表分别双向链接 __词法分析器__ & __语法分析器__ + +词法分析器的三种设计方法 + +- 词法分析器生成器 +- 手写词法分析器 +- 自动化词法分析器 + +ANTLR使用方法 + +1. 命令行式使用 ANTLR v4: https://www.antlr.org/ +2. 交互式使用 ANTLR v4: https://www.antlr.org/tools.html +3. 编程式使用 ANTLR v4: https://docs.gradle.org/current/userguide/antlr_plugin.html + +[ANTLR](https://www.antlr.org/) v4 中的冲突解决规则 + +- 最前优先匹配: + - 关键字 vs. 标识符 + - ML_COMMENT vs. DOC_COMMENT +- 最长优先匹配: + - eg: 1.23 / >= / ifhappy +- 非贪婪匹配: + - eg: ()??, ()\*?, ()+? + +具体可以见video中讲解 / 下一节对于基础符号的说明 + +## Slide + +[1-lexer-antlr](https://github.com/courses-at-nju-by-hfwei/compilers-lectures/blob/master/2024/1-lexer-antlr/1-lexer-antlr-handout.pdf) + diff --git a/NJU-Notes/Lecture2_Lexer2.md b/NJU-Notes/Lecture2_Lexer2.md new file mode 100644 index 0000000..50b0ad0 --- /dev/null +++ b/NJU-Notes/Lecture2_Lexer2.md @@ -0,0 +1,35 @@ +# Chapter 2 Lexer-2 + +>main topic: 手写词法分析器 + +## Course Note + +常见表达 + +- $digit = [0-9]$ +- $digits = digit^+ = [1-9]$ +- $number = digits(.digits)?(E[+-]?digits)?$ + - 正整数、小数点、指数 +- $letter = [A-Za-z]$ +- $id = letter(letter|digit)^*$ +- $relop = < > | <= | >= | <>$ + + + 手写的技巧 + + - 向前看、向前走、调整状态 + - 记录来时最长匹配、无路可走便回头(回溯到上一个正确位置) + - nextToken() + - while (nextToken()) + +如何区分 int、real 与 sci? + +>num: 整数部分\[. 可选的小数部分]\[E\[可选的 +-] 可选的指数部分] + +- 在 real 与 sci 中, 有时需要回退, 寻找最长匹配 +- 根据下一个字符即可判定词法单元的类型;否则, 调用错误处理模块 (对应 other), 报告该字符有误, 忽略该字符 + +## Slide + +[2-lexer-handwritten](https://github.com/courses-at-nju-by-hfwei/compilers-lectures/blob/master/2024/2-lexer-handwritten/2-lexer-handwritten-handout.pdf) + diff --git a/NJU-Notes/Lecture3_REandAuto.md b/NJU-Notes/Lecture3_REandAuto.md new file mode 100644 index 0000000..aee1462 --- /dev/null +++ b/NJU-Notes/Lecture3_REandAuto.md @@ -0,0 +1,301 @@ +# Chapter 3 Regular Expression and Automata + +>main topic: 正则表达式与自动机理论 + +## Course Notes +### Outline + +目标: 正则表达式 RE =⇒ 词法分析器 + +![[Pasted image 20240419003223.png|400]] + +### Basic + +Definition (字母表) + +- 字母表 Σ 是一个 __有限的符号集合__ + +Definition (串) + +- 字母表 Σ 上的串 (s) 是由 Σ 中 __符号构成__ 的一个 __有穷序列__ + +Definition (串上的 “连接” 运算) + +- x = dog, y = house , xy = doghouse +- sϵ = ϵs = s + +Definition (串上的 “指数” 运算) + +- $s^0 ≜ \epsilon$ +- $s^i ≜ ss^{i-1}$ + +Definition (语言) + +- 语言是给定字母表 Σ 上一个任意的 _可数_ 的 __串集合__ + - ∅ + - {ϵ} + - id : {a, b, c, a1, a2, . . . } + - ws : {blank, tab, newline} + - if : {if} +- __语言是串的集合__ +- 因此, 我们可以通过 _集合操作构造新的语言_ + +语言的运算 + +1. L和M的并:L U M = {s | s属于L or s属于M} +2. L和M的连接:LM = {st | s属于L 且 t属于M} +3. L的Kleene闭包:L\* = $U^{\inf}_{i=0} L^i$ +4. L的正闭包:$L^+ = U^{\inf}_{i=1}L^i$ + +### Regular Expression + +- 每个正则表达式 r 对应一个正则语言 L(r) +- __正则表达式是语法, 正则语言是语义__ +- eg: + - ID: \[a-zA-Z]\[a-zA-Z0-9]\* + - the language: {a1, a2, ab, . . .} + +Definition (正则表达式) +给定字母表 Σ, Σ 上的正则表达式由且仅由以下规则定义: + +- (1) ϵ 是正则表达式; +- (2) ∀a ∈ Σ, a 是正则表达式; +- (3) 如果 r 是正则表达式, 则 (r) 是正则表达式; (即:是否加括号不影响语言) +- (4) 如果 r 与 s 是正则表达式, 则 r|s, rs, r ∗ 也是正则表达式。 + +ps +- 运算优先级: () ≻ ∗ ≻ "连接" ≻ | + - eg: (a)|((b) ∗ (c)) ≡ a|b ∗ c + + +每个正则表达式 r 对应一个正则语言 L(r) + + +Definition (正则表达式对应的正则语言) + +1. L(ϵ) = {ϵ} +2. L(a) = {a}, ∀a ∈ Σ +3. L((r)) = L(r) +4. 或 / 连接 / Kleene闭包 + - L(r|s) = L(r) ∪ L(s) + - L(rs) = L(r)L(s) + - L($r^*$) = $(L(r))^∗$ + +PS: + +1. 常见的正则表达式文法 + +![[Pasted image 20240419004947.png|400]] + +2. 正则表达式转换网站:[regex101](https://regex101.com/r/C0m3kB/1) + +### Automata + +根据表达/计算能力的强弱, 自动机可以分为不同层次: + +>Turing Machine > Pushdown Automaton > Finite-state machine > Combinational logic + + +![[Pasted image 20240419013526.png|400]] + +#### NFA + +Definition (NFA (Nondeteministic Finite Automaton)) +非确定性有穷自动机 , A 是一个五元组 A = (Σ, S, s 0 , δ, F): + +- (1) 字母表 Σ (ϵ ∈ / Σ) +- (2) 有穷的状态集合 S +- (3) 唯一的初始状态 s0 +- (4) 状态转移函数 δ∈S + - δ : S × (Σ ∪ {ϵ}) → $2^S$ +- (5) 接受状态集合 F ⊆ S + +1. 约定: 所有没有对应出边的字符默认指向 “空状态” ∅ +2. (非确定性) 有穷自动机是一类极其简单的计算装置,它可以识别 (接受/拒绝) Σ 上的字符串 + +Definition (接受 (Accept)) +(非确定性) 有穷自动机 A __接受__ 字符串 x, 当且仅当 __存在__ 一条从开始状态 s 0 到 __某个__ 接受状态 f ∈ F、标号为 x 的路径 + +因此, A 定义了一种语言 L($A$): 它能接受的所有字符串构成的集合 + +关于自动机 A 的两个基本问题: + +- Membership 问题: 给定字符串 x, x ∈ L(A)? +- L(A) 究竟是什么? + +#### DFA + +Definition (DFA (Deterministic Finite Automaton)) 确定性有穷自动机 +A 是一个五元组 A = (Σ, S, $s_0$ , $δ$, F): + +- (1) 字母表 Σ (ϵ ∈ / Σ) +- (2) 有穷的状态集合 S +- (3) 唯一的初始状态 $s_0$ ∈ S +- (4) 状态转移函数 δ + - δ : S × Σ → S +- (5) 接受状态集合 F ⊆ S + +1. 约定: 所有没有对应出边的字符默认指向一个 “死状态” + +### Design + +1. NFA 简洁易于理解, 便于描述语言 L(A) +2. DFA 易于判断 x ∈ L(A), 适合产生词法分析器 + +3. 我们的策略:用 NFA 描述语言, 用 DFA 实现词法分析器 RE + - ⇒ NFA ⇒ DFA ⇒ 词法分析器 + +#### 从 RE 到 NFA: Thompson 构造法 + +- RE ⇒ NFA +- r ⇒ N(r) +- 要求 : L(N(r)) = L(r) + +Thompson 构造法的基本思想: __按结构归纳__ + +1. ϵ 是正则表达式 +2. a ∈ Σ 是正则表达式 +3. 如果 s 是正则表达式, 则 (s) 是正则表达式 +4. 如果 s, t 是正则表达式, 则 s|t 是正则表达式 +5. 如果 s, t 是正则表达式, 则 st 是正则表达式 +6. 如果 $s$ 是正则表达式, 则 $s^*$ 是正则表达式 + + +N(r) 的 性质 以及 Thompson 构造法 复杂度分析 + +1. N(r) 的开始状态与接受状态均唯一 +2. 开始状态没有入边, 接受状态没有出边 +3. N(r) 的状态数 |S| ≤ 2 × |r| (|r| : r 中运算符与运算分量的总和) +4. 每个状态最多有两个 ϵ-入边与两个 ϵ-出边 +5. ∀a ∈ Σ, 每个状态最多有一个 a-入边 与一个 a-出边 + +#### 从 NFA 到 DFA: 子集构造法 + +子集构造法:Subset / Powerset Construction + +- NFA ⇒ DFA +- N ⇒ D +- 要求 : L(D) = L(N) + +子集构造法的思想: 用 DFA 模拟 NFA + +构造方法: + +1. 从状态 s 开始, __只__ 通过 ϵ-转移 可达的状态集合 + - ϵ-closure(s) = {t ∈ $S_N$ |s − $\epsilon^*$→ t} +2. ϵ-closure(T) = $∪_{s\in T}$ ϵ-closure(s) +3. move(T, a) = $∪_{s\in T}$ δ(s, a) + +子集构造法 (N =⇒ D) 的原理: + +- N : ($Σ_N$ , $S_N$ , $n_0$ , $δ_N$ , $F_N$ ) +- D : ($Σ_D$ , $S_D$ , $d_0$ , $δ_D$ , $F_D$ ) +- ΣD =ΣN +- S D ⊆ $2^{S_N}$ (∀s D ∈ S D : s D ⊆ S N ) + +1. 初始状态 d 0 = ϵ-closure(n 0 ) +2. 转移函数 ∀a ∈ Σ D : δ D (s D , a) = ϵ-closure(move(s D , a)) +3. 接受状态集 F D = {s D ∈ S D | ∃ f ∈ F N . f ∈ s D } + +子集构造法的复杂度分析: (|S N | = n) + +- | $S_D$ | = Θ ($2^n$) = O($2^n$) ∩ Ω($2^n$ ) + +闭包: + +1. 闭包 (Closure): f-closure(T) +2. ϵ-closure(T) +3. T ⇒ f(T) ⇒ f(f(T)) ⇒ f(f(f(T))) ⇒ . . . 直到找到 x 使得 f(x) = x (x 称为 f 的 _不动点_) + +#### DFA 最小化算法 + +基本思想: 等价的状态可以合并 + +如何定义等价状态? + +- “等价”的符号表示:s ∼ t +- 定义“等价”:s ∼ t ⇐⇒ ∀a ∈ Σ. (s --a→ s ′) ∧ (t −-a→ t ′) ⇒ (s ′ ∼ t ′ ) + +基于该定义, 不断合并等价的状态, 直到无法合并为止! + +- s ∼ t ⇐⇒ ∀a ∈ Σ. (s −-a→ s ′ ) ∧ (t −-a→ t ′ ) =⇒ (s ′ ∼ t ′ ). + - 缺少基础情况, 不知从何下手 + +- s ≁ t ⇐⇒ ∃a ∈ Σ. (s −-a→ s ′) ∧ (t −-a→ t ′ ) ∧ (s ′ ≁ t ′ ) + - 划分, 而非合并! + +_接受状态_ 与 _非接受状态_ 必定不等价 => 空串 ϵ 区分了这两类状态 + +DFA 最小化等价状态划分方法: + +1. Π = {F, S \ F} +2. 直到再也无法划分为止 (不动点!) +3. 然后, 将同一等价类里的状态合并 +4. 要注意处理 “死状态” + +PS: + +- 不适用于 NFA 最小化; +- NFA 最小化问题是 PSPACE-complete 的 + +Definition (可区分的 (Distinguishable); 等价的 (Equivalent)) + +- 如果存在某个能区分状态 s 与 t 的字符串, 则称 s 与 t 是可区分的; +- 否 则, 称 s 与 t 是等价的 + +Definition (字符串 x 区分状态 s 与 t) + +- 如果分别从 s 与 t 出发, 沿着标号为 x 的路径到达的两个状态中只有一个是接受状态, 则称 x 区分了状态 s 与 t + +#### 从DFA到词法分析器 + +原则: + +- 最前优先匹配: abb (比如 关键字) +- 最长优先匹配: aabbb + +方式: + +1. 根据正则表达式构造相应的 NFA +2. 如有需要先合并NFA(要保留各个 NFA 的接受状态信息, 并采用最前优先匹配原则) +3. 使用子集构造法将 NFA 转化为等价的 DFA (需要消除 “死状态”, 避免词法分析器徒劳消耗输入流) +4. 模拟运行该 DFA, 直到无法继续为止 (输入结束或状态无转移) +5. 假设此时状态为 s + 1. 若 s 为接受状态, 则识别成功 + 2. 否则, 回溯 (包括状态与输入流) 至 _最近一次_ 经过的 __接受状态, 识别成功!__ + 3. 若没有经过任何接受状态, 则报错 (忽略第一个字符) + 4. 无论成功还是失败, 都从 __初始状态__开始继续识别下一个词法单元 + + +![[Pasted image 20240419012931.png|400]] + +![[Pasted image 20240419012955.png|400]] + +#### 从DFA到RE:Kleene构造法 + +- DFA ⇒ RE +- D ⇒ r +- 要求 : L(r) = L(D) + +这部分不做要求,故略! + +## Learn More about Regular Expressions + +Web Ref: [RE](https://en.wikipedia.org/wiki/Regular_expression#Patterns_for_non-regular_languages) + +Here we offer some basic examples: + +- https://regex101.com/r/jucEtW/1 (regex/bg-color) +- https://regex101.com/r/jchuZs/1 (regex/date) +- https://regex101.com/r/fWJkCF/1 (regex/dollar) +- https://regex101.com/r/K5MCMZ/1 (regex/cat) +- https://regex101.com/r/PUsCwP/1 (regex/html-head) +- https://regex101.com/r/eXue43/1 (regex/html-head-lookaround) +- https://regex101.com/r/l07Gpu/1 (regex/html-a-img) + +## Slide + +[03/04-REandAutonoma](https://github.com/courses-at-nju-by-hfwei/compilers-lectures/blob/master/2024/2-lexer-handwritten/2-lexer-handwritten-handout.pdf) + +[计算理论导引](https://ocw.mit.edu/courses/ 18-404j-theory-of-computation-fall-2020/) + diff --git a/NJU-Notes/Lecture4_CFGandPDA.md b/NJU-Notes/Lecture4_CFGandPDA.md new file mode 100644 index 0000000..0947634 --- /dev/null +++ b/NJU-Notes/Lecture4_CFGandPDA.md @@ -0,0 +1,73 @@ +# Chapter 4 CFG and PDA + +## CFG && CSG + +Definition (Context-Free Grammar (CFG); 上下文无关文法) + +上下文无关文法 G 是一个四元组 G = (T,N,S,P): + +- T 是终结符号 (Terminal) 集合, 对应于词法分析器产生的词法单元 ▶ N 是非终结符号 (Non-terminal) 集合 +- S 是开始 (Start) 符号 (S ∈ N 且唯一) +- P 是产生式 (Production) 集合 + +```bash +A ∈ N −→ α ∈ ( T ∪ N ) ∗ +``` + +- 头部/左部 (Head) A: 单个非终结符 +- 体部/右部 (Body) α: 终结符与非终结符构成的串, 也可以是空串 ε + + +PS: Context-Sensitive Grammar (CSG) 上下文敏感语法 + +```bash +aB → ab +bB → bb + +举例解释:很简单,比如这里B在前缀元素为a时,转换成ab;在前缀元素为b时,转换成bb +``` + +## PDA + +More info in [笔者的编译原理仓库](https://github.com/root-hbx/Compilers_Spring_2024) + + +## Basic Info + +__Definition (推导 (Derivation))__ + +推导即是将某个产生式的左边替换成它的右边;每一步推导需要选择替换哪个非终结符号, 以及使用哪个产生式 + +- Leftmost (最左) Derivation +- Rightmost (最右) Derivation + + +__Definition (Sentential Form; 句型)__ + +如果S⇒\*α,且α∈(T∪N) ,则称α是文法G的一个句型 + + +__Definition (Sentence; 句子)__ + +如果S=\*⇒w,且w∈T ,则称w是文法G的一个句子 + + +__Definition (文法 G 生成的语言 L(G))__ + +文法 G 的语言 L(G) 是它能推导出的所有句子构成的集合。 + +L ( G ) = { w | S ⇒\* w } + +1. 语法分析器的任务: 为输入的词法单元流寻找推导、构建语法分析树, 或者报错 + +2. 正则表达式的表达能力严格弱于上下文无关文法 + +3. Theorem +>L = {anbn | n ≥ 0} 无法使用正则表达式描述 + +__Pumping Lemma for Regular Languages__ + +If L is a regular language, then there exists a number p ≥ 1 (pumping length) such that any string s in L of length ≥ p can be divided into three pieces, s = xyz, satisfying the following conditions: + +(i) |y| ≥ 1 (ii) |xy| ≤ p (iii) ∀i≥0: $xy^iz$ ∈ L + diff --git a/NJU-Notes/Lecture5_LL1.md b/NJU-Notes/Lecture5_LL1.md new file mode 100644 index 0000000..82f4285 --- /dev/null +++ b/NJU-Notes/Lecture5_LL1.md @@ -0,0 +1,40 @@ +# Chapter 5 递归下降的 LL(1) 语法分析器 + +## 引入 + +1. 只考虑无二义性的文法, 每个句子对应唯一的一棵语法分析树 +2. 自顶向下的、递归下降的、基于预测分析表的、适用于LL(1) 文法的 LL(1) 语法分析器 + +## 设计规则 + +- 根节点是文法的起始符号 S +- 每个中间节点表示对某个非终结符应用某个产生式进行推导 (Q : 选择哪个非终结符, 以及选择哪个产生式) +- 叶节点是词法单元流 w$ ,仅包含终结符号与特殊的文件结束符 $ (EOF) + + +1. 在推导的每一步, LL(1) 总是选择最左边的非终结符进行展开 +2. LL(1): 从左向右读入词法单元 + +## 使用预测分析表确定产生式 + +Definition (预测分析表) + +>指明了每个非终结符在面对不同的词法单元或文件结束符时, 该选择哪个产生式 (按编号进行索引) 或者报错 (空单元格) + +Definition (LL(1) 文法) + +如果文法 G 的预测分析表是无冲突的, 则 G 是 LL(1) 文法 + +无冲突: 每个单元格里只有一个产生式 (编号) + +对于当前选择的非终结符, 仅根据输入中当前的词法单元 (LL(1)) 即可确定需要使用哪条产生式 + +## First Set && Follow Set + +- First(α) 是可从 α 推导得到的句型的首终结符号的集合 +- Follow(A) 是可能在某些句型中紧跟在 A 右边的终结符的集合 + +![alt text](./photo/first.png) +![alt text](./photo/second.png) + + diff --git a/NJU-Notes/Lecture6_Astar.md b/NJU-Notes/Lecture6_Astar.md new file mode 100644 index 0000000..aadd161 --- /dev/null +++ b/NJU-Notes/Lecture6_Astar.md @@ -0,0 +1,15 @@ +# Chapter 6 Adaptive LL(∗) 语法分析算法 + +LL(1) 语法分析算法的处理能力有限 (左递归文法, 带左公因子的文法) + +ANTLR 4 采用的 Adaptive LL(∗) 语法分析算法功能强大 + +1. ANTLR 4 自动将类似 expr 的左递归规则重写成非左递归形式 +2. ANTLR 4 提供优秀的错误报告功能和复杂的错误恢复机制 +3. ANTLR 4 几乎能处理任何文法 (二义性文法 间接左递归) + +采取动态分析, 而非静态分析: Adaptive LL(∗) + +![alt text](./photo/astar1.png) +![alt text](./photo/astar2.png) + diff --git a/NJU-Notes/Lecture7_SymbolTable.md b/NJU-Notes/Lecture7_SymbolTable.md new file mode 100644 index 0000000..9eef6b6 --- /dev/null +++ b/NJU-Notes/Lecture7_SymbolTable.md @@ -0,0 +1,14 @@ +# Chapter 7 Symbol Table + +类型检查 (Type Checking) +符号 (Symbols) 检查 + +## Symbol Table + +Definition (符号表 (Symbol Table)) +>符号表是用于保存各种符号相关信息的数据结构 + +![alt text](./photo/stable.png) + +作用域:全局作用域、函数/方法作用域、局部作用域 + diff --git a/NJU-Notes/Lecture8_semantics.md b/NJU-Notes/Lecture8_semantics.md new file mode 100644 index 0000000..2a7b1ab --- /dev/null +++ b/NJU-Notes/Lecture8_semantics.md @@ -0,0 +1,90 @@ +# Chapter 8 Semantics Analysis + +>Review +>1. Regular Expression (词法分析) +>2. Context-Free Grammar (语法分析) + +## Attribute Grammar + +属性文法 (Attribute Grammar): 为上下文无关文法赋予语义 + +- 按照从左到右的深度优先顺序遍历语法分析树 +- 关键: 在合适的时机执行合适的动作,计算相应的属性值 +- 在语法分析过程中实现属性文法 + +__在语法分析过程中实现属性文法__ + +1. 语义动作嵌入的位置决定了何时执行该动作 +2. 基本思想: 一个动作在它 __左边__ 的所有文法符号都处理过之后立刻执行 + + +## 继承属性文法 + +L.inh 将声明的类型沿着标识符列表向下传递 + +## 综合属性文法 + +Definition (综合属性 (Synthesized Attribute)) + +>节点 N 上的综合属性只能通过 N 的子节点或 N 本身的属性来定义 + + +## SDD + +Definition (语法制导定义 (Syntax-Directed Definition; SDD)) + +>SDD 是一个上下文无关文法和属性及规则的结合 + +- 每个文法符号都可以关联多个属性 +- 每个产生式都可以关联一组规则 +- SDD 唯一确定了语法分析树上每个非终结符节点的属性值 (SDD 没有规定以什么方式、什么顺序计算这些属性值) + +注释 (annotated) 语法分析树: 显示了各个属性值的语法分析树 + +## Depending Graph + +依赖图 用于确定一棵给定的语法分析树中各个属性实例之间的依赖关系 + +- S 属性定义的依赖图刻画了属性实例之间自底向上的信息流动, 此类属性值的计算可以在自顶向下的 LL 语法分析过程中实现 +- 在 LL 语法分析器中, 递归下降函数 A 返回 时, 计算相应节点 A 的综合属性值 + +## Inherited Attribute + +Definition (继承属性 (Inherited Attribute)) + +>节点 N 上的继承属性只能通过N 的父节点、N 本身和 N 的兄弟节 点上的属性来定义 + +继承信息流向: 先从左向右、从上到下传递信息 + +## L-Attributed Definition + +Definition (L 属性定义 (L-Attributed Definition)) 如果一个 SDD 的每个属性 + +1. 要么是综合属性, +2. 要么是继承属性, 但是它的规则满足如下限制:对于产生式 A → X1X2 . . . Xn 及其对应规则定义的继承属性 Xi.a, 则这个规则只能使用 + - (a) 和产生式头 A关联的继承属性; + - (b) 位于Xi 左边的文法符号实例 X1、X2、. . . 、Xi−1 相关的继承属性或综合属性; + - (c) 和这个 Xi 的实例本身相关的继承属性或综合属性, 但是在由这个Xi 的全部属性组成的依赖图中不存在环。 则它是 L 属性定义 + +## 逆波兰表达式 + +Definition (后缀表示 (Postfix Notation)) + +1. 如果 E 是一个 变量或常量, 则 E 的后缀表示是 E 本身; +2. 如果 E 是形如 E1 op E2 的表达式, 则 E 的后缀表示是 E1′ E2′ op, 这里 E1′ 和 E2′ 分别是 E1 与 E2 的后缀表达式; +3. 如果 E 是形如 (E1) 的表达式, 则 E 的后缀表示是 E1 的后缀表示 + +![alt text](./photo/bolan.png) + +## SDT + +Definition (语法制导的翻译方案 (Syntax-Directed Translation Scheme; SDT)) + +>SDT 是在其产生式体中嵌入语义动作的上下文无关文法 + +后缀翻译方案: 所有动作都在产生式的最后 + +![alt text](./photo/sdt1.png) + +![alt text](./photo/sdt2.png) + diff --git a/NJU-Notes/Lecture9_Controlling.md b/NJU-Notes/Lecture9_Controlling.md new file mode 100644 index 0000000..2489826 --- /dev/null +++ b/NJU-Notes/Lecture9_Controlling.md @@ -0,0 +1,10 @@ +# Chapter 9 中间代码生成 + +>中间代码生成 + +- 表达式的翻译 +- 代码回填技术 +- 控制流语句的翻译 + +这一部分没啥note,理解就行 + diff --git a/NJU-Notes/Outline.md b/NJU-Notes/Outline.md new file mode 100644 index 0000000..71ec675 --- /dev/null +++ b/NJU-Notes/Outline.md @@ -0,0 +1,81 @@ +# Outline + +> - this note is made by BoxuanHu in Spring 2024 +> - the main topic is "Compilers" + +事实上这门课的深入学习需要三个方面齐同协进 + +1. 知识提纲梳理 +2. 知识的“书面推导与运用” +3. 代码设计与构造逻辑 + +这篇笔记聚焦于 __知识提纲梳理__,书面推导与运用见[笔者仓库对应部分](https://github.com/root-hbx/Compilers_Spring_2024),代码设计见[NJU课程官网实验解析](http://docs.compilers.cpl.icu/#/2024/hw) + + +## Compilers + +This course is taught by Prof. [Hengfeng Wei @NJU](https://github.com/hengxin) + +课程设计 + +- 教材:[Compilers: Principles, Techniques, and Tools](https://zh.wikipedia.org/wiki/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86_(%E6%95%99%E6%9D%90)) (大名鼎鼎的“龙书”) +- 内容:理论部分基本按照龙书节奏叙述。包括词法分析、语法分析、语义分析、运行时环境、寄存器分配、代码优化与生成等内容 +- 特点:选用了当下热门的 ANTLR (ANother Tool for Language Recognition) v4 编程语言解析生成工具辅助教学,能让使用者专心词法或者语法分析的设计 + +课程配套 + +- Course Homepage: [NJU-Compilers-Spring-2024](http://docs.compilers.cpl.icu/#/) +- Piazza: [NJU-Compilers-Chatting](https://2024-compilers-at-software-nju.zulipchat.com/#narrow/stream/419310-general) +- Course Online: [Bilibili-NJU-Compilers-Spring-2024](https://space.bilibili.com/479141149/channel/collectiondetail?sid=2312309) + +## Appendix + +由于时间原因,本教程Online版没有图片,仅仅是个人笔记缩略版,如需PDF教程,请移步至[Compilers @bxhu](https://github.com/root-hbx/Compilers_Spring_2024) + +Reference: + +- [Berkeley](http://www-inst.eecs.berkeley.edu/): [CS164 - Programming Languages and Compilers](http://www-inst.eecs.berkeley.edu/~cs164), +- [CMU](http://www.cs.cmu.edu/): 15411 - Compiler Design ( [F09](http://www.cs.cmu.edu/~fp/courses/15411-f09/), [F11](http://symbolaris.com/course/compiler11.html), [F15](https://www.cs.cmu.edu/~rjsimmon/15411-f15/)) +- [MIT](http://staff.ustc.edu.cn/~yuzhang/compiler/www.eecs.mit.edu): [6.036 - Computer Language Engineering](http://6.035.scripts.mit.edu/sp16/) +- [Stanford](http://cs.stanford.edu/): [CS143 - Compilers](http://www.stanford.edu/class/cs143/) + +### Compiler Generator + +- **Generating Lexer**: [Flex](http://flex.sourceforge.net/) ([for windows](http://gnuwin32.sourceforge.net/packages/flex.htm)), JFlex([_link1_](http://jflex.de/), [_link2_](http://sourceforge.net/projects/jflex/)) + **Grammar-Lex Spec.**:[ANSI-C](http://www.quut.com/c/ANSI-C-grammar-l.html) +- **Generating Parser**: [Bison](http://www.gnu.org/software/bison/) ([for windows](http://gnuwin32.sourceforge.net/packages/bison.htm)), [Java CUP](http://www2.cs.tum.edu/projects/cup/), [JavaCC](https://javacc.dev.java.net/), [ANTLR](http://www.antlr.org/) ([Why use ANTLR](http://www.bearcave.com/software/antlr/antlr_expr.html)) + **Grammar**: [ANSI-C](http://www.quut.com/c/ANSI-C-grammar-y.html) + +### Compilers + +- [Compiler Explorer](https://godbolt.org/) +- **[LCC](ftp://ftp.cs.princeton.edu/pub/packages/lcc/)**: [lcc-win](http://www.cs.virginia.edu/~lcc-win32/), [paper](http://research.microsoft.com/apps/pubs/default.aspx?id=68413), [book](http://product.china-pub.com/22711) +- **GCC**: [GNU GCC](http://gcc.gnu.org/), [MinGW](http://www.mingw.org/) +- **LLVM**: [llvm.org](https://llvm.org/), [clang](https://clang.llvm.org/), [MLIR](https://mlir.llvm.org/), [CIRCT](https://circt.llvm.org/), + [Getting Started with LLVM Core Libraries](https://getting-started-with-llvm-core-libraries-zh-cn.readthedocs.io/zh_CN/latest/) + +### ASM + +- [The Art of Assembly Language](http://www.plantation-productions.com/Webster/www.artofasm.com/index.html), [LinuxASM](http://www.plantation-productions.com/Webster/LinuxAsm/index.html) +- [HLA](http://www.plantation-productions.com/Webster/HighLevelAsm/index.html) +- **Assemblers**: [The GNU Assembler](http://sourceware.org/binutils/docs/as/index.html), [NASM](http://www.nasm.us/) + + +### XML + +- [W3C XML](http://www.w3.org/XML/), [W3C XML Schema](http://www.w3.org/XML/Schema) +- [XML.ORG.CN](http://www.xml.org.cn/), [W3School](http://www.w3school.com.cn/), [IBM DeveloperWorks - XML](http://www.ibm.com/developerworks/cn/xml/) + +### Architectures + +- [ACPI](http://www.acpi.info/)( [spec50](http://www.acpi.info/spec50.htm)) +- **IA32**: [IA-32 Intel Architecture Software Developer’s Manual](ftp://CSArch:USTC@202.38.79.74/7-ISAs/1.80x86(IA-32)/) +- **AMD64**: [AMD Developer Guides and Manuals](http://developer.amd.com/documentation/guides/pages/default.aspx): [V1: Application Programming](http://support.amd.com/us/Processor_TechDocs/24592.pdf), [V2: System Programming](http://support.amd.com/us/Processor_TechDocs/24592.pdf), [V3: General Purpose and System Instructions](http://support.amd.com/us/Processor_TechDocs/24594.pdf), [V4: 128-bit and 256 bit media instructions](http://support.amd.com/us/Processor_TechDocs/26568.pdf), [V5: 64-Bit Media and x87 Floating-Point Instructions](http://support.amd.com/us/Processor_TechDocs/26569.pdf). +- **MIPS**: [SPIM](http://pages.cs.wisc.edu/~larus/spim.html), [See MIPS Run](ftp://CSArch:USTC@202.38.79.74/1-books/Arch/), [MIPS32/64 Archtecture for Programmers](ftp://CSArch:USTC@202.38.79.74/7-ISAs/2.MIPS/) + +### Others + +- [BBS](http://fbbs.ustc.edu.cn/main.html): [Compiler](http://fbbs.ustc.edu.cn/cgi/bbsdoc?board=CompilerTech), [CSArch](http://fbbs.ustc.edu.cn/cgi/bbsdoc?board=CSArch)([ftp](ftp://CSArch:USTC@202.38.79.74/1-books)), [ASM](http://fbbs.ustc.edu.cn/cgi/bbsdoc?board=ASM), [Java](http://fbbs.ustc.edu.cn/cgi/bbsdoc?board=Java) +- The [Programming Language and Compiler Research](http://www.cs.cmu.edu/~mleone/language-research.html) Home Page. +- Browse [comp.compilers](news:comp.compilers) or [comp.lang.ml](news:comp.lang.ml) newsgroups. + diff --git a/NJU-Notes/photo/astar1.png b/NJU-Notes/photo/astar1.png new file mode 100644 index 0000000..560c5a4 Binary files /dev/null and b/NJU-Notes/photo/astar1.png differ diff --git a/NJU-Notes/photo/astar2.png b/NJU-Notes/photo/astar2.png new file mode 100644 index 0000000..913345e Binary files /dev/null and b/NJU-Notes/photo/astar2.png differ diff --git a/NJU-Notes/photo/bolan.png b/NJU-Notes/photo/bolan.png new file mode 100644 index 0000000..5280efc Binary files /dev/null and b/NJU-Notes/photo/bolan.png differ diff --git a/NJU-Notes/photo/first.png b/NJU-Notes/photo/first.png new file mode 100644 index 0000000..2836489 Binary files /dev/null and b/NJU-Notes/photo/first.png differ diff --git a/NJU-Notes/photo/sdt1.png b/NJU-Notes/photo/sdt1.png new file mode 100644 index 0000000..319383a Binary files /dev/null and b/NJU-Notes/photo/sdt1.png differ diff --git a/NJU-Notes/photo/sdt2.png b/NJU-Notes/photo/sdt2.png new file mode 100644 index 0000000..e531857 Binary files /dev/null and b/NJU-Notes/photo/sdt2.png differ diff --git a/NJU-Notes/photo/second.png b/NJU-Notes/photo/second.png new file mode 100644 index 0000000..eef07da Binary files /dev/null and b/NJU-Notes/photo/second.png differ diff --git a/NJU-Notes/photo/stable.png b/NJU-Notes/photo/stable.png new file mode 100644 index 0000000..9258fb1 Binary files /dev/null and b/NJU-Notes/photo/stable.png differ diff --git a/NJU-Notes/photo/stack.png b/NJU-Notes/photo/stack.png new file mode 100644 index 0000000..47eb69b Binary files /dev/null and b/NJU-Notes/photo/stack.png differ diff --git a/NJU-Compilers/0-overview-handout.pdf b/NJU-Slides/0-overview-handout.pdf similarity index 100% rename from NJU-Compilers/0-overview-handout.pdf rename to NJU-Slides/0-overview-handout.pdf diff --git a/NJU-Compilers/1-lexer-antlr-handout.pdf b/NJU-Slides/1-lexer-antlr-handout.pdf similarity index 100% rename from NJU-Compilers/1-lexer-antlr-handout.pdf rename to NJU-Slides/1-lexer-antlr-handout.pdf diff --git a/NJU-Compilers/10-llvm-ir-handout.pdf b/NJU-Slides/10-llvm-ir-handout.pdf similarity index 100% rename from NJU-Compilers/10-llvm-ir-handout.pdf rename to NJU-Slides/10-llvm-ir-handout.pdf diff --git a/NJU-Compilers/11-ir-expr-handout.pdf b/NJU-Slides/11-ir-expr-handout.pdf similarity index 100% rename from NJU-Compilers/11-ir-expr-handout.pdf rename to NJU-Slides/11-ir-expr-handout.pdf diff --git a/NJU-Compilers/12-ir-control-backpatch-handout.pdf b/NJU-Slides/12-ir-control-backpatch-handout.pdf similarity index 100% rename from NJU-Compilers/12-ir-control-backpatch-handout.pdf rename to NJU-Slides/12-ir-control-backpatch-handout.pdf diff --git a/NJU-Compilers/12-ir-control-handout.pdf b/NJU-Slides/12-ir-control-handout.pdf similarity index 100% rename from NJU-Compilers/12-ir-control-handout.pdf rename to NJU-Slides/12-ir-control-handout.pdf diff --git a/NJU-Compilers/12-ir-control-hard-handout.pdf b/NJU-Slides/12-ir-control-hard-handout.pdf similarity index 100% rename from NJU-Compilers/12-ir-control-hard-handout.pdf rename to NJU-Slides/12-ir-control-hard-handout.pdf diff --git a/NJU-Compilers/2-lexer-handwritten-handout.pdf b/NJU-Slides/2-lexer-handwritten-handout.pdf similarity index 100% rename from NJU-Compilers/2-lexer-handwritten-handout.pdf rename to NJU-Slides/2-lexer-handwritten-handout.pdf diff --git a/NJU-Compilers/3-lexer-re-automata-handout.pdf b/NJU-Slides/3-lexer-re-automata-handout.pdf similarity index 100% rename from NJU-Compilers/3-lexer-re-automata-handout.pdf rename to NJU-Slides/3-lexer-re-automata-handout.pdf diff --git a/NJU-Compilers/4-parser-antlr-handout.pdf b/NJU-Slides/4-parser-antlr-handout.pdf similarity index 100% rename from NJU-Compilers/4-parser-antlr-handout.pdf rename to NJU-Slides/4-parser-antlr-handout.pdf diff --git a/NJU-Compilers/5-parser-cfg-handout.pdf b/NJU-Slides/5-parser-cfg-handout.pdf similarity index 98% rename from NJU-Compilers/5-parser-cfg-handout.pdf rename to NJU-Slides/5-parser-cfg-handout.pdf index 9b7c495..5259270 100644 Binary files a/NJU-Compilers/5-parser-cfg-handout.pdf and b/NJU-Slides/5-parser-cfg-handout.pdf differ diff --git a/NJU-Compilers/6-parser-ll-handout.pdf b/NJU-Slides/6-parser-ll-handout.pdf similarity index 100% rename from NJU-Compilers/6-parser-ll-handout.pdf rename to NJU-Slides/6-parser-ll-handout.pdf diff --git a/NJU-Compilers/7-parser-allstar-handout.pdf b/NJU-Slides/7-parser-allstar-handout.pdf similarity index 100% rename from NJU-Compilers/7-parser-allstar-handout.pdf rename to NJU-Slides/7-parser-allstar-handout.pdf diff --git a/NJU-Compilers/8-symtable-handout.pdf b/NJU-Slides/8-symtable-handout.pdf similarity index 99% rename from NJU-Compilers/8-symtable-handout.pdf rename to NJU-Slides/8-symtable-handout.pdf index 540f9f9..c7a170d 100644 Binary files a/NJU-Compilers/8-symtable-handout.pdf and b/NJU-Slides/8-symtable-handout.pdf differ diff --git a/NJU-Compilers/9-semantics-ag-handout.pdf b/NJU-Slides/9-semantics-ag-handout.pdf similarity index 99% rename from NJU-Compilers/9-semantics-ag-handout.pdf rename to NJU-Slides/9-semantics-ag-handout.pdf index 78e0446..36f840b 100644 Binary files a/NJU-Compilers/9-semantics-ag-handout.pdf and b/NJU-Slides/9-semantics-ag-handout.pdf differ diff --git a/USTC-Slides/USTC-Compilers.md b/USTC-Slides/USTC-Compilers.md new file mode 100644 index 0000000..7fc2263 --- /dev/null +++ b/USTC-Slides/USTC-Compilers.md @@ -0,0 +1,65 @@ + +>copied from [USTC-Compilers](http://staff.ustc.edu.cn/~yuzhang/compiler/2019f/) + +Reference: + +- [Berkeley](http://www-inst.eecs.berkeley.edu/): [CS164 - Programming Languages and Compilers](http://www-inst.eecs.berkeley.edu/~cs164), +- [CMU](http://www.cs.cmu.edu/): 15411 - Compiler Design ( [F09](http://www.cs.cmu.edu/~fp/courses/15411-f09/), [F11](http://symbolaris.com/course/compiler11.html), [F15](https://www.cs.cmu.edu/~rjsimmon/15411-f15/)) +- [MIT](http://staff.ustc.edu.cn/~yuzhang/compiler/www.eecs.mit.edu): [6.036 - Computer Language Engineering](http://6.035.scripts.mit.edu/sp16/) +- [Stanford](http://cs.stanford.edu/): [CS143 - Compilers](http://www.stanford.edu/class/cs143/) + +### Compiler Generator + +- **Generating Lexer**: [Flex](http://flex.sourceforge.net/) ([for windows](http://gnuwin32.sourceforge.net/packages/flex.htm)), JFlex([_link1_](http://jflex.de/), [_link2_](http://sourceforge.net/projects/jflex/)) + **Grammar-Lex Spec.**:[ANSI-C](http://www.quut.com/c/ANSI-C-grammar-l.html) +- **Generating Parser**: [Bison](http://www.gnu.org/software/bison/) ([for windows](http://gnuwin32.sourceforge.net/packages/bison.htm)), [Java CUP](http://www2.cs.tum.edu/projects/cup/), [JavaCC](https://javacc.dev.java.net/), [ANTLR](http://www.antlr.org/) ([Why use ANTLR](http://www.bearcave.com/software/antlr/antlr_expr.html)) + **Grammar**: [ANSI-C](http://www.quut.com/c/ANSI-C-grammar-y.html) + +### Compilers + +- [Compiler Explorer](https://godbolt.org/) +- **[LCC](ftp://ftp.cs.princeton.edu/pub/packages/lcc/)**: [lcc-win](http://www.cs.virginia.edu/~lcc-win32/), [paper](http://research.microsoft.com/apps/pubs/default.aspx?id=68413), [book](http://product.china-pub.com/22711) +- **GCC**: [GNU GCC](http://gcc.gnu.org/), [MinGW](http://www.mingw.org/) +- **LLVM**: [llvm.org](https://llvm.org/), [clang](https://clang.llvm.org/), [MLIR](https://mlir.llvm.org/), [CIRCT](https://circt.llvm.org/), + [Getting Started with LLVM Core Libraries](https://getting-started-with-llvm-core-libraries-zh-cn.readthedocs.io/zh_CN/latest/) + +### ASM + +- [The Art of Assembly Language](http://www.plantation-productions.com/Webster/www.artofasm.com/index.html), [LinuxASM](http://www.plantation-productions.com/Webster/LinuxAsm/index.html) +- [HLA](http://www.plantation-productions.com/Webster/HighLevelAsm/index.html) +- **Assemblers**: [The GNU Assembler](http://sourceware.org/binutils/docs/as/index.html), [NASM](http://www.nasm.us/) + +### C & C++ + +- **Standards**:[C official home](http://www.open-std.org/jtc1/sc22/wg14/), [C++ official home](http://www.open-std.org/jtc1/sc22/wg21/) [ [P2137R0](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2137r0.html) ] +- **Materials**: [C Language Book Material](http://www.knosof.co.uk/cbook/cbook.html), [quut.com/C](http://www.quut.com/c/) + +### Java + +- **Specification**:[Java Language Specification](http://java.sun.com/docs/books/jls/), [Java Virtual Machine Specification](http://java.sun.com/docs/books/jvms/) +- **Tutorials**: [Java Tutorial](http://java.sun.com/docs/books/tutorial/), Thinking in Java([中文版](http://www.paper-translation.com/other/tij3.htm)) +- **Software**: [Java SDK](http://www.java.com/zh_CN/download/index.jsp)( [1.5](http://java.sun.com/j2se/1.5.0/docs/index.html), [6](http://java.sun.com/javase/6/docs/) ), [Eclipse IDE](http://www.eclipse.org/downloads) ([AST](http://www.docjar.com/html/api/org/eclipse/jdt/core/dom/AST.java.html)), [Ant](http://ant.apache.org/)([User Manual](http://ant.apache.org/manual/)) + +### Scala: OO meets Functional + +- Developed from 2001 in EPFL, v1.0 2003, +- [scala-lang.org](http://www.scala-lang.org/) + +### XML + +- [W3C XML](http://www.w3.org/XML/), [W3C XML Schema](http://www.w3.org/XML/Schema) +- [XML.ORG.CN](http://www.xml.org.cn/), [W3School](http://www.w3school.com.cn/), [IBM DeveloperWorks - XML](http://www.ibm.com/developerworks/cn/xml/) + +### Architectures + +- [ACPI](http://www.acpi.info/)( [spec50](http://www.acpi.info/spec50.htm)) +- **IA32**: [IA-32 Intel Architecture Software Developer’s Manual](ftp://CSArch:USTC@202.38.79.74/7-ISAs/1.80x86(IA-32)/) +- **AMD64**: [AMD Developer Guides and Manuals](http://developer.amd.com/documentation/guides/pages/default.aspx): [V1: Application Programming](http://support.amd.com/us/Processor_TechDocs/24592.pdf), [V2: System Programming](http://support.amd.com/us/Processor_TechDocs/24592.pdf), [V3: General Purpose and System Instructions](http://support.amd.com/us/Processor_TechDocs/24594.pdf), [V4: 128-bit and 256 bit media instructions](http://support.amd.com/us/Processor_TechDocs/26568.pdf), [V5: 64-Bit Media and x87 Floating-Point Instructions](http://support.amd.com/us/Processor_TechDocs/26569.pdf). +- **MIPS**: [SPIM](http://pages.cs.wisc.edu/~larus/spim.html), [See MIPS Run](ftp://CSArch:USTC@202.38.79.74/1-books/Arch/), [MIPS32/64 Archtecture for Programmers](ftp://CSArch:USTC@202.38.79.74/7-ISAs/2.MIPS/) + +### Others + +- [BBS](http://fbbs.ustc.edu.cn/main.html): [Compiler](http://fbbs.ustc.edu.cn/cgi/bbsdoc?board=CompilerTech), [CSArch](http://fbbs.ustc.edu.cn/cgi/bbsdoc?board=CSArch)([ftp](ftp://CSArch:USTC@202.38.79.74/1-books)), [ASM](http://fbbs.ustc.edu.cn/cgi/bbsdoc?board=ASM), [Java](http://fbbs.ustc.edu.cn/cgi/bbsdoc?board=Java) +- The [Programming Language and Compiler Research](http://www.cs.cmu.edu/~mleone/language-research.html) Home Page. +- Browse [comp.compilers](news:comp.compilers) or [comp.lang.ml](news:comp.lang.ml) newsgroups. + diff --git a/USTC-Slides/codegen-6in1.pdf b/USTC-Slides/codegen-6in1.pdf new file mode 100644 index 0000000..e17d5a5 Binary files /dev/null and b/USTC-Slides/codegen-6in1.pdf differ diff --git a/USTC-Slides/lexicalAnalysis-6in1.pdf b/USTC-Slides/lexicalAnalysis-6in1.pdf new file mode 100644 index 0000000..3ac155a Binary files /dev/null and b/USTC-Slides/lexicalAnalysis-6in1.pdf differ diff --git a/USTC-Slides/parsing-6in1.pdf b/USTC-Slides/parsing-6in1.pdf new file mode 100644 index 0000000..7c87743 Binary files /dev/null and b/USTC-Slides/parsing-6in1.pdf differ diff --git a/USTC-Slides/runtime-6in1.pdf b/USTC-Slides/runtime-6in1.pdf new file mode 100644 index 0000000..9088a27 Binary files /dev/null and b/USTC-Slides/runtime-6in1.pdf differ diff --git a/USTC-Slides/runtime-ex-6in1.pdf b/USTC-Slides/runtime-ex-6in1.pdf new file mode 100644 index 0000000..397ce4d Binary files /dev/null and b/USTC-Slides/runtime-ex-6in1.pdf differ diff --git a/USTC-Slides/typecheck-6in1.pdf b/USTC-Slides/typecheck-6in1.pdf new file mode 100644 index 0000000..0289f4a Binary files /dev/null and b/USTC-Slides/typecheck-6in1.pdf differ diff --git "a/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/CFG\344\270\216PDA.pdf" "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/CFG\344\270\216PDA.pdf" new file mode 100644 index 0000000..82fd351 Binary files /dev/null and "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/CFG\344\270\216PDA.pdf" differ diff --git "a/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/first\351\233\206\345\222\214follow\351\233\206.pdf" "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/first\351\233\206\345\222\214follow\351\233\206.pdf" new file mode 100644 index 0000000..38be012 Binary files /dev/null and "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/first\351\233\206\345\222\214follow\351\233\206.pdf" differ diff --git "a/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\344\270\255\351\227\264\344\273\243\347\240\201\347\224\237\346\210\220-\344\270\255\351\227\264\350\257\255\350\250\200.pdf" "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\344\270\255\351\227\264\344\273\243\347\240\201\347\224\237\346\210\220-\344\270\255\351\227\264\350\257\255\350\250\200.pdf" new file mode 100644 index 0000000..a2be51b Binary files /dev/null and "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\344\270\255\351\227\264\344\273\243\347\240\201\347\224\237\346\210\220-\344\270\255\351\227\264\350\257\255\350\250\200.pdf" differ diff --git "a/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\344\277\256\345\211\252\346\226\207\346\263\225.pdf" "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\344\277\256\345\211\252\346\226\207\346\263\225.pdf" new file mode 100644 index 0000000..80afe51 Binary files /dev/null and "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\344\277\256\345\211\252\346\226\207\346\263\225.pdf" differ diff --git "a/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\345\275\242\345\274\217\350\257\255\350\250\200\344\270\216\347\274\226\350\257\221\345\211\215\345\215\212\351\203\250\345\210\206.pdf" "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\345\275\242\345\274\217\350\257\255\350\250\200\344\270\216\347\274\226\350\257\221\345\211\215\345\215\212\351\203\250\345\210\206.pdf" new file mode 100644 index 0000000..e187f0f Binary files /dev/null and "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\345\275\242\345\274\217\350\257\255\350\250\200\344\270\216\347\274\226\350\257\221\345\211\215\345\215\212\351\203\250\345\210\206.pdf" differ diff --git "a/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\345\275\242\345\274\217\350\257\255\350\250\200\344\270\216\350\207\252\345\212\250\346\234\272+\347\274\226\350\257\221\345\216\237\347\220\206.pdf" "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\345\275\242\345\274\217\350\257\255\350\250\200\344\270\216\350\207\252\345\212\250\346\234\272+\347\274\226\350\257\221\345\216\237\347\220\206.pdf" new file mode 100644 index 0000000..774a4c0 Binary files /dev/null and "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\345\275\242\345\274\217\350\257\255\350\250\200\344\270\216\350\207\252\345\212\250\346\234\272+\347\274\226\350\257\221\345\216\237\347\220\206.pdf" differ diff --git "a/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\346\236\204\351\200\240LL(1)\345\210\206\346\236\220\350\241\250\345\256\214\346\225\264\350\277\207\347\250\213.pdf" "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\346\236\204\351\200\240LL(1)\345\210\206\346\236\220\350\241\250\345\256\214\346\225\264\350\277\207\347\250\213.pdf" new file mode 100644 index 0000000..2ba2ff4 Binary files /dev/null and "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\346\236\204\351\200\240LL(1)\345\210\206\346\236\220\350\241\250\345\256\214\346\225\264\350\277\207\347\250\213.pdf" differ diff --git "a/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\346\236\204\351\200\240LR(0)\345\222\214SLR(1)\345\210\206\346\236\220\350\241\250.pdf" "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\346\236\204\351\200\240LR(0)\345\222\214SLR(1)\345\210\206\346\236\220\350\241\250.pdf" new file mode 100644 index 0000000..afac0f6 Binary files /dev/null and "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\346\236\204\351\200\240LR(0)\345\222\214SLR(1)\345\210\206\346\236\220\350\241\250.pdf" differ diff --git "a/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\346\240\271\346\215\256\344\272\224\345\205\203\347\273\204\346\236\204\351\200\240\346\234\211\351\231\220\350\207\252\345\212\250\346\234\272.pdf" "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\346\240\271\346\215\256\344\272\224\345\205\203\347\273\204\346\236\204\351\200\240\346\234\211\351\231\220\350\207\252\345\212\250\346\234\272.pdf" new file mode 100644 index 0000000..948b3ab Binary files /dev/null and "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\346\240\271\346\215\256\344\272\224\345\205\203\347\273\204\346\236\204\351\200\240\346\234\211\351\231\220\350\207\252\345\212\250\346\234\272.pdf" differ diff --git "a/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\346\240\271\346\215\256\350\241\250\350\276\276\345\274\217\346\236\204\351\200\240\346\234\211\351\231\220\350\207\252\345\212\250\346\234\272.pdf" "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\346\240\271\346\215\256\350\241\250\350\276\276\345\274\217\346\236\204\351\200\240\346\234\211\351\231\220\350\207\252\345\212\250\346\234\272.pdf" new file mode 100644 index 0000000..b006771 Binary files /dev/null and "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\346\240\271\346\215\256\350\241\250\350\276\276\345\274\217\346\236\204\351\200\240\346\234\211\351\231\220\350\207\252\345\212\250\346\234\272.pdf" differ diff --git "a/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\347\256\227\347\254\246\344\274\230\345\205\210\346\226\207\346\263\225\357\274\210\346\236\204\350\241\250+\346\236\204\345\233\276\357\274\211.pdf" "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\347\256\227\347\254\246\344\274\230\345\205\210\346\226\207\346\263\225\357\274\210\346\236\204\350\241\250+\346\236\204\345\233\276\357\274\211.pdf" new file mode 100644 index 0000000..f16972f Binary files /dev/null and "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\347\256\227\347\254\246\344\274\230\345\205\210\346\226\207\346\263\225\357\274\210\346\236\204\350\241\250+\346\236\204\345\233\276\357\274\211.pdf" differ diff --git "a/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\350\257\255\346\263\225\346\240\221\345\222\214\346\266\210\351\231\244\345\267\246\351\200\222\345\275\222\345\233\236\346\272\257.pdf" "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\350\257\255\346\263\225\346\240\221\345\222\214\346\266\210\351\231\244\345\267\246\351\200\222\345\275\222\345\233\236\346\272\257.pdf" new file mode 100644 index 0000000..3ca6c1b Binary files /dev/null and "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\350\257\255\346\263\225\346\240\221\345\222\214\346\266\210\351\231\244\345\267\246\351\200\222\345\275\222\345\233\236\346\272\257.pdf" differ diff --git "a/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\350\277\220\350\241\214\346\227\266\345\255\230\345\202\250\347\251\272\351\227\264\347\273\204\347\273\207.pdf" "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\350\277\220\350\241\214\346\227\266\345\255\230\345\202\250\347\251\272\351\227\264\347\273\204\347\273\207.pdf" new file mode 100644 index 0000000..fed3cfc Binary files /dev/null and "b/XJTU-\345\244\247\351\242\230\346\250\241\346\213\237/\350\277\220\350\241\214\346\227\266\345\255\230\345\202\250\347\251\272\351\227\264\347\273\204\347\273\207.pdf" differ diff --git "a/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/20summary2024(2).pdf" "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/20summary2024(2).pdf" new file mode 100644 index 0000000..9828537 Binary files /dev/null and "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/20summary2024(2).pdf" differ diff --git "a/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\270\200\347\253\2402024.pdf" "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\270\200\347\253\2402024.pdf" new file mode 100644 index 0000000..3962bd0 Binary files /dev/null and "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\270\200\347\253\2402024.pdf" differ diff --git "a/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\270\203\347\253\2402024.pdf" "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\270\203\347\253\2402024.pdf" new file mode 100644 index 0000000..8648fae Binary files /dev/null and "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\270\203\347\253\2402024.pdf" differ diff --git "a/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\270\211\347\253\240RE2024.pdf" "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\270\211\347\253\240RE2024.pdf" new file mode 100644 index 0000000..78295b1 Binary files /dev/null and "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\270\211\347\253\240RE2024.pdf" differ diff --git "a/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\270\211\347\253\240RL-2024.pdf" "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\270\211\347\253\240RL-2024.pdf" new file mode 100644 index 0000000..ece9752 Binary files /dev/null and "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\270\211\347\253\240RL-2024.pdf" differ diff --git "a/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\271\235\347\253\2402024(5).pdf" "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\271\235\347\253\2402024(5).pdf" new file mode 100644 index 0000000..916af2c Binary files /dev/null and "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\271\235\347\253\2402024(5).pdf" differ diff --git "a/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\272\214\347\253\240DFA2024.pdf" "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\272\214\347\253\240DFA2024.pdf" new file mode 100644 index 0000000..1d0cbb1 Binary files /dev/null and "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\272\214\347\253\240DFA2024.pdf" differ diff --git "a/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\272\214\347\253\240NFA2024.pdf" "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\272\214\347\253\240NFA2024.pdf" new file mode 100644 index 0000000..950b633 Binary files /dev/null and "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\272\214\347\253\240NFA2024.pdf" differ diff --git "a/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\272\224\347\253\240-2024.pdf" "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\272\224\347\253\240-2024.pdf" new file mode 100644 index 0000000..c9082ed Binary files /dev/null and "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\344\272\224\347\253\240-2024.pdf" differ diff --git "a/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\205\253\347\253\240-2024 (1).pdf" "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\205\253\347\253\240-2024 (1).pdf" new file mode 100644 index 0000000..7f4733b Binary files /dev/null and "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\205\253\347\253\240-2024 (1).pdf" differ diff --git "a/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\205\253\347\253\240-2024(2).pdf" "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\205\253\347\253\240-2024(2).pdf" new file mode 100644 index 0000000..e4352cd Binary files /dev/null and "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\205\253\347\253\240-2024(2).pdf" differ diff --git "a/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\205\255\347\253\240-2024.pdf" "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\205\255\347\253\240-2024.pdf" new file mode 100644 index 0000000..cac6e57 Binary files /dev/null and "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\205\255\347\253\240-2024.pdf" differ diff --git "a/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\215\201\344\270\200\347\253\2402024NEW(4).pdf" "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\215\201\344\270\200\347\253\2402024NEW(4).pdf" new file mode 100644 index 0000000..5f5f606 Binary files /dev/null and "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\215\201\344\270\200\347\253\2402024NEW(4).pdf" differ diff --git "a/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\215\201\347\253\2402024NEW.pdf" "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\215\201\347\253\2402024NEW.pdf" new file mode 100644 index 0000000..a2267ae Binary files /dev/null and "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\215\201\347\253\2402024NEW.pdf" differ diff --git "a/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\233\233\347\253\240-2024.pdf" "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\233\233\347\253\240-2024.pdf" new file mode 100644 index 0000000..0d57005 Binary files /dev/null and "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\2062024-zyl/\347\254\254\345\233\233\347\253\240-2024.pdf" differ diff --git "a/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\206\345\256\242\350\247\202\351\242\230\347\273\203\344\271\240.md" "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\206\345\256\242\350\247\202\351\242\230\347\273\203\344\271\240.md" new file mode 100644 index 0000000..63c15e6 --- /dev/null +++ "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\206\345\256\242\350\247\202\351\242\230\347\273\203\344\271\240.md" @@ -0,0 +1,1548 @@ + +1 编译是对()。 + +A. 机器语言的执行 + +B. 汇编语言的翻译 + +**C. 高级语言的翻译** + +D. 高级语言程序的解释执行 + +2 用高级语言编写的程序经编译后产生的程序叫( ). + +A. 源程序 + +**B. 目标程序** + +C. 连接程序 + +D. 解释程序 + +3 ( )不是编译程序的组成部分。 + +A. 词法分析程序 + +B. 代码生成程序 + +**C. 设备管理程序** + +D. 语法分析程序 + +4 源程序是句子的集合,( )可以较好地反映句子的结构。 + +A. 线性表 + +**B. 树** + +C. 完全图 + +D. 堆栈 + +5 编译程序是一种( )。 + +A. 汇编程序 + +**B. 翻译程序** + +>翻译程序有两种: +>1) 编译程序。它将高级语言一次全部翻译成目标程序,每次执行程序时,只需要执行目标程序,因此只要源程序不变,就无需重新编译。 +>2) 解释程序。它将源程序的一条语句翻译成对应的机器目标代码,并立即执行,然后翻译下一跳源程序语句并执行,直至所有源程序语句全部都被翻译完 + +C. 解释程序 + +D. 目标程序 + +6 按逻辑上划分,编译程序第三步工作是( )。 + +**A. 语义分析** + +B. 词法分析 + +C. 语法分析 + +D. 代码生成 + +7 编译程序中 *语法分析器* 接收以( )为单位的输入。 + +**A. 单词** + +B. 表达式 + +C. 产生式 + +D. 句子 + +8 编译过程中,*语法分析器* 的任务就是( )。 + +A. 分析单词是怎样构成的 + +**B. 分析单词串是如何构成语句和声明的** + +C. 分析语句和声明是如何构成程序的 + +D. 分析程序的结构 + +9 语法分析时所依据的是( ) + +**A. 语法规则** + +B. 词法规则 + +C. 语义规则 + +D. 等价变换规则 + +10 通常一个编译程序中,不仅包含词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成等六个部分,还应包括( )。 + +**A. 表格处理和出错处理** + +B. 解释器 + +C. 模拟执行器 + +D. 符号执行器 + + +11 编译程序绝大多数时间花在( )上。 + +A. 词法分析 + +B. 目标代码生成 + +C. 出错处理 + +**D. 表格管理** + + +## 程序设计语言及其文法 + +4 文法G产生的( )的全体是该文法描述的语言。 + +A. 句型 + +B. 终结符集 + +C. 非终结符集 + +**D. 句子** + +5 若文法G定义的语言是无限集,则文法必然是( )。 + +**A. 递归的** + +B. 上下文无关的 + +C. 二义性的 + +D. 无二义性的 + +6 乔姆斯基(Chomsky)把文法分为四种类型,即0型、1型、2型、3型。其中3型文法是( )。 + +A. 非限制文法 + +**B. 正则文法** + +C. 上下文有关文法 + +D. 上下文无关文法 + +7 一个上下文无关文法G包括四个组成部分,它们是一组非终结符号,一组终结符号,一个开始符 + +号,以及一组( )。 + +A. 句子 + +**B. 产生式** + +C. 单词 + +D. 句型 + +8 若一个文法是递归的,则它所产生的语言的句子( )。 + +**A. 是无穷多个** + +B. 是有穷多个 + +C. 是可枚举的 + +D. 个数是常量 + +9 给定文法A→bA|cc,则符号串①cc ②bcbc ③bcbcc ④bccbcc ⑤bbbcc中,是该文法句子的是( )。 + +A. ① + +B. ③④⑤ + +C. ②④ + +**D. ①⑤** + +10 文法E→E+E|EE|i的句子ii+i*i有( )棵不同的语法树。 + +A. 1 + +B. 3 + +**C. 5** + +D. 7 + +13 由文法的开始符号*出发经过若干步(包括0步)推导产生的文法符号*序列称为( )。 + +A. 语言 + +**B. 句型** + +C. 句子 + +D. 句柄 + +14 下列符号串不可以由符号集S={a,b}上的正闭包运算产生的是( )。 + +A. ε + +B. a + +C. aa + +D. ab + + +## 词法分析 + +1 词法分析器的输出结果是( )。 + +A. 单词自身值 + +B. 单词在符号表中的位置 + +C. 单词的种别编码 + +**D. 单词的种别编码和自身值** + +2 词法分析器不能( )。 + +A. 识别出数值常量 + +B. 过滤源程序中的注释 + +C. 扫描源程序并识别记号 + +**D. 发现括号不匹配** + +3 ( )这样一些语言,它们能被确定的有穷自动机识别,但不能用正则表达式表示。 + +A. 存在 + +**B. 不存在** + +C. 无法判定是否存在 + +D. 以上答案都不对 + +4 两个有穷自动机等价是指它们的( )。 + +A. 状态数相等 + +B. 有向弧数相等 + +**C. 所识别的语言相等** + +D. 状态数和有向弧数相等 + +5 词法分析器用于识别( )。 + +A. 句子 + +B. 产生式 + +**C. 单词** + +D. 句型 + +6 正则表达式 R1和R2 等价是指( )。 + +A. R1和R2 都是定义在一个字母表上的正则表达式 + +B. R1和R2 使用的运算符相同 + +**C. R1和R2 代表同一正则集** + +D. R1和R2 代表不同正则集 + +10 有限状态自动机能识别( )。 + +A. 上下文无关语言 + +B. 上下文有关语言 + +**C. 正规语言** + +D. 0 型文法定义的语言 + +11 ( )不是DFA的成分。 + +A. 有穷字母表 + +**B. 多个初始状态的集合** + +C. 多个终态的集合 + +D. 转换函数 + +13 有穷自动机M1和M2等价是指( )。 + +A.M1和M2的状态数相等 + +B. M1和M2的有向边条数相等 + +**C. M1和M2所识别的语言集相等** + +D. M1和M2状态数和有向边条数相等 + +15 称有限自动机 A1和A2 等价是指( )。 + +A. A1和A2 都是定义在一个字母表上的有限自动机 + +B. A1和A2 状态数和有向边数相等 + +C. A1和A2 状态数或有向边数相等 + +**D. A1和A2 所能识别的字符串集合相等** + +16 两个DFA等价是指( )。 + +A. 这两个DFA的状态数相同 + +B. 这两个DFA的状态数和有向弧条数都相等 + +C. 这两个DFA的有向弧条数相等 + +**D. 这两个DFA接受的语言相同** + +18 词法分析器的**加工对象**是()。 + +A. 中间代码 + +B. 单词 + +**C. 源程序** + +D. 元程序 + +19 如果一个正规式所代表的集合是*无穷的*,则它必含有的运算是( )。 + +A. 接运算“·” + +B. 或运算“|” + +**C. 闭包运算“\* ”** + +>无穷 => 程序递归 => 闭包 + +D. 括号“(”和“)” + +20 同正规式ab 等价的文法是( )。 + +A. G1:S→aS|bS|ε + +B. G2:S→aSb|ε + +**C. G3:S→ aS|Sb|ε** + +D. G4:S→ abS|ε + +21 一个正规式只能对应一个确定的有限状态自动机。 + +A. 对 + +**B. 错** + +22 一个正规语言可能对应多个正规文法。 + +**A. 对** + +B. 错 + + +## 语法分析 + +1 如果文法G是无二义的,则它的任何句子α( )。 + +**A. 最左推导和最右推导对应的语法树必定相同** + +B. 最左推导和最右推导对应的语法树可能不同 + +C. 最左推导和最右推导必定相同 + +D. 可能存在两个不同的最左推导,但它们对应的语法树相同 +  + +2 采用自上而下分析,不必( )。 + +A. 消除回溯 + +B. 消除左递归 + +**C. 消除右递归** + +D. 提取公共左因子 +  + +3 识别上下文无关语言的自动机是( )。 + +**A. 下推自动机** + +B. NFA + +C. DFA + +D. 图灵机 + + +4 ( )文法不是LL(1)的。 + +A. 递归 + +B. 右递归 + +C. 2型 + +**D. 含有公共左因子的** + + +5 已知文法G是无二义的,则对G的任意句型α( )。 + +**A. 最左推导和最右推导对应的语法树必定相同** + +B. 最左推导和最右推导对应的语法树可能相同 + +C. 最左推导和最右推导必定相同 + +D. 可能存在两个不同的最左推导,但他们对应的语法树相同 +  + +6 在自上而下的语法分析中,应从( )开始分析。 + +A. 句型 + +B. 句子 + +**C. 文法开始符号** + +D. 句柄 + +  +7 一个文法G,若( ),则称它是LL(1)文法。 + +A. G中不含左递归 + +B. G无二义性 + +**C. G的LL(1)分析表中不含多重定义的条目** + +D. G中产生式不含左公因子 +  + +8 *语法分析器的输入*是()。 + +**A. Token序列** + +B. 源程序 + +C. 目标程序 + +D. 符号表 + + +9 在递归子程序方法中,若文法存在左递归,则会使分析过程产生( )。 + +A. 回溯 + +B. 非法调用 + +C. 有限次调用 + +**D. 无限循环** + + +10 LL(1)分析法中“1”的含义是在输入串中查看一个输入符号,其目的是( )。 + +A. 确定最左推导 + +B. 确定句柄 + +**C. 确定使用哪一个产生式进行展开** + +D. 确定是否推导 + + +语法分析_2 + +1 在语法分析处理中,FIRST集合、FOLLOW集合均是( )。 + +A. 非终结符集 + +**B. 终结符集** + +C. 字母表 + +D. 状态集 +  + +2 在*编译过程中,如果遇到错误*应该( )。 + +A. 把错误理解成局部的错误 + +B. 对错误在局部范围内进行纠正,继续向下分析 + +**C. 当发现错误时,跳过错误所在的语法单位继续分析下去** + +D. 当发现错误时立即停止编译,待用户改正错误后再继续编译 +  + +3 已知文法G\[S]: + +S→eT|RT T→DR|ε R→dR|ε D→a|bd + +求FIRST(S)=()。 + +A. {e } + +B. {e,d,a,b} + +C. {e,d } + +**D. {e,d,a,b,ε}** + +  +4 已知文法G[S]: + +S→eT|RT T→DR|ε R→dR|ε D→a|bd + +求FOLLOW(D)=()。 + +A. {d,e} + +B. {d,ε} + +**C. {d,$}** + +D. {a,d} + + +5 FIRST集中可以含有ε。 + +**A. 对** + +B. 错 + +  +6 FOLLOW集中可以含有ε。 + +A. 对 + +**B. 错** +  + +7 SELECT集中可以含有ε。 + +A. 对 + +**B. 错** + + +语法分析_3 + +1 若a为终结符,则A→α · aβ为( )项目。 + +A. 归约 + +**B. 移进** + +C. 接受 + +D. 待约 + + +**归约项目(Reduction Item)** + +归约项目是指在LR分析中,一个项目已经匹配到某个产生式的右部,并准备应用这个产生式进行归约。形式上,它的特征是**项目点在产生式右部的最右侧**。 + +例如,对于产生式 A→αA \rightarrow \alphaA→α,归约项目表示为: + +A→α⋅A \rightarrow \alpha \cdotA→α⋅ + +在这个项目中,点号(·)表示输入已经匹配了产生式 A→αA \rightarrow \alphaA→α 的右部,并且可以进行归约。 + +**移进项目(Shift Item)** + +移进项目表示分析器当前已匹配到某个产生式的部分右部,且下一步需要将下一个输入符号移进来以继续匹配。形式上,它的特征是**项目点位于产生式右部的非终结符或终结符之前**。 + +例如,对于产生式 A→αβA \rightarrow \alpha \betaA→αβ,移进项目表示为: + +A→α⋅βA \rightarrow \alpha \cdot \betaA→α⋅β + +在这个项目中,点号(·)表示输入已经匹配了 α\alphaα,并且需要匹配 β\betaβ 以完成产生式的匹配。 + +**接受项目(Accept Item)** + +接受项目是指在LR分析中,整个**输入已经完全匹配文法的开始符号的产生式**。这是**一个特定的归约项目,表示分析成功地解析了整个输入**。 + +对于文法的开始符号 SSS 和增加的产生式 S′→SS' \rightarrow SS′→S,接受项目表示为: + +S′→S⋅S' \rightarrow S \cdotS′→S⋅ + +这里,点号(·)在产生式的最右侧,表示整个输入已经成功匹配并可接受。 + +**待约项目(Handle Item)** + +待约项目是指在输入串中已经识别出某个子串,这个子串可以用一个产生式的右部进行替换(归约)。待约项目通常用来表示当前分析器正在考虑是否进行归约。例如,对于产生式 A→αA \rightarrow \alphaA→α,待约项目表示为: + +A→α⋅A \rightarrow \alpha \cdotA→α⋅ + +这个术语有时与归约项目相似,因为它们都表示即将进行归约的状态 + +2 一个句型中的( )称为该句型的句柄。 + +**A. 最左直接短语** + +B. 最右直接短语 + +C. 终结符 + +D. 非终结符 +  + +3 在**自底向上的语法分析**方法中,分析的关键是( )。 + +**A. 寻找句柄** + +B. 寻找句型 + +C. 消除递归 + +D. 选择候选式 +  + +4 在自顶向下的语法分析方法中,分析的关键是( )。 + +A. 寻找句柄 + +B. 寻找句型 + +C. 消除递归 + +**D. 选择候选式** + + +5 若B为非终结符,则 A→a · Bb 为( )。 + +A. 移进项目 + +B. 归约项目 + +C. 接受项目 + +==D. 待约项目== + +  +6 在规范归约中,用( )来刻画**可归约串**。 + +A. 直接短语 + +**B. 句柄** + +C. 最左素短语 + +D. 素短语 +  +  +7 若B为非终结符,则A→α·Bβ为( )项目。 + +A. 归约 + +B. 移进 + +C. 接受 + +**D. 待约** +  + +8 下列动作中,不是**自下而上**分析动作的是( )。 + +A. 移进 + +**B. 展开** + +C. 接受 + +D. 报错 +  +  +9 下列动作中,不是**自上而下**分析动作的是( )。 + +A. 匹配 + +B. 展开 + +**C. 移进** + +D. 报错 + + +11 设有文法G\[T]: + +T→T\*F|F + +F→F↑P|P + +P→(T)|a + +该文法句型TP↑(TF)的句柄是下列符号串 。 + +A. (T*F) + +B. T*F + +**C. P** + +D. P↑(T*F) +  + +12 **LR分析表中的转移表(goto)**是以()作为列标题的。 + +A. 终结符 + +**B. 非终结符** + +C. 终结符或非终结符 + +D. 表示状态的整型数 +  + +13 LR分析表中的**动作表(action)**是以( )作为列标题的。 + +A. 终结符 + +B. 非终结符 + +C. 终结符或非终结符 + +**D. 终结符和结束符$** + + +14 下列项目中为可归约项目的是()。 + +A. E′→· E + +**B. L→·** + +C. L→-· L + +D. F→L*· F + + +15 LR分析器的核心部分是一张分析表,该表由( )组成。 + +A. ACTION表 + +B. GOTO表 + +C. 预测分析表 + +**D. ACTION表和GOTO表** + + +语法分析_4 + +1 一个LR(1)文法合并同心集后*若不是LALR(1)文法*( ) + +A. 则可能存在移进/归约冲突 + +**B. 则可能存在归约/归约冲突** + +C. 则可能存在移进/归约冲突和归约/归约冲突 + +D. 以上说法都不对 + +  +2 若状态k含有项目“A→α· ”,且仅当输入符号a∈FOLLOW(A)时,才用规则“A →α”归约的 + +语法分析方法是( )。 + +A. LALR分析法 + +B. R(0)分析法 + +C. LR(1)分析法 + +**D. SLR(1)分析法** + +  +3 LR(1)文法都是( )。 + +A. 无二义性且无左递归 + +B. 可能有二义性但无左递归 + +**C. 无二义性但可能是左递归** + +>LR(1)天然没有二义性,但是它可能有左递归(直接/间接) + +D. 可以既有二义性又有左递归 + + +4 **同心集合并**可能会产生新的( )冲突。 + +A. 二义 + +B. 移进/移进 + +C. 移进/归约 + +**D. 归约/归约** +  +  +5 就文法的描述能力来说,有( )。 +A. SLR(1) ⊂ LR(0) + +B. LR(1) ⊂ LR(0) + +**C. SLR(1) ⊂ LR(1)** +D. 无二义文法 ⊂ LR(1) + + +6 在LR(0)的Action表中,如果某行中存在标记为“rj”的栏,则( )。 + +**A. 该行必定填满“rj”** + +B. 该行未必填满“rj” + +C. 其他行可能也有“rj” + +D. goto表中也可能有“rj” + + +7 若状态k含有项目“A→α·”,对任意非终结符a,都用规则“A →α”归约的语法分析方法是( )。 + +A. LALR分析法 + +**B. LR(0)分析法** + +C. LR(1)分析法 + +D. SLR(1)分析法 + + +8 在SLR( 1)的Action表中,如果某行中存在标记为“rj”的栏,则( )。 + +A. 该行必定填满“rj” + +**B. 该行未必填满“rj”** +C. 其他行可能也有“rj” +D. goto表中也可能有“rj” + + +9 若状态k含有项目“A→α·”,且仅当输入符号a∈FOLLOW( A)时,才用规则“A →α”归约的语 + +法分析方法是( )。 + +A. LALR分析法 + +B. LR(0)分析法 + +C. LR(1)分析法 + +**D. SLR(1)分析法** +  + +10 编译程序的**语法分析器必须输出**的信息是( )。 + +A. 语法规则信息 + +**B. 语法错误信息** + +C. 语法分析过程 + +D. 语句序列 + + +## 语法制导翻译 + +1 文法G\[S]及其语法制导翻译定义如下: + +产生式 语义动作 + +S’ → S print( S.num) + +S → ( L) S.num = L.num +1 + +S → a S.num = 0 + +L →L( 1), S L.num = L( 1).num + S.num + +L →S L.num = S.num + +若输入为( a,( a)),且采用自底向上的分析方法,则输出为( )。 + +A. 0 + +B. 1 + +**C. 2** + +D. 4 +  + +2 有文法G及其语法制导翻译如下所示( 语义规则中的*和+分别是常规意义下的算术运算符): + +E→E( 1) ∧ T {E.val = E( 1).val * T.val} + +E→T {E.val = T.val} + +T→T( 1)# n {T.val = T( 1).val + n.val } + +T→ n {T.val = n.val} + +则分析句子3 ∧ 3 # 4其值为()。 + +A. 10 + +**B. 21** + +C. 14 + +D. 24 + +>方法:按照语法规则把运行的语法树画出来,就可以了 + +3 有一语法指导定义如下: + +S→bAb print “1” + +A→( B print “2” + +A→a print “3” + +B→aA) print “4” + +若输入序列为b( a( a( aa)))b,且采用自底向上的分析方法,则输出序列为( )。 + +A. 32224441 + +B. 34242421 + +**C. 12424243** + +D. 34442212 + +>注意这里B/C容易混淆,自底向上分析,输出是自顶向下 + +4 有一语法指导定义如下,其中+表示符号连接运算: + +S→B print B.vers + +B→a B.vers=a + +B→b B.vers=b + +B→Ba B.vers=a+B.vers + +B→Bb B.vers=b+B.vers + +若输入序列为abab,且采用自底向上的分析方法,则输出序列为( )。 + +A. aabb + +B. abab + +C. bbaa + +**D. baba** + + +5 使用( )可以定义一个**程序的意义**。 + +**A. 语义规则** + +B. 词法规则 + +C. 产生规则 + +D. 词法规则 + +  +6 以下说法正确的是( )。 + +**A. 语义规则中的属性有两种:综合属性与继承属性** + +B. 终结符只有继承属性,它由词法分析器提供 + +C. 非终结符可以有综合属性,但不能有继承属性 + +D. 属性值在分析过程中可以进行计算,但不能传递 +  + +7终结符具有( )属性。 + +A.抽象 + +B.传递 + +**C.综合** + +D.继承 + + +语法制导翻译_2 + +1 关于将L-SDD转换为SDT的规则,以下选项中,正确的是( )。 + +A. 将计算某个非终结符号A的继承属性的动作放在产生式的最后 + +B. 将计算一个产生式左部符号的继承属性的动作放置在产生式的最后 + +**C. 将计算某个非终结符号A的继承属性的动作插入到产生式右部中紧靠在A的本次出现之前的位置上** + +D. 将每个语义动作都放在产生式的最后 + +  +2 以下说法不正确的是( )。 + +A. 如果一个S-SDD的基本文法可以使用LR分析技术,那么它的SDT可以在LL语法分析过程中实现 + +>S-SDD(综合属性定义)中的属性是在产生式的右侧推导过程中计算的,这与自底向上的LR分析相匹配,而不是自顶向下的LL分析 + +B. 如果一个S-SDD的基本文法可以使用LR分析技术,那么它的SDT可以在LR语法分析过程中实现 + +C. 如果一个L-SDD的基本文法可以使用LL分析技术,那么它的SDT可以在LL语法分析过程中实现 + +>L-SDD(继承属性定义)中的属性是在产生式的左侧推导过程中计算的,这与自顶向下的LL分析相匹配 + +D. 如果一个L-SDD的基本文法可以使用LL分析技术,那么它的SDT可以在LR语法分析过程中实现 + +>L-SDD也可以在LR分析过程中实现,因为LR分析(自底向上)可以通过在移进和归约过程中进行属性计算,这并不影响继承属性的传递和计算 + +3 以下说法不正确的是( )。 + +A. 使用语法制导翻译方案的编译程序能同时进行语法分析和语义分析 + +B. 语法制导翻译方案( SDT )是在产生式右部中嵌入了程序片段( 称为语义动作)的CFG + +**C. SDD可以看作是SDT的具体实施方案** + +>- SDD(语法制导定义)和SDT(语法制导翻译),C将二者颠倒了 +>- SDD是定义了语义规则和属性的计算方法,而SDT是实现这些规则的方法 + +D. 将一个S-SDD转换为SDT的方法是:将每个语义动作都放在产生式的最后 + +  +4 在非递归的预测分析过程中进行翻译,以下说法**不正确**的是( )。 + +A. 要想在非递归的预测分析过程中进行翻译,需要扩展语法分析栈 + +B. 非终结符A的继承属性和综合属性的计算时机不同 + +C. 将非终结符A的继承属性和综合属性存放在不同的记录中 + +**D. 综合属性在A出现之前就可以计算** + + +5 在非递归的预测分析过程中进行翻译,以下说法**不正确**的是( )。 + +A. 要想在非递归的预测分析过程中进行翻译,需要扩展语法分析栈 + +B. 综合记录用于存放非终结符综合属性值 + +C. 动作记录,用来存放指向将被执行的语义动作代码的指针 + +**D. 综合属性存放在A本身的记录中** +  + +6 在非递归的预测分析过程中进行翻译,以下说法不正确的是( )。 + +A. 分析栈中的每一个记录都对应着一段执行代码 + +B. 综合记录出栈时,要将综合属性值复制给后面特定的语义动作 + +C. 变量展开时( 即变量本身的记录出栈时),如果其含有继承属性,则要将继承属性值复制给后面特定的语义动作 + +**D. 继承属性在A的儿子们都分析完毕之后才能计算** + + +语法制导翻译_3 + +1 在*递归的预测分析*过程中进行翻译,以下说法**不正确**的是( )。 + +A. 可以将一个递归的预测分析器扩展为一个翻译器 + +B. 在语法分析器中,每个非终结符A对应一个过程,在做语义分析时,要将过程扩展成一个函数 + +C. 以继承属性作为函数的参数,以综合属性作为函数的返回值 + +**D. 以综合属性作为函数的参数,以继承属性作为函数的返回值** + + +2 在*递归的预测分析*过程中进行翻译,以下说法不正确的是( )。 + +A. 在语法分析器中,每个非终结符A对应一个过程,在做语义分析时,要将过程扩展成一个函数 + +>**正确**。在递归下降的预测分析器中,每个非终结符确实对应一个过程。为了实现语义分析,这个过程通常需要扩展为一个函数,以便处理属性传递和计算 + +B. 对出现在A产生式右部中的每个文法符号的每个属性都设置一个局部变量 + +>在进行属性计算时,为了便于管理和访问出现在产生式右部的每个文法符号的属性,通常会为每个属性设置局部变量。这使得在语法分析过程中可以方便地操作这些属性 + +C. 如果非终结符含有继承属性,需要将函数调用的返回值赋给相应的局部变量 + +>- **不正确**。 +>- 如果非终结符含有继承属性,这些继承属性通常是在函数调用的参数中传递的,而不是通过函数调用的返回值赋给局部变量。 +>- 继承属性在调用时就应该被传递,而不是在调用之后再通过返回值进行传递。 +>- 作为返回值进行传递的是综合属性 + +D. 对于产生式右部的每个动作,将其代码复制到语法分析器,并把对属性的引用改为对相应变量的引用 + +>在递归下降分析器中,对于产生式右部的每个动作,通常会将其代码复制到相应的位置,并将对属性的引用改为对相应局部变量的引用。这是为了确保属性计算和操作在正确的语法分析上下文中进行。 + + +3 以下说法不正确的是( )。 + +**A. 语法制导翻译方案只限自底向上的分析方法** + +B. 给定一个以LL文法为基础的L-SDD,可以修改这个文法,并在LR语法分析过程中计算这个新文法之上的SDD + +C. 对于这个内嵌的语义动作,向文法中引入一个标记非终结符M来替换它 + +D. 每个标记非终结符M对应着一个空产生式M→ ε,该产生式对应着一段语义子程序,它的任务就是完成M所替换的那个语义动作要完成的工作 + +  +4 给定一个以LL文法为基础的L-属性定义,可以修改这个文法,并在LR语法分析过程中计算这个新文法之上的SDD。 + +**A. 对** + +B. 错 + + +5 在各个非终结符之前放置语义动作来计算它的继承属性, 并在产生式后端放置语义动作计算综合属性。 + +**A. 对** + +B. 错 + + +6 在各个非终结符之前放置语义动作来计算它的综合属性, 并在产生式后端放置语义动作计算继承属性。 + +A. 对 + +**B. 错** +  + +7 对每个内嵌的语义动作,向文法中引入一个标记非终结符来替换它。每个这样的位置都有一个不同的标记,并且对于任意一个标记M都有一个产生式M→ε。 + +A. 对 + +B. 错 + + +## 中间代码生成 + +中间代码生成_1 + +1 **中间代码生成**时所依据的是( )。 + +A. 语法规则 + +B. 词法规则 + +**C. 语义规则** + +D. 等价变换规则 +  + +2 在编译程序中与中间代码生成无关的是( )。 + +A. 便于目标代码的优化 + +B. 便于存储空间的组织 + +C. 便于编译程序的移植 + +**D. 便于目标代码的移植** + + +3 以下说法不正确的是( )。 + +A. 对于声明语句,语义分析的主要任务就是收集标识符的类型等属性信息,为每一个名字分配一个相对地址 + +B. 从变量类型可以知道该变量在运行时刻需要的内存数量。在编译时刻,可以使用这些数量为每一个名字分配一个相对地址 + +C. 名字的类型和相对地址信息保存在相应的符号表条目中 + +**D. 对声明的处理要构造符号表,但不产生中间代码** + + +4 以下说法不正确的是( )。 + +A. 类型自身也有结构,用类型表达式来表示这种结构 + +**B. 基本类型不是类型表达式** + +C. 类型名也是类型表达式 + +D. 将类型构造符作用于类型表达式可以构成新的类型表达式 + + +5 数组元素的地址计算与数组的存储方式有关。 + +**A. 对** + +B. 错 + +1. **一维数组**: + - 一维数组在内存中是连续存储的。假设数组的起始地址为 basebasebase,每个元素的大小为 sizesizesize,则第 iii 个元素的地址可以通过以下公式计算: Address(A[i])=base+i×size +2. **二维数组**: + - **行优先(Row-major order)**:这是大多数编程语言(如C/C++)的默认存储方式。假设二维数组 AAA 有 nnn 列,每个元素的大小为 sizesizesize,则元素 A[i][j]A[i][j]A[i][j] 的地址计算公式为: Address(A[i][j])=base+(i×n+j)×size + - **列优先(Column-major order)**:一些语言(如Fortran)使用这种存储方式。假设二维数组 AAA 有 mmm 行,每个元素的大小为 sizesizesize,则元素 A[i][j]A[i][j]A[i][j] 的地址计算公式为: Address(A[i][j])=base+(j×m+i)×size +3. **多维数组**: + - 多维数组的存储方式是上述方式的推广,行优先或列优先都会有相应的地址计算公式,具体公式会根据数组的维数和具体存储方式有所不同。 + + +6 在程序中标识符的出现仅为使用性的。 + +A. 对 + +**B. 错** + + +7 在编译阶段只对可执行语句进行翻译。 + +A. 对 + +**B. 错** +  + +8 在程序中标识符的出现仅为定义性的。 + +A. 对 + +**B. 错** + +- **使用性(Usage)**: + - 标识符被用来引用其所表示的对象,例如变量的读取、函数的调用等。 + - 例子:在 `x = y + 2` 中,`y` 是以使用性的形式出现。 +- **定义性(Definition)**: + - 标识符被用来创建或定义一个新的对象,如变量声明、函数定义等。 + - 例子:在 `int x;` 中,`x` 是以定义性的形式出现。 +- **声明性(Declaration)**: + - 标识符被声明,但不一定是定义。例如,函数的前向声明或变量的外部声明。 + - 例子:在 `extern int x;` 中,`x` 是以声明性的形式出现。这意味着`x`在其他地方定义了,但这里我们只是声明它的存在。 +- **参数性(Parameter)**: + - 标识符作为函数参数出现。 + - 例子:在 `void func(int x)` 中,`x` 是以参数性的形式出现。 +- **标签性(Label)**: + - 标识符被用作跳转标签,例如在使用`goto`语句时。 + - 例子:在 `label: x = 1; goto label;` 中,`label` 是以标签性的形式出现。 + + +第12讲 中间代码生成_2 + +1 有文法G及其语法制导翻译如下所示( 语义规则中的*和+分别是常规意义下的算术运算符): + +E→E(1) ∧ T {E.val = E(1).val * T.val} + +E→T {E.val = T.val} + +T→T(1)# n {T.val = T(1).val + n.val } + +T→ n {T.val = n.val} + +则分析句子1 ∧ 2 ∧ 3 # 4其值为( )。 + +A. 10 + +B. 34 + +**C. 14** + +D. 54 + + +2 用( )可以把a:=b+c翻译成四元式序列。 + +A. 语法规则 + +B. 词法规则 + +**C. 语义规则** + +D. 等价变换规则 + + +3 有文法G及其语法制导翻译如下所示( 语义规则中的\*和+分别是常规意义下的算术运算符): + +E→E(1) ∧ T {E.val = E(1).val * T.val} + +E→T {E.val = T.val} + +T→T(1)# n {T.val = T(1).val + n.val } + +T→ n {T.val = n.val} + +则分析句子2 ∧ 3 # 4其值为( )。 + +A. 10 + +B. 21 + +**C. 14** + +D. 24 +  + +4 以下说法不正确的是( )。 + +A. ==赋值语句翻译的主要任务是生成对表达式求值的三地址码== + +B. 在增量翻译方法中,gen( )函数不仅要构造出一个新的三地址指令,还要将它添加到至今为止已生成的指令序列之后 + +C. 如果一个赋值语句中涉及到数组元素,那么将该语句翻译成三地址码时要解决的主要问题是确定数组元素的存放地址,也就是数组元素的寻址 + +**D. 数组元素的地址计算与数组的存储方式无关** + + +5 数组元素的地址由两部分构成,一部分是基地址,另一部分是偏移量。 + +**A. 对** + +B. 错 +  + +6 基地址通过查符号表即可获得。 + +**A. 对** + +B. 错 + +  +7 数组元素的偏移地址的计算只取决于数组的下标。 + +A. 对 + +**B. 错** + + +8 设计数组引用的SDT的关键问题是:如何将地址计算公式和数组引用的文法关联起来。 + +**A. 对** + +B. 错 +  + +中间代码生成_3 + +1 关于布尔表达式的叙述,**不正确**的是( )。 + +A. 布尔常量是布尔表达式 + +**B. 布尔常量不是布尔表达式** + +C. 关系表达式是布尔表达式 + +D. 将括号和逻辑运算符作用于布尔表达式得到一个新的布尔表达式 + +>bool常量 是 bool表达式 +  + +2 以下说法不正确的是( )。 + +A. 为布尔表达式和控制流语句生成目标代码时,关键问题之一是确定跳转指令的目标标号 + +**B. 在生成跳转指令时,就可以确定目标标号** + +C. 在生成跳转指令时,目标标号还不能确定 + +D. 可以将标号的地址作为*继承属性*传递到生成相关跳转指令的地方,但是这样的做法需要再进行一趟处理,将标号和具体地址绑定起来 + + +5 在分支和循环中会用到条件式,而用作条件式的通常是布尔表达式。 + +**A. 对** + +B. 错 + + +6 在控制流语句的翻译中,布尔表达式B被翻译成由跳转指令构成的跳转代码。 + +**A. 对** + +B. 错 + + +7 逻辑运算符&&、|| 和 ! 会出现在代码中。 + +A. 对 + +**B. 错** + + +8在跳转代码中,逻辑运算符&&、|| 和 ! 被翻译成跳转指令。 + +**A. 对** + +B. 错 + + +2 在下面的语句中,( )**不需要回填技术**。 + +**A. 赋值语句** + +B. goto语句 + +C. 条件语句 + +D. 循环语句 + + +3 四元式之间的联系是通过( )实现的。 + +A. 指示器 + +**B. 临时变量** + +C. 符号表 + +D. 程序变量 +  + +4 四元式表示法的优点为 ( )。 + +**A. 不便于优化处理,但便于表的更动** + +B. 不便于优化处理,但节省存储空间 + +C. 便于优化处理,也便于表的更动 + +D. 便于表的更动,也节省存储空间 +  + +5 在**回填技术**中,生成一个跳转指令时,暂时不指定该跳转指令的目标标号。 + +**A. 对** + +B. 错 + + +6 在回填技术中,==同一个列表list中的跳转指令具有相同的目标标号==。 + +**A. 对** + +B. 错 +  + +7 在回填技术中,同一个列表list中的跳转指令可能具有不同的目标标号。 + +A. 对 + +**B. 错** +  + +8 在回填技术中,等到能够确定正确的目标标号时,才去填充指令的目标标号。 + +**A. 对** + +B. 错 + + +## 运行存储分配 + +1 在*目标代码生成阶段*,符号表用于()。 + +A. 目标代码生成 + +B. 语义检查 + +C. 语法检查 + +**D. 地址分配** + + +2 PASCAL语言中过程声明的局部变量地址分配在( )。 + +A. 调用者的数据区中 + +**B. 被调用者的数据区中** + +C. 主程序的数据区中 + +D. 公共数据区中 + +>当一个过程(或函数)__被调用__ 时,程序会为该过程分配一个活动记录(也称为栈帧)。这个活动记录包含了过程执行期间所需的所有信息,包括局部变量、参数、返回地址和一些状态信息。 +>- **被调用者的数据区**:当一个过程被调用时,它会在栈上分配一个新的活动记录,这个记录包含了该过程的局部变量。因此,局部变量是分配在被调用者的数据区中的。 +>- 这种机制保证了每次过程调用都有独立的一组局部变量,不会与其他过程调用的局部变量混淆。 + + +3 编译方法中,**动态存储分配**的含义是()。 + +A. 在编译阶段为源程序中的量进行分配 + +B. 在编译阶段为源程序中的量进行分配,运行时可动态调整 + +**C. 在==运行阶段==为源程序中的量进行分配(在运行阶段对源程序中的数组、变量、参数等进行分配)** + +D. 都不正确 +  + +4 *运行阶段的存储组织与管理*的目的是( )。 + +A. 提高编译程序的运行速度 + +**B. 为运行阶段的存储分配做准备及提高目标程序的运行速度** + +C. 优化运行空间的管理 + +D. 节省内存空间 +  + +5 以下说法正确的是( )。 + +A. 对于数据空间的存贮分配,FORTRAN采用动态贮存分配策略 + +>传统的FORTRAN仅含有静态存储策略 + +B. 对于数据空间的存贮分配,C语言仅采用栈式贮存分配策略 + +C. 动态存储分配是指在编译阶段对源程序中的量进行分配,以使目标代码在运行时加快运行速度 + +**D. 如果两个临时变量的作用域不相交,则可以将它们分配在同一单元中** +  + +6 以下说法正确的是( )。 + +**A. 编译程序除解决源程序中用户定义的量在运行时刻的存储组织与分配问题之外,还应完成为临时变量和参与运算的寄存器组织好存储空间的任务** + +B. 由于C语言的函数允许递归调用,因此对C语言中的所有变量的单元分配一律采用动态分配方式 + +C. 动态数组的存储空间在编译时即可完全确定 + +D. “运算符与运算对象类型不符”属于语法错误 +  + +7 以下说法正确的是( )。 + +A. 符号表由词法分析程序建立,由语法分析程序使用 + +B. 符号表的内容在词法分析阶段填入并在以后各个阶段得到使用 + +**C. 对一般的程序设计语言而言,其编译程序的符号表应包含哪些内容及何时填入这些信息不能一概而论** + +D. “运算符与运算对象类型不符”属于语法错误 + + +>符号表: +>- **创建阶段**:符号表在 *词法分析* 和 *语法分析* 阶段创建和填充。 +>- **使用阶段**:符号表在 *语法分析、语义分析、中间代码生成、代码优化* 和目标代码生成阶段使用 + + diff --git "a/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\206\346\200\273\347\273\223.md" "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\206\346\200\273\347\273\223.md" new file mode 100644 index 0000000..a3b0b9a --- /dev/null +++ "b/XJTU-\346\234\237\346\234\253\347\252\201\345\207\273\346\226\207\347\250\277/\347\274\226\350\257\221\345\216\237\347\220\206\346\200\273\347\273\223.md" @@ -0,0 +1,618 @@ +## 自动机理论 + +### DFA-NFA-RE + +- [x] DFA-NFA-RE + +DFA 是五元组 (𝑄,Σ,𝛿,𝑞0,𝐹),分别表示状态,符号集,迁移函数,开始状态,接收状态集 + +DFA 扩展转移函数 𝛿^:𝑄×Σ∗→𝑄 + +NFA 是五元组 (𝑄,Σ,𝛿,𝑞0,𝐹),其中 𝛿:𝑄×Σ→2𝑄 + +NFA 扩展转移函数 𝛿^:𝑄×Σ∗→2𝑄 + +𝜀-NFA 是五元组 (𝑄,Σ,𝛿,𝑞0,𝐹),其中 𝛿:𝑄×(Σ∪{𝜀})→2𝑄 + +- 𝜀-NFA 到 DFA:ECLOSE(𝑟) 与子集构造 +- NFA 到 DFA:(惰性)子集构造,𝑂(𝑛32𝑛) +- DFA 到 RE:消除状态得 GNFA,𝑂(𝑛34𝑛);证明:归纳法 +- RE 到 𝜀-NFA:𝑂(𝑛) + +泵引理证正则: + +> 存在 𝑛 使得对任意 𝑤∈𝐿,若 |𝑤|≥𝑛,我们能写成 𝑤=𝑥𝑦𝑧,其中 |𝑥𝑦|≤𝑛,|𝑦|≥1,且 ∀𝑘≥0,𝑥𝑦𝑘𝑧∈𝐿 + +泵引理证非正则使用反证法,由上推论引出矛盾。或者 + +> 对于任意 𝑛 存在串 𝑤∈𝐿,且 |𝑤|≥𝑛,使得对任意书写 𝑤=𝑥𝑦𝑧,|𝑥𝑦|≤𝑛,|𝑦|≥1,存在 𝑘≥0 使 𝑥𝑦𝑘𝑧∉𝐿 + +正则语言的封闭运算:交并补、连接反向、闭包 + +- 交 𝐿∩𝐿′:状态对 +- 并 𝐿∩𝐿:揉起来 +- 补 𝐿𝐶:DFA 改变接收状态拒绝状态 +- 连接 𝐿𝐿′:正则表达式连接 +- 逆 𝐿𝑅:DFA 反向 +- 幂 𝐿𝑘:𝑘 个表达式连接 +- 闭包 𝐿∗:表达式的闭包 + +DFA 最小化:区分状态等价类填 𝑛×(𝑛−1) 的下三角表 + +DFA 等价性:放在一起填表,区分开始状态是不是等价 + + +- [x] DFA-eNFA-RE转换 // DFA最小化 + +### PDA-CFG-CFL + +- [x] CFG产生 + +CFG 是四元组 𝐺=(𝑉,𝑇,𝑃,𝑆),分别是变元集,终结符集,产生式集,开始符号 + +产生式惯用法 + +- 变元:字母表开头大写字母 A,B,C +- 终结符:字母表开头小写字母 a,b,c +- 符号(终结符或变元):字母表结束大写字母 X,Y,Z +- 终结符串:字母表结束小写字母 w,x,y,z +- 符号串:𝛼,𝛽,𝛾 + +- [x] 推导 + +直接推导 𝛼𝐴𝛽⇒𝛼𝛾𝛽⟺𝐴→𝛾 + +连续推导 𝛼𝐴𝛽⇒∗𝛼𝛾𝛽⟺𝐴⇒⋯⇒𝛾 + +多于一次的推导 𝛼𝐴𝛽⇒+𝛼𝛾𝛽 + +最左推导 ⇒𝑙𝑚,最右推导 ⇒𝑟𝑚 + +- [x] 句型与句子 + +句型:从开始符号推导的任意串 + +句子:从开始符号推导的终结符串 + +规约:序列 𝛼1,⋯,𝛼𝑛,其中 𝛼1=𝑤,𝛼𝑛=𝑆,𝛼𝑖⇐𝛼𝑖+1 + +歧义文法:该文法存在一个串是多个语法树的产物;该文法存在一个串存在两个不同最左推导 + +固有歧义的:语言的每个文法均是歧义的 + +- [x] CFG化简 + +==CFG 化简==: + +__找网课__ + +- 消除 𝜀-产生式:删去可空变元,重写产生式,若出现无用符号则消除 +- 消除单位产生式:对于单位产生式推导的序列,以最后的产生式(组)替代单位产生式的产生式变元(检查所有变元序对) +- 无用符号(先消 _无产出_ 后消 _不可达_ ) + - “非产生” 的变元:推导不出终结符串(无候选式、死循环) + - “非可达” 符号:不出现在任意句型中的符号 + +__注意以上简化步骤的次序__ + +乔姆斯基范式:每个产生式右侧仅有 _两个变元或一个终结符_ + +PDA 是七元组 (𝑄,Σ,Γ,𝛿,𝑞0,𝑍0,𝐹),分别为状态集,输入字母集,栈字母集,迁移函数 𝛿:𝑄×(Σ∪{𝜀})→2𝑄×Γ∗,初始状态,开始符号,终结状态集 + +PDA 的移动 (𝑝,𝛾)∈𝛿(𝑞,𝑎,𝑋):状态 𝑞 移动到 𝑝,消耗输入符号 𝑎,使用 𝛾 替代 𝑋 作为新栈顶 + +PDA 图示边标记格式:输入符号,弹出符号/压入符号串 + +瞬时描述 ID:(𝑞,𝑤,𝛼),当前状态,剩余串和栈内容 + +迁移:ID 𝐼 在一次移动变为 ID 𝐽,记为 𝐼⊢𝐽 + +定理 6.5 与 6.6:串里看不见的符号不影响迁移 + +终结状态定义语言,空栈定义语言可互相模拟 + +确定性 PDA:至多存在一个迁移(可以是 𝜀-迁移) + +- [x] 模拟CFG与PDA之间的互相转换 + +__找网课__ + +- CFG 到 PDA:仅三个状态,迁移模拟移入,𝜀-迁移模拟规约 +- PDA 到 CFG + +## 编译原理概要 + +源语言、实现语言、目标语言 + +宿主机器、目标机器 + +词法分析、语法分析、语义分析、代码优化、代码生成 + +源程序、中间表示、目标代码 + +词法分析(<种属,值>):关键字一符一种、全体一种 + +## 语法分析 + +### 自上而下语法分析 + +- [x] LL(1) 文法(自顶向下) + +LL(1) 文法:无二义性,无回溯(无左递归,无左公因子,候选式 FIRST 不相交,若候选首符含空则其 FIRST 交 FOLLOW 为空) + +LL(1) 分析:从左到右扫描,最左推导,向前查看一个 + +消除左递归:对非终结符排序,对每个终结符看前面的终结符,将代带入前面终结符的候选,消除直接左递归(𝐸→𝐸𝛼 | 𝛽 到 𝐸→𝛽𝐸′;𝐸′→𝛼𝐸′ | 𝜀) + +FIRST(𝛼):串 𝛼 能推导出来的串的 _最左侧终结符(或空符)集合_ + +求解 FIRST 迭代法:首先构造非终结符 FIRST,然后根据串构造 + +FOLLOW(A):所有句型中符号 A _右侧的终结符(或结束符)_ + +求解 FOLLOW:先求 FIRST,后遍历产生式 + +提左公因子:加变元消去公因子 + +递归下降语法分析:每个变元构造一个过程 + +构造预测分析表 `M[A, a]`,对于每一个产生式 𝐴→𝛼: + +- 对任意 𝑎∈FIRST(𝛼),`M[A, a]`=𝐴→𝛼 +- 若 𝜀∈FIRST(𝛼),`M[A, b]`=𝐴→𝛼,𝑏∈FOLLOW(𝐴) + +错误处理: + +- 栈顶终结符与输入不匹配:弹出 +- `M[A, b] == null`:Sync + +预测分析表的使用:状态栈和剩余字符串 + +### 自下而上的分析 + +短语:有 𝑆⇒∗𝛼𝐴𝛿,且 𝐴⇒+𝛽,则 𝛽 是句型 𝛼𝛽𝛿 相对于规则 𝐴→𝛽 的短语 + +直接短语:若 𝐴⇒𝛽,则 𝛽 是句型 𝛼𝛽𝛿 相对于规则 𝐴→𝛽 的直接短语 + +句柄:句型的 _最左直接短语_ + +规范规约(最左规约):最右推导的逆过程 + +LR(0) 文法:项目集不包含冲突项目 + +增广文法:在 𝐺 中增加 𝑆′→𝑆 + +活前缀 NFA:初态 𝑆′→∙𝑆,从状态 𝑋→⋯𝑋𝑖−1∙𝑋𝑖⋯ 到 𝑋→⋯𝑋𝑖∙𝑋𝑖+1⋯ 有 𝑋𝑖 弧;到状态 𝑋𝑖→∙𝛽 有 𝜀 弧 + +直接构造活前缀 DFA:初态 𝑝0=CLOSURE({\[S′→∙S]}),𝑞 的 𝑋 迁移到 𝑝 当且仅当 𝑝=CLOSURE({\[A→𝛼X∙𝜂] | \[A→𝛼∙X𝜂]∈q}) + +构造 LR(1) 分析表:使用活前缀 DFA,`ACTION` 为终结符迁移动作(点不在最后 shift / 点在最后 reduce),`GOTO` 为针对变元迁移动作(当 reduce 时使用) + +SLR(1) 分析表:使用 FOLLOW 来加强规约的能力,则 SLR(1) 文法为对于所有项目集,移进项目与规约项目 FOLLOW 不相交的;重新定义项目使其带有 1 个终结符 + +LR 分析表使用:状态栈、符号栈和剩余字符串 + +**归约项目(Reduction Item)** + +归约项目是指在LR分析中,一个项目已经匹配到某个产生式的右部,并准备应用这个产生式进行归约。形式上,它的特征是**项目点在产生式右部的最右侧**。 + +例如,对于产生式 A→αA \rightarrow \alphaA→α,归约项目表示为: + +A→α⋅A \rightarrow \alpha \cdotA→α⋅ + +在这个项目中,点号(·)表示输入已经匹配了产生式 A→αA \rightarrow \alphaA→α 的右部,并且可以进行归约。 + +**移进项目(Shift Item)** + +移进项目表示分析器当前已匹配到某个产生式的部分右部,且下一步需要将下一个输入符号移进来以继续匹配。形式上,它的特征是**项目点位于产生式右部的非终结符或终结符之前**。 + +例如,对于产生式 A→αβA \rightarrow \alpha \betaA→αβ,移进项目表示为: + +A→α⋅βA \rightarrow \alpha \cdot \betaA→α⋅β + +在这个项目中,点号(·)表示输入已经匹配了 α\alphaα,并且需要匹配 β\betaβ 以完成产生式的匹配。 + +**接受项目(Accept Item)** + +接受项目是指在LR分析中,整个**输入已经完全匹配文法的开始符号的产生式**。这是**一个特定的归约项目,表示分析成功地解析了整个输入**。 + +对于文法的开始符号 SSS 和增加的产生式 S′→SS' \rightarrow SS′→S,接受项目表示为: + +S′→S⋅S' \rightarrow S \cdotS′→S⋅ + +这里,点号(·)在产生式的最右侧,表示整个输入已经成功匹配并可接受。 + +**待约项目(Handle Item)** + +待约项目是指在输入串中已经识别出某个子串,这个子串可以用一个产生式的右部进行替换(归约)。待约项目通常用来表示当前分析器正在考虑是否进行归约。例如,对于产生式 A→αA \rightarrow \alphaA→α,待约项目表示为: + +A→α⋅A \rightarrow \alpha \cdotA→α⋅ + +这个术语有时与归约项目相似,因为它们都表示即将进行归约的状态 + +### 语义分析 + +#### 属性文法 + +综合属性、继承属性;S-属性文法:仅有综合属性(自下而上) + +属性方程,过程调用 + +#### 中间表示 + +后缀式,图表示,三地址(四元式、三元式) + +#### 翻译 + +声明的翻译 + +```bash +VarD: TYP L { + typfill($2.dtype, $1.dtype); + } + ; + +L : id Dim, L { + typlink($2.dtype, $$.dtype); + } + | id Dim { + typlink($1.dtype, $$.dtype); + } + ; + +Dim : [num] Dim {} + | %empty {} + ; + +Proc: M Pdef {} + ; + +M : %empty {} + ; + +Pdef: Pdef; Pdef {} + | procid + ; +``` + +嵌套过程声明:`mktab(father)` 建表,`addwidth(tab,name,typr,offset)` 填表,`fillwidth(tab, width)` 填表长,`enterproc(tab, name, chtab)` 建子表登记 + +函数调用的翻译 + +```bash +S : procid '(' args ')' { + for (auto arg : $3.q) { + emit(par, arg, _, _); + } + emit(call, entry(procid), $3.q.size(), _); + } + ; + +args: args, E { $1.q.push(E.place); $$.q = $1.q; } + | E { $$.q = queue(); q.push(E.place); } + +``` + +数组引用的翻译 + +```bash +E : L { + // and much more + } + ; + +L : EList ']' { + + } + | id { + + } + ; + +EList : EList',' E { + + } + | id '[' E { + + } + ; +``` + +`&A[i,j]=base+((i-l_1)*(u_2-l_2)+j-l_2)*w` + +𝑏𝑎𝑠𝑒−𝐶+(⋯(((𝑖1)𝑑2+𝑖2)𝑑3+𝑖3)𝑑4⋯)𝑑𝑛+𝑖𝑛𝑙𝑘≤𝑖𝑘≤𝑢𝑘𝑑𝑘=𝑢𝑙−𝑙𝑘 + +𝐶=((⋯(((𝑙1)𝑑2+𝑙2)𝑑3+𝑙3)𝑑4⋯)𝑑𝑛+𝑙𝑛)𝑤 + +布尔表达式的翻译 + +```bash +E : E_1 or M E_2 { + backpatch($$.falselist, M.quad); + $$.truelist = merge($1.truelist, $4.truelist); + $$.falselist = $4.falselist; + } + | E_1 and M E_2 { + backpatch($$.truelist, M.quad); + $$.falselist = merge($1.falselist, $4.falselist); + $$.truelist = $4.truelist; + } + | not E_1 { + $$.falselist = $2.truelist; + $$.truelist = $2.falselist; + } + | '(' E_1 ')' { + $$.falselist = $2.falselist; + $$.truelist = $2.truelist; + } + | id_1 rop id_2 { + $$.truelist = makelist(nextquad); + emit($2.jop, $1.place, $3.place, NULL); + $$.falselist = makelist(nextquad); + emit(j, NULL, NULL, NULL); + } + | id { + $$.truelist = makelist(nextquad); + emit(jnz, $1.place, NULL, NULL); + $$.falselist = makelist(nextquad); + emit(j, NULL, NULL, NULL); + } + ; + +M : %empty { + $$.quad = nextquad; + } +``` + +控制语句的翻译 + +```bash +Contr : if E then { + bp($2.tc, nxq); + $$.chain = $2.fc; + } + ; + +Stmts : Contr Stmts { $$.chain = merg($1.chain, $2.chain); } + | ConEl Stmts { $$.chain = merg($1.chain, $2.chain); } + | A { $$.chain = 0; } + | Wd Stmts { + bp($2.chain, $1.quad); + Gen(j, _, _, $1.quad); + $$.chain = $1.chain; + } + | begin L end { $$.chain = $2.chain; } + ; + +ConEl : Contr Stmts else{ + q = nxq; Gen(j, , , 0); + bp($1.chain ,nxq); + $$.chain = merge($2.chain, q); + } + ; + +W : while { $$.quad = nxq; } +Wd : W E do { + bp($2.tc, nxq); + $$.chain = $2.fc; + $$.quad = $1.quad; + } + ; + +L : Stmts { $$.chain = $1.chain; } + | Ls Stmts { $$.chain = $2.chain; } + +Ls : L ';' { bp($1.chain, nxq); } + +``` + +### 符号表 + +名字、类型(整、实、双精、布尔、字符、复、标号、指针等)、种属、变量地址长度、标号标志位置、形式参数标志; + +局部变量(包括形式参数)占用的存储空间、返回结果类型、局部过程名及符号表指针、嵌套外层过程 + +__内情向量表__: Dim,base,Type/w, C,𝑙𝑖,𝑢𝑖,𝑑𝑖=𝑢𝑖−𝑙𝑖 + +注意ZYL 的PPT(ch9/10/11)里对于格式规范的要求 + +### 运行时空间组织 + +| offset | chain | content | +| ------ | ----- | ------- | +| 100 | | 形参 | +| 99 | | ……形参 | +| 98 | | 参数个数 | +| 97 | | 访问链 | +| 96 | fp | 控制链 | +| 95 | | 返回地址 | +| 94 | | 局部变量 | +| 93 | | ……局部变量 | +| 92 | | 超长数据 | +| 91 | sp | 超长数据 | + +函数 `` 作为参数,`ip` 代码入口,`ep` 实参求值的过程的活动记录 + +```bash +program c; + procedure p(procedure a); + begin + a; + end; + procedure q; + var x:integer; + procedure r; + begin + writeln(x); + end; + begin + x:=2; + p(r); + end; +begin + q; +end. +``` + +认为过程 `r` 的调用者是过程 `q`,则在 `p` 使用 `r` 时走 `l_r-l_p+1` 层访问链 + +Display 表:过程的嵌套层次显示表,记录该过程的各外层过程的最新活动记录的起始地址 + +### 运行时存储组织 + +编译程序是将源程序的**算法描述部分和数据说明部分**,分别翻译成**机器目标代码和数据存储单元**,最终获得目标程序。 + +目标程序在目标机环境中运行时,都置身于自己的一个运行时存储空间。在基于操作系统之上运行的情况下,目标程序将在自己的逻辑地址空间内运行并存储数据。编译程序在生成代码时,负责明确各类对象在逻辑地址空间是如何存放的,以及目标代码运行时,如何使用逻辑地址空间。 + +在编译过程中,源程序的对象地址分配往往是相对于运行存储空间的偏移量,对象访问采用“基地址+偏移量”寻址方式进行,使得可以选择内存的任意可用区域作为目标程序运行时的存储区。这样生成的目标代码称为浮动地址代码 + +> **注:“基地址”是指运行存储空间之首址。** + +**重点:符号表的内容、组织,过程调用实现,** + +**静态存储分配、动态存储分配的基本方法。** + +**难点:参数传递,过程说明语句代码结构,** + +​ **过程调用语句的代码结构,** + +​ **过程调用语句的语法制导定义,** + +​ **栈式存储分配。** + +#### 运行时存储组织的任务和作用 + +编译程序生成的代码大小通常是固定的,一般存放在专用的区域,即代码区; +目标程序运行过程中,需要创建和访问的数据对象存放在数据区。 + +#### 程序运行时存储空间的布局 + +![[image-20240627165240717.png]] + +#### 存储分配策略 + +数据空间分配是将**源程序数据对象名与给定的数据存储空间地址建立映射关系**。数据对象名与数据存储地址可能是一对多的关系,因为在源程序中说明的一个数据对象,在运行时可能对应不同的存储地址,如递归程序中的局部变量。 + +#### 静态存储分配 + +静态存储管理是一种最简单的存储管理。**当在编译阶段能够确定源程序中各个数据实体的存储空间大小**时,就可以采用静态存储管理。一般而言,适于静态管理的语言必须满足下面的条件: + +( 1 )、数组的上下界必须是常数; + +( 2 )、过程调用不允许递归; + +( 3 )、不允许用户动态地建立数据实体。 + +对于静态存储分配,数据空间仅需要有静态数据区即可。在源程序翻译时,对于所有数据对象,其分配的存储地址都是相对于静态数据区的偏移量。这个偏移量就是登记在符号表中数据对象的地址( .place)属性值。在目标程序运行时,访问数据对象的绝对地址是: + +**绝对地址=静态数据区首址+偏移量。** + +#### 动态存储分配 + +如果源语言允许递归调用、可变数组和允许运行期间自由申请与释放空间,那么其需占用的存储空间在编译阶段无法确定,这样数据对象就需要采用动态存储分配的策略。 + +所谓动态存储分配是指在运行期间,动态进行存储地址分配。 + +•**基于控制栈的原理,存储空间被组织成栈,活动记录的推入和弹出分别对应于活动的开始和结束。** + +•**与静态分配不同,在每次活动中把局部名字和新的存储单元绑定,在活动结束时,活动记录从栈中弹出,因此局部名字的存储空间也随之消失。** + +##### 栈式动态存储分配 + +由于过程允许递归,在某一时刻一个过程A 很可能已被自己调用了若干次,但只有最近一次正处于执行状态,而其余各次则处于等待返回被中断的那次调用的状态。这样,属于每次调用相应的数据区中的内容就必须保存起来,以便于调用返回时继续使用**。对于这种语言来说,其存储分配策略必须采用栈式存储管理,即引入一个运行栈,让过程的每一次执行和过程的调用记录相对应,每调用一次过程,就把该过程的相应调用记录推入栈中,过程执行结束时再把栈顶的调用记录从找中弹出。** + +> 在运行期间以子程序数据区为基本单位,在数据空间栈中进行动态地址分配。 +> +> 当调用子程序时,在数据空间栈顶,给子程序分配所需的子程序数据区; +> +> 当子程序返回时,从数据空间栈顶,收回分配给子程序所占用存储区。 +> +> 当子程序被递归调用时,同一个子程序可能在数据空间中同时拥有多个子程序数据区,每个数据区对应于同一个子程序的一次执行过程。 + +##### 堆式动态存储分配 + +某些程序设计语言(如C 和PASCAL等)允许程序在运行时,为其中的一些变量动态地申请和释放所需的存储空间,并且申请和释放这两类操作可以在任何时间、以任意的顺序来进行,这就需要一种更为灵活和更加有效的动态分配策略,即堆式存储分配来完成上述工作。 + +堆式分配的基本思想是:**为正运行的程序划出一适当大的存储区域,称之为堆(Heap) ; 每当该程序提出申请时, 就按某种分配原则在堆的自由区(可占用区) 中,找出一块能满足其需求的存储空间分配给它,对于释放操作,则是将程序不再占用的存储空间归还给堆的自由区。** +可能遇到的各种情况与操作系统给进程分配存储空间时遇到的极其相似,如同样会出现“碎片”现象等,其根本差异就在于分配的层次和分配对象的粒度。 + +#### 活动记录 + +1.活动记录本质是什么? + +> 活动记录本质上是每次为函数调用时分配的一大块内存。一个函数的活动记录只由在函数被调用时才会创建,并且当函数返回时就会被销毁。 + +2.活动记录是如何存在的? + +> 活动记录被组织在栈中,栈可以是物理上的实体也可以是逻辑上的概念。在数据结构中的栈是一个逻辑上的概念,而芯片中也可以根据这个概念来设计一部分电路,这部分能够模拟栈操作的电路就是物理意义上的栈了。 +> 主函数的活动记录位于栈底,当一个函数调用另外一个函数时,被调用函数的活动记录就会被压入栈。或当记录所在的栈满足数据结构中的栈的特性:FILO(first in last out)。这个限制使得当主调函数和被调函数中出现了同名函数时,在执行被调函数时主调函数的变量对被调函数来说是不可见的。 +> 特别提醒:大部分计算机为活动记录栈分配内存地址都是从高到低! + +3.活动记录是如何进行入栈出栈的? + +> 由于活动记录是位于一个栈中的,所以要近栈就需要知道栈结束处的位置,当出栈时就需要知道当前活动记录之前的一个活动记录的结束点。 +> 所以编译器和硬件都会维护两个很重要的值:栈指针,帧指针。 +> 栈指针:始终指向战结束处(注意不是栈底!)的地址,如果有新的活动记录入栈,那里就是新活动记录的起始地址所在。 +> 帧指针:保存着先前那个活动记录的结束处的地址,在当前函数返回后,栈指针就会指向那里。 +> In short, 栈指针和帧指针就是用来界定活动记录的,并操作活动记录 + + +## 复习重点 + +- [x] DFA-eNFA-RE转换: [RE -> $\epsilon NFA$](https://www.bilibili.com/video/BV1fi4y1Q7Yz/?spm_id_from=333.788&vd_source=8a3dd36862125e80dc439254ef65d959) // [$\epsilon NFA$ -> DFA](https://www.bilibili.com/video/BV1fi4y1Q7Yz/?spm_id_from=333.788&vd_source=8a3dd36862125e80dc439254ef65d959) // [DFA最小化](https://www.bilibili.com/video/BV1rY411J7cR/?spm_id_from=trigger_reload&vd_source=8a3dd36862125e80dc439254ef65d959) +- [x] 模拟CFG与PDA之间的互相转换: 根据指定语言设计PDA / PDA-CFG / DPDA [video]() +- [x] CFG化简 [video](https://www.bilibili.com/video/BV1ZN411M7XE/?spm_id_from=333.337.search-card.all.click&vd_source=8a3dd36862125e80dc439254ef65d959) // RE < DCFL < CFL < $\Sigma$ +- [x] LL(1) 文法(自顶向下) +- [x] LR分析(自底向上) +- [x] 语法置导 && 符号表 +- [x] 运行时空间组织 + +[Following Video](https://space.bilibili.com/514480242/channel/collectiondetail?sid=747764) + +最后一个先看PPT,其余找网课! + +RE -> $\epsilon NFA$ + +https://www.bilibili.com/video/BV1fi4y1Q7Yz/?spm_id_from=333.788&vd_source=8a3dd36862125e80dc439254ef65d959 + +$\epsilon NFA$ -> DFA + +https://www.bilibili.com/video/BV1fi4y1Q7Yz/?spm_id_from=333.788&vd_source=8a3dd36862125e80dc439254ef65d959 + +DFA的化简 + +https://www.bilibili.com/video/BV1rY411J7cR/?spm_id_from=trigger_reload&vd_source=8a3dd36862125e80dc439254ef65d959 + + +- 二义文法:对一部文法,如果至少存在一个句子,有两棵不同语法树,称该句子是二义性的,包含二义性的句子的文法称为二义文法。 +- 上下文无关文法是否具有二义性是不可判定的。但有些特殊的2型文法\[例如LL(1)、LR(0)、LR(1)等文法] 是 __先天无二义性__ 的 +- NFA和DFA的主要区别在于:1)DFA没有输入空串之上的转换动作。2)对于DFA,一个特定的符号输入,有且只能得到一个状态,而NFA就有可能得到一个状态集。DFA:只有唯一初态。NFA:有初态集。DFA是NFA的特例。 +- 分析方法分两大类:自上而下分析法(推导) 和 自下而上分析法(归约),最右推导是规范推导,逆过程为规范规约 + - 自上而下语法分析是:从G的 _开始符号S_ 出发,通过反复使用产生式句型中的 _非终结符_ 进行替换,逐步推导出源程序串,是一种产生的方法,面向目标的方法 + - 自下而上语法分析:从输入串开始不断寻找子串与文法G中 _某个产生式P的候选式_ 进行匹配,并 _用P的左部_ 代替之,逐步归约到S,是一种辨认的方法,基于目标的方法 +- 短语,直接短语,句柄,素短语,最左素短语:(这里给出在语法树上的直观区别方法) + - 短语:在语法树中表示所有分支结点对应子树,短语即子树叶子对应的符号。注: 子树包括语法树本身,及句型本身也可以称为短语 + - 直接短语:在语法树中表示为该短语只有上下相邻父子两代 + - 句柄:最左直接短语 + - 素短语:指一个短语至少包含一个终结符,并且除它自身之外不再包含其他素短语 + - 最左素短语:最左素短语就是句型最左边的素短语,是算符优先分析法的规约对象 +- 翻译程序、编译程序、解释程序 + - 翻译程序:将用某种语言编写的程序转换成另一种语言形式的程序的程序 + - 编译程序:用高级语言编写的源程序转换(加工)成与之等价的另一种用低级语言编写的目标程序的翻译程序。 + - 解释程序:解释程序是高级语言翻译程序的一种,他将输入的源程序作为输入,解释一句后就提交给计算机执行一句,源程序命令被逐个直接解释执行 +- 算符文法与算符优先文法: + - 算符文法:任一产生式的右部都 _不含两个连续非终结符_ 的文法 + - 算符优先文法:是不含空字符且对任一对终结符都有确定的><=关系的算符文法 +- 字母表:元素的非空有穷集合 + 符号:字母表中的元素 + 符号串:字母表中符号组成的有穷序列 +- 句子、句型、语言 + - 句型是由识别符Z推导而得的符号串 + - 句子是没有非终结符号的句型(*句子是全为terminal的句型*) + - 语言是句子的集合 +- 中间代码形式:常见的有逆波兰记号、三元式、四元式和树 + 1. 逆波兰(也称后缀表示):没有括号,易于计算机处理 + 2. 三元式(运算符,对象1,对象2):不便于优化但间接三元式,可以克服这个缺点 + 3. 树形表示 三元式表示也可用相应的树形表示 + 4. 四元式:(运算符; 对象1,对象2, 结果):有利于代码优化 + +