规范
每个步骤结尾的 规范 一节都会对这个步骤中的新特性给出规范,方便大家查阅。
step9 语法规范
灰色部分表示相对上一节的修改。
program : function* function : type Identifier '(' parameter_list ')' (compound_statement | ';')type : 'int'parameter_list : (type Identifier (',' type Identifier)*)?compound_statement : '{' block_item* '}' block_item : statement | declaration statement : 'return' expression ';' | expression? ';' | 'if' '(' expression ')' statement ('else' statement)? | compound_statement | 'for' '(' expression? ';' expression? ';' expression? ')' statement | 'for' '(' declaration expression? ';' expression? ')' statement | 'while' '(' expression ')' statement | 'do' statement 'while' '(' expression ')' ';' | 'break' ';' | 'continue' ';' declaration : type Identifier ('=' expression)? ';'expression_list : (expression (',' expression)*)?expression : assignment assignment : conditional | Identifier '=' expression conditional : logical_or | logical_or '?' expression ':' conditional logical_or : logical_and | logical_or '||' logical_and logical_and : equality | logical_and '&&' equality equality : relational | equality ('=='|'!=') relational relational : additive | relational ('<'|'>'|'<='|'>=') additive additive : multiplicative | additive ('+'|'-') multiplicative multiplicative : unary | multiplicative ('*'|'/'|'%') unaryunary : postfix | ('-'|'~'|'!') unary postfix : primary | Identifier '(' expression_list ')'primary : Integer | '(' expression ')' | Identifier
step9 语义规范
9.1. main 默认返回 0,但如果其他函数也没有 return,则它们的返回值未定义。 如果程序尝试使用这个未定义的返回值,那么产生一个未定义行为。 当然,如果程序忽略它,那是合法的。
我们没有支持 void 返回值,但可以忽略返回值达到类似的效果。
9.2. 每个函数只能被定义一次,在定义之前可能有一次前置声明。 多次声明一个函数、以及定义后再声明,均是未定义行为。 多次定义一个函数是错误。
9.3. 函数声明和定义的参数个数、同一位置的参数类型、以及返回值类型必须相同。
现在只有 int 类型,不过以后会有更多类型。
9.4. 调用某函数时,实参和形参的参数个数必须相同,同一位置的参数类型也必须相同。