规范

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

step6 语法规范

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


program
    : function

function : type Identifier '(' ')' '{' block_item* '}'
type : 'int'
block_item : statement | declaration
statement : 'return' expression ';' | expression? ';'
| 'if' '(' expression ')' statement ('else' statement)?
declaration : type Identifier ('=' 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 ('*'|'/'|'%') unary unary : primary | ('-'|'~'|'!') unary primary : Integer | '(' expression ')' | Identifier

step6 语义规范

6.1. int 类型的表达式作为 if 或条件表达式的条件时,非 0(例如 1、-1、1000000007)表示真,0 表示假。

6.2. 如果出现悬吊 else(dangling else),要求 else 优先和内层 if 结合。

例如 if (0) if (0) ; else ; 等价于 if (0) { if (0) ; else; } 而非 if (0) { if (0) ; } else ;

6.3. if 的 then 子句和 else 子句不能仅是一个声明,编译器应当报错错误。

例如 if (1) int a; 是不合法的输入

6.4. 和 2.3 不同,条件表达式规定了子表达式的求值顺序。 首先对条件求值。如果条件值为真,然后仅对 ?: 之间的子表达式求值,作为条件表达式的值, 不得对 : 之后的子表达式求值。 如果条件为假,类似仅对 : 之后的子表达式求值。

results matching ""

    No results matching ""

    results matching ""

      No results matching ""