规范
每个步骤结尾的 规范 一节都会对这个步骤中的新特性给出规范,方便大家查阅。
step5 语法规范
灰色部分表示相对上一节的修改。
program : function
function : type Identifier '(' ')' '{' statement* '}'type : 'int' statement : 'return' expression ';'| expression? ';' | declaration declaration : type Identifier ('=' expression)? ';' expression : assignment assignment : logical_or | Identifier '=' expressionlogical_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 ('*'|'/'|'%') unary unary : primary | ('-'|'~'|'!') unary primary : Integer | '(' expression ')'| Identifier
step5 语义规范
5.1. 变量重复声明是错误,使用未声明的变量也是错误。
5.2. 被声明的变量在声明语句完成后,可以被使用。
不能写 int a = a
。
5.3. (局部)变量初始值不确定,使用不确定的值是未定义行为。
5.4. 执行完 main 函数但没有通过 return 结束时,返回值默认为 0。
5.5. 只有左值能出现在赋值号 =
的左边。
表达式被称为左值(lvalue)当且仅当它能被下面两条规则构造出来:
- 被声明过的变量是左值;
- 如果 e 是左值,那么括号括起的 (e) 也是左值。
就 step5 来说,这一点已经被语法保证,无须语义检查。
5.6. 规定赋值表达式的值为,赋值完成后左手边的值。例如 a=(1+3)
的值是 4
。