-
- means the preceding element is repeated zero or more times
-
- means one or more repeats
- ? means optional(zero or one)
只有正整数,大致形式是 0 或 5
digit = [0-9]
expr= num ("+" num | "-" num)*
num = digit+
digit = [0-9]
expr= num ("+" num | "-" num)*
num = digit+
digit = [0-9]
expr= num ("+" num | "-" num)*
num = digit+
digit = [0-9]
expr= num ("+" num | "-" num)*
num = digit+
digit = [0-9]
expr = mul ("+" mul | "-" mul)*
mul = num ("*" num | "/" num)*
num = digit+
digit = [0-9]
expr = mul ("+" mul | "-" mul)*
mul = primary ("*" primary | "/" primary)*
primary = num | "(" expr ")"
num = digit+
digit = [0-9]
expr = mul ("+" mul | "-" mul)*
mul = unary ("*" unary | "/" unary)*
unary = ("+" | "-")? primary
primary = num | "(" expr ")"
num = digit+
digit = [0-9]
expr = equality
equality = relational ("==" relational | "!=" relational)*
relational = add ("<" add | "<=" add | ">" add | ">=" add)*
add = mul ("+" mul | "-" mul)*
mul = unary ("*" unary | "/" unary)*
unary = ("+" | "-")? primary
primary = num | "(" expr ")"
num = digit+
digit = [0-9]
program = stmt*
stmt = expr ";"
expr = assign
assign = equality ("=" assign)?
equality = relational ("==" relational | "!=" relational)*
relational = add ("<" add | "<=" add | ">" add | ">=" add)*
add = mul ("+" mul | "-" mul)*
mul = unary ("*" unary | "/" unary)*
unary = ("+" | "-")? primary
primary = num | ident | "(" expr ")"
num = digit+
digit = [0-9]
ident = [a-z]+[a-z0-9_]*
program = stmt*
stmt = expr ";"
| "return" expr ";"
expr = assign
assign = equality ("=" assign)?
equality = relational ("==" relational | "!=" relational)*
relational = add ("<" add | "<=" add | ">" add | ">=" add)*
add = mul ("+" mul | "-" mul)*
mul = unary ("*" unary | "/" unary)*
unary = ("+" | "-")? primary
primary = num | ident | "(" expr ")"
num = digit+
digit = [0-9]
ident = [a-z]+[a-z0-9_]*
program = stmt*
stmt = expr ";"
| "return" expr ";"
| "if" "(" expr ")" stmt ("else" stmt)?
| "while" "(" expr ")" stmt
| "for" "(" expr? ";" expr? ";" expr? ")" stmt
expr = assign
assign = equality ("=" assign)?
equality = relational ("==" relational | "!=" relational)*
relational = add ("<" add | "<=" add | ">" add | ">=" add)*
add = mul ("+" mul | "-" mul)*
mul = unary ("*" unary | "/" unary)*
unary = ("+" | "-")? primary
primary = num | ident | "(" expr ")"
num = digit+
digit = [0-9]
ident = [a-z]+[a-z0-9_]*
支持语句块
program = stmt*
stmt = expr ";"
| "return" expr ";"
| "if" "(" expr ")" stmt ("else" stmt)?
| "while" "(" expr ")" stmt
| "for" "(" expr? ";" expr? ";" expr? ")" stmt
| "{" stmt* "}"
expr = assign
assign = equality ("=" assign)?
equality = relational ("==" relational | "!=" relational)*
relational = add ("<" add | "<=" add | ">" add | ">=" add)*
add = mul ("+" mul | "-" mul)*
mul = unary ("*" unary | "/" unary)*
unary = ("+" | "-")? primary
primary = num | ident | "(" expr ")"
num = digit+
digit = [0-9]
ident = [a-z]+[a-z0-9_]*
支持函数
program = stmt*
stmt = expr ";"
| "return" expr ";"
| "if" "(" expr ")" stmt ("else" stmt)?
| "while" "(" expr ")" stmt
| "for" "(" expr? ";" expr? ";" expr? ")" stmt
| "{" stmt* "}"
expr = assign
assign = equality ("=" assign)?
equality = relational ("==" relational | "!=" relational)*
relational = add ("<" add | "<=" add | ">" add | ">=" add)*
add = mul ("+" mul | "-" mul)*
mul = unary ("*" unary | "/" unary)*
unary = ("+" | "-")? primary
primary = num
| ident ("(" ")")?
| "(" expr ")"
num = digit+
digit = [0-9]
ident = [a-z]+[a-z0-9_]*
需要如下步骤
- 一元
&:返回变量地址和一元*:返回地址指向的值 - 删除隐式变量定义并引入关键字int
- 实现指针加法和减法
- sizeof运算符
- 实现数组
- 实现数组下标
- 全局变量
- 字符类型
- 字符串字面量
- ...
program = toplv*
toplv = typ ident ("(" (typ ident ("," typ ident)*)? ")" "{" stmt* "}" | ("[" num "]")* ";")
stmt = expr ";"
| "{" stmt* "}"
| "if" "(" expr ")" stmt ("else" stmt)?
| "while" "(" expr ")" stmt
| "for" "(" expr? ";" expr? ";" expr? ")" stmt
| "return" expr ";"
| typ ident ("[" num "]")* ";"
expr = assign
assign = equality ("=" assign)?
equality = relational ("==" relational | "!=" relational)*
relational = add ("<" add | "<=" add | ">" add | ">=" add)*
add = mul ("+" mul | "-" mul)*
mul = unary ("*" unary | "/" unary)*
unary = "+"? primary
| "-"? primary
| "&" unary
| "*" unary
| "sizeof" unary
| primary "[" expr "]"
primary = num
| ident ("(" (expr ("," expr)*)? ")")?
| "(" expr ")"
typ = ("int" | "char") "*"*
num = digit+
digit = [0-9]
ident = [a-z]+[a-z0-9_]*
mini-decaf几乎就是一个C子集 下面的内容可能有bug
program = toplv*
toplv = typ ident ("(" (typ ident ("," typ ident)*)? ")" "{" stmt* "}" | ("[" num "]")* ";")
stmt = expr ";"
| "{" stmt* "}"
| "if" "(" expr ")" stmt ("else" stmt)?
| "while" "(" expr ")" stmt
| "for" "(" expr? ";" expr? ";" expr? ")" stmt
| "return" expr ";"
| typ ident ("[" num "]")* ";"
expr = assign
assign = equality ("=" assign)?
equality = relational ("==" relational | "!=" relational)*
relational = add ("<" add | "<=" add | ">" add | ">=" add)*
add = mul ("+" mul | "-" mul)*
mul = unary ("*" unary | "/" unary)*
unary = "+"? primary
| "-"? primary
| "&" unary
| "*" unary
| "sizeof" unary
| primary "[" expr "]"
primary = num
| ident ("(" (expr ("," expr)*)? ")")?
| "(" expr ")"
typ = ("int" | "char") "*"*
小 feature 如 ternary expr ; var 以外加上 val ; 允许 var 做类型推断。