Compiler Principle Part1: Quickly Skip The First Half

由于直到 lv8 之前都比较轻松(个人认为,相对于 lv8 lv9)。

在这之前,让我们看看图,有一个直观演示:

  • 由 bison 生成的状态机图(窝觉得有点变态)

不行了,分享网址太长了(x hhh

anyway,在线渲染网址:https://dreampuf.github.io/GraphvizOnline/

graphviz.svg

你可以使用 bison --graph sysy.y 生成 gv 文件,然后用 graphviz 渲染它。

  • 比较抽象的树状图演示:

new.svg

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
CompUnit ::= (Decl | FuncDef)+

Decl ::= ConstDecl | VarDecl

ConstDecl ::= 'const' Btype ConstDef (',' ConstDef)* ';'

ConstDef ::= IDENT '=' Expr
           | IDENT ArraySuffix '=' InitVal

ArraySuffix ::= ('[' Expr ']')+

InitVal ::= Expr
          | '{' (InitVal (',' InitVal)*)? '}'

VarDecl ::= Btype VarDef (',' VarDef)* ';'

VarDef ::= IDENT ('=' Expr)?
         | IDENT ArraySuffix ('=' InitVal)?

Btype ::= 'int' | 'void'

FuncDef ::= Btype IDENT '(' FuncFParams? ')' Block

FuncFParams ::= FuncFParam (',' FuncFParam)*

FuncFParam ::= 'const'? Btype IDENT ParamArraySuffix?

ParamArraySuffix ::= '[' ']' ArraySuffix?

Block ::= '{' BlockItem* '}'

BlockItem ::= Decl | Stmt

Stmt ::= LVal '=' Expr ';'
       | Block
       | Expr? ';'
       | 'return' Expr? ';'
       | 'break' ';'
       | 'continue' ';'
       | 'while' '(' Expr ')' Stmt
       | 'if' '(' Expr ')' Stmt ('else' Stmt)?

Expr ::= Number
       | '(' Expr ')'
       | LVal
       | IDENT '(' FuncRParams? ')'
       | ('!' | '+' | '-') Expr
       | Expr ('+' | '-' | '*' | '/' | '%' | '<' | '>' | '<=' | '>=' | '==' | '!=' | '&&' | '||') Expr

Number ::= INT_CONST

LVal ::= IDENT ArraySuffix?

FuncRParams ::= Expr (',' Expr)*

复制上面的这段代码并用上方的网址打开渲染就可以看到了~

之后我找个时间优化一下图片显示,现在可能只能 f12 或者去我的 github repo 看比较舒服 :)

会长寻找灵感中...
使用 Hugo 构建
主题 StackJimmy 设计
Published 29 aritcles · Total 89.89k words