Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit ea92169

Browse files
补充内容
1 parent a37423e commit ea92169

File tree

2 files changed

+27
-18
lines changed

2 files changed

+27
-18
lines changed

‎03_中间代码生成/README.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,15 @@
3636
~ 最常见的情况是控制流图(CFG)用图表示
3737
<br/>
3838
~&emsp;而CFG的每个节点是基本块,每个基本块里的代码是线性代码
39+
* 中间代码生成方法:https://www.bilibili.com/video/BV1cW411B7DW?p=44
40+
~ 语法制导翻译
41+
~ 属性文法制导翻译
42+
* 什么是语法制导翻译:语法分析过程中,边分析,边翻译
43+
* 语法制导翻译具体实现:为每个产生式配置一个语义子程序,当语法分析进行规约或推导时,调用语义子程序完成一部分翻译任务
44+
* 语义子程序的主要任务:改变某些变量的值、查填各种符号表、发现并报告源程序错误、产生中间代码等
45+
* 语义:语义跟文法不一样。例如文法E → E + E,表示一个表达式可以推导出另一个表达式加另另一个表达式,如表达式2+3*4可以拆成表达式2加上表达式3*4,虽然表达式都是E表示,但每个E的语义值不同,例如第一个E的语义值为14,第二个E的语义值为2,第三个E的语义值为12。
46+
* 语义分析常常跟中间代码生成一起实现,所以语法分析、语义分析、中间代码生成经常是在语法分析时候一起进行的
47+
* 语义属性:为描述语义动作,为每个文法符号赋予不同的语义属性:值、类型、地址等
3948
* 三地址表达式:表达式中最多只能出现3个地址,因为cpu无法处理4个及其以上地址的操作。可以看成是抽象语法树的一种线性表示,有如下形式:
4049
```
4150
x:=y op z
@@ -53,7 +62,7 @@
5362
~&emsp;三地址代码是一种线性IR。由于输入源程序及输出目标程序都是线性的,因此,线性IR有着其他形式无法比拟的优势。
5463
<br/>
5564
~&emsp;相对于其他表示形式而言,程序员对于线性表示形式通常会有一种莫名的亲切感,编译器设计者当然也不例外。早期编译器设计者往往都是汇编语言程序设计的高手,可以非常自然、流畅地阅读线性的三地址代码形式。同时,线性表示形式也会降低输入输出的实现难度。
56-
* 中间码生成:按深度优先遍历AST,每个节点生成一个临时变量
65+
* 三地址码生成:按深度优先遍历AST,每个节点生成一个临时变量
5766
* 左值和右值:等号左边和右边的区别。数字1只有右值,变量可以有左值和右值
5867
* BinaryExpr:op左右都有值的称为BinaryExpr
5968
* UaryExpr:op只有右值,没有左值的称为UnaryExpr。例如一个表达式
@@ -77,15 +86,6 @@
7786
t2=t1*5
7887
c=t2
7988
```
80-
转换为OPCode:
81-
```
82-
alloc a
83-
set a #1
84-
alloc b
85-
set b #5
86-
alloc t1
87-
....
88-
```
8989
分析:实例展示了从js源码到三地址码,再到机器码的过程,可以看到三地址码的每行代码永远只存在三个变量。以上只需要按深度优先遍历AST,每个节点生成一个临时变量即可生成。
9090
* 三地址表达式实例2:
9191
源码:
@@ -108,11 +108,11 @@
108108
branch t3==true
109109
goto (return n)行 or (return f(n-1)+f(n-2))行 //return怎么处理??
110110
t4=n-1
111-
t5=f(t4) //如何递归??
111+
t5=f(t4) //如何递归
112112
t6=n-2
113-
t7=f(t6) //如何递归??
113+
t7=f(t6) //如何递归
114114
t8=t5+t7
115-
call f //调用函数如何表示??
115+
call f //如何调用
116116
```
117117
* 文档:
118118
<br/>

‎README.md

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -231,11 +231,20 @@
231231
src
232232
├─parse 语法分析
233233
│ ├─parser.ts 语法分析器
234-
│ ├─pages # 各个页面代码的存放处
235-
│ │─utils # 工具包
236-
│ ├─app.js # 全局JS
237-
│ ├─app.json # 全局配置
238-
│ └─app.wxss # 全局样式
234+
│ ├─xxx xxx
235+
│ │─xxx xxx
236+
│ ├─xxx xxx
237+
│ ├─xxx xxx
238+
│ └─xxx xxx
239239
├─tokenizer 词法分析
240240
└─tsconfig.json # ts项目配置
241241
```
242+
## 参考文档:
243+
* 《编译原理》:Alfred V.Aho,机械工业出版社
244+
* 《编译原理》:哈工大·陈鄞,https://www.bilibili.com/video/BV1zW411t7YE
245+
* 《编译器实现Category》:https://www.hashcoding.net/categories/%E7%BC%96%E8%AF%91%E5%99%A8%E5%AE%9E%E7%8E%B0/
246+
* 《博客园·dejavudwh的博客》:https://www.cnblogs.com/secoding/p/11193700.html
247+
* 《RednaxelaFX写的文章/回答的导航帖》:https://zhuanlan.zhihu.com/p/25042028
248+
* 《kyjm/compiler-in-js》:https://github.com/kyjm/compiler-in-js
249+
* 《jquery/esprima》:https://github.com/jquery/esprima
250+
* 《estools/escodegen》:https://github.com/estools/escodegen

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /