规范
每个步骤结尾的 规范 一节都会对这个步骤中的新特性给出规范,方便大家查阅。
step8 语法规范
灰色部分表示相对上一节的修改。
program : function function : type Identifier '(' ')' compound_statement type : 'int' 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 : 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
step8 语义规范
为方便,我们称 for 括号中的三个表达式/声明为:init(或 pre)、ctrl、post。 例如
for (i=0; i<100; i=i+1);
中,i=0
是 init,i<100
是 ctrl,i=i+1
是 post。
8.1. for 循环的控制表达式可以为空,表示循环条件永远为真。
8.2. for 语句自身带一个作用域,给作为 init 的声明用。 如果 for 的循环体是 block 语句块,那么循环体再带一个作用域。
因此
for (int i=0;;i=i+1) { int i=1; return i; }
是合法代码。
8.3. 在循环外使用 break 和 continue 是错误行为。
8.4. break 跳转至最近的循环的结束后第一条语句。
8.5. 如果最近的循环语句是 do 或 while,continue 跳转到执行条件判断; 如果是 for,continue 跳转到执行 post(然后再计算循环条件、结束/继续循环……)。
因此
for (int i=0;i<100;i++) { s+=i; continue; }
就等于for (int i=0;i<100;i++) { s+=i; }