规范

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

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; }

results matching ""

    No results matching ""

    results matching ""

      No results matching ""