由于直到 lv8 之前都比较轻松(个人认为,相对于 lv8 lv9)。
在这之前,让我们看看图,有一个直观演示:
不行了,分享网址太长了(x hhh
anyway,在线渲染网址:https://dreampuf.github.io/GraphvizOnline/

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

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 看比较舒服 :)