Compiler 2013: Grammar
外观
Top level
program: (declaration | function-definition)+ declaration: 'typedef' type-specifier declarators ';' | type-specifier init-declarators? ';' function-definition: type-specifier plain-declarator '(' parameters? ')' compound-statement parameters: plain-declaration (',' plain-declaration)* (',' '...')? declarators: declarator (',' declarator)* init-declarators: init-declarator (',' init-declarator)* init-declarator: declarator ('=' initializer)? initializer: assignment-expression | '{' initializer (',' initializer)* '}' type-specifier: 'void' | 'char' | 'int' | typedef-name | struct-or-union identifier? '{' (type-specifier declarators ';')+ '}' | struct-or-union identifier struct-or-union: 'struct' | 'union' plain-declaration: type-specifier declarator declarator: plain-declarator '(' parameters? ')' | plain-declarator ('[' constant-expression ']')* plain-declarator: '*'* identifier
Statements
statement: expression-statement | compound-statement | selection-statement | iteration-statement | jump-statement expression-statement: expression? ';' compound-statement: '{' declaration* statement* '}' selection-statement: 'if' '(' expression ')' statement ('else' statement)? iteration-statement: 'while' '(' expression ')' statement | 'for' '(' expression? ';' expression? ';' expression? ')' statement jump-statement: 'continue' ';' | 'break' ';' | 'return' expression? ';'
Expressions
expression: assignment-expression (',' assignment-expression)* assignment-expression: logical-or-expression | unary-expression assignment-operator assignment-expression assignment-operator: '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' | '>>=' | '&=' | '^=' | '|=' constant-expression: logical-or-expression logical-or-expression: logical-and-expression ('||' logical-and-expression)* logical-and-expression: inclusive-or-expression ('&&' inclusive-or-expression)* inclusive-or-expression: exclusive-or-expression ('|' exclusive-or-expression)* exclusive-or-expression: and-expression ('^' and-expression)* and-expression: equality-expression ('&' equality-expression)* equality-expression: relational-expression (equality-operator relational-expression)* equality-operator: '==' | '!=' relational-expression: shift-expression (relational-operator shift-expression)* relational-operator: '<' | '>' | '<=' | '>=' shift-expression: additive-expression (shift-operator additive-expression)* shift-operator: '<<' | '>>' additive-expression: multiplicative-expression (additive-operator multiplicative-expression)* additive-operator: '+' | '-' multiplicative-expression: cast-expression (multiplicative-operator cast-expression)* multiplicative-operator: '*' | '/' | '%' cast-expression: unary-expression | '(' type-name ')' cast-expression type-name: type-specifier '*'* unary-expression: postfix-expression | '++' unary-expression | '--' unary-expression | unary-operator cast-expression | 'sizeof' unary-expression | 'sizeof' '(' type-name ')' unary-operator: '&' | '*' | '+' | '-' | '~' | '!' postfix-expression: primary-expression postfix* postfix: '[' expression ']' | '(' arguments? ')' | '.' identifier | '->' identifier | '++' | '--' arguments: assignment-expression (',' assignment-expression)* primary-expression: identifier | constant | string | '(' expression ')' constant: integer-constant | character-constant