规范
每个步骤结尾的 规范 一节都会对这个步骤中的新特性给出规范,方便大家查阅。
step1 语法规范
我们采用 EBNF (extended Barkus-Naur form) 记号书写语法规范,采用类似 ANTLR 的记号:
- 小写字母打头的是非终结符(如
program
),大写字母打头的是终结符(如Identifier
),可以用字符串字面量表示终结符(如'int'
) - 后面会用到:
(
和)
表示分组,|
表示选择,*
零或多次,+
一或多次,?
零或一次。- 很容易通过增加新的非终结符,去掉这些符号。例如
x+
就可以被替换成新的非终结符y
,并且y : x | x y
。
- 很容易通过增加新的非终结符,去掉这些符号。例如
EBNF 也有很多写法,另一种是用尖括号表示非终结符
<program> ::= <function>
等。
program
: function
function
: type Identifier '(' ')' '{' statement '}'
type
: 'int'
statement
: 'return' expression ';'
expression
: Integer
step1 语义规范
1.1. MiniDecaf 的 int 类型具体指 32 位有符号整数类型,范围 [-2^31, 2^31-1],补码表示。
1.2. 编译器应当只接受 [0, 2^31-1] 范围内的整数, 我们未来会支持负数。 如果整数超过此范围,编译器应当报错。
1.3. 如果输入程序没有 main
函数,编译器应当报错。