规范

每个步骤结尾的 规范 一节都会对这个步骤中的新特性给出规范,方便大家查阅。

step5 语法规范

灰色部分表示相对上一节的修改。


program
    : function

function : type Identifier '(' ')' '{' statement* '}'
type : 'int' statement : 'return' expression ';'
| expression? ';' | declaration declaration : type Identifier ('=' expression)? ';' expression : assignment assignment : logical_or | Identifier '=' expression
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 ('*'|'/'|'%') 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

results matching ""

    No results matching ""

    results matching ""

      No results matching ""