用英文定义一份c语言文法
时间: 2024-05-01 12:22:51 浏览: 13
Here is a possible definition of the C language grammar in English:
```
program -> translation-unit
translation-unit -> external-declaration | translation-unit external-declaration
external-declaration -> function-definition | declaration
function-definition -> declaration-specifiers declarator declaration-list? compound-statement
declaration-list -> declaration | declaration-list declaration
declaration -> declaration-specifiers init-declarator-list? ;
declaration-specifiers -> storage-class-specifier | type-specifier | type-qualifier | function-specifier | alignment-specifier
storage-class-specifier -> typedef | extern | static | _Thread_local | auto | register
type-specifier -> void | char | short | int | long | float | double | signed | unsigned | struct-or-union-specifier | enum-specifier | typedef-name
struct-or-union-specifier -> struct-or-union identifier? { struct-declaration-list } | struct-or-union identifier
struct-or-union -> struct | union
struct-declaration-list -> struct-declaration | struct-declaration-list struct-declaration
struct-declaration -> specifier-qualifier-list struct-declarator-list? ;
specifier-qualifier-list -> type-specifier | type-qualifier | specifier-qualifier-list type-specifier | specifier-qualifier-list type-qualifier
struct-declarator-list -> struct-declarator | struct-declarator-list , struct-declarator
struct-declarator -> declarator? : constant-expression | declarator
enum-specifier -> enum identifier? { enumerator-list } | enum identifier? { enumerator-list , }
enumerator-list -> enumerator | enumerator-list , enumerator
enumerator -> identifier | identifier = constant-expression
type-qualifier -> const | restrict | volatile | _Atomic
function-specifier -> inline | _Noreturn
alignment-specifier -> _Alignas ( type-name | constant-expression )
init-declarator-list -> init-declarator | init-declarator-list , init-declarator
init-declarator -> declarator | declarator = initializer
initializer -> assignment-expression | { initializer-list } | { initializer-list , }
initializer-list -> initializer | initializer-list , initializer
declarator -> pointer? direct-declarator
direct-declarator -> identifier | ( declarator ) | direct-declarator [ * ] | direct-declarator [ static type-qualifier-list? assignment-expression ] | direct-declarator [ type-qualifier-list static assignment-expression ] | direct-declarator [ type-qualifier-list? * ] | direct-declarator ( parameter-type-list? ) | direct-declarator ( identifier-list? )
pointer -> * type-qualifier-list? pointer? | * type-qualifier-list?
type-qualifier-list -> type-qualifier | type-qualifier-list type-qualifier
parameter-type-list -> parameter-list | parameter-list , ...
parameter-list -> parameter-declaration | parameter-list , parameter-declaration
parameter-declaration -> declaration-specifiers declarator | declaration-specifiers abstract-declarator? | declaration-specifiers
identifier-list -> identifier | identifier-list , identifier
type-name -> specifier-qualifier-list abstract-declarator?
abstract-declarator -> pointer | direct-abstract-declarator | pointer direct-abstract-declarator
direct-abstract-declarator -> ( abstract-declarator )? [ * ] | ( direct-abstract-declarator )? [ static type-qualifier-list? assignment-expression ] | ( direct-abstract-declarator )? [ type-qualifier-list static assignment-expression ] | ( direct-abstract-declarator )? [ type-qualifier-list? * ] | ( abstract-declarator )? ( parameter-type-list? ) | ( direct-abstract-declarator )? ( identifier-list? )
statement -> labeled-statement | compound-statement | expression-statement | selection-statement | iteration-statement | jump-statement
labeled-statement -> identifier : statement | case constant-expression : statement | default : statement
compound-statement -> { declaration-list? statement-list? }
statement-list -> statement | statement-list statement
expression-statement -> expression? ;
selection-statement -> if ( expression ) statement | if ( expression ) statement else statement | switch ( expression ) statement
iteration-statement -> while ( expression ) statement | do statement while ( expression ) ; | for ( expression? ; expression? ; expression? ) statement | for ( declaration expression? ; expression? ) statement
jump-statement -> goto identifier ; | continue ; | break ; | return expression? ;
expression -> assignment-expression | expression , assignment-expression
assignment-expression -> conditional-expression | unary-expression assignment-operator assignment-expression
assignment-operator -> = | *= | /= | %= | += | -= | <<= | >>= | &= | ^= | |=
conditional-expression -> logical-or-expression | logical-or-expression ? expression : conditional-expression
logical-or-expression -> logical-and-expression | logical-or-expression || logical-and-expression
logical-and-expression -> inclusive-or-expression | logical-and-expression && inclusive-or-expression
inclusive-or-expression -> exclusive-or-expression | inclusive-or-expression | exclusive-or-expression
exclusive-or-expression -> and-expression | exclusive-or-expression ^ and-expression
and-expression -> equality-expression | and-expression & equality-expression
equality-expression -> relational-expression | equality-expression == relational-expression | equality-expression != relational-expression
relational-expression -> shift-expression | relational-expression < shift-expression | relational-expression > shift-expression | relational-expression <= shift-expression | relational-expression >= shift-expression
shift-expression -> additive-expression | shift-expression << additive-expression | shift-expression >> additive-expression
additive-expression -> multiplicative-expression | additive-expression + multiplicative-expression | additive-expression - multiplicative-expression
multiplicative-expression -> cast-expression | multiplicative-expression * cast-expression | multiplicative-expression / cast-expression | multiplicative-expression % cast-expression
cast-expression -> unary-expression | ( type-name ) cast-expression
unary-expression -> postfix-expression | ++ unary-expression | -- unary-expression | unary-operator cast-expression | sizeof unary-expression | sizeof ( type-name )
postfix-expression -> primary-expression | postfix-expression [ expression ] | postfix-expression ( argument-expression-list? ) | postfix-expression . identifier | postfix-expression -> identifier | postfix-expression ++ | postfix-expression --
primary-expression -> identifier | constant | string-literal | ( expression ) | generic-selection
generic-selection -> _Generic ( assignment-expression , generic-assoc-list )
generic-assoc-list -> generic-association | generic-assoc-list , generic-association
generic-association -> type-name : assignment-expression | default : assignment-expression
constant -> integer-constant | floating-constant | enumeration-constant | character-constant
integer-constant -> decimal-constant | octal-constant | hexadecimal-constant
decimal-constant -> nonzero-digit decimal-constant? | 0
octal-constant -> 0 octal-constant? octal-digit
hexadecimal-constant -> 0x hexadecimal-digit+ | 0X hexadecimal-digit+
floating-constant -> fractional-constant exponent-part? | digit-sequence exponent-part
exponent-part -> e sign? digit-sequence | E sign? digit-sequence
fractional-constant -> digit-sequence . digit-sequence? | . digit-sequence
sign -> + | -
digit-sequence -> digit | digit-sequence digit
octal-digit -> 0..7
nonzero-digit -> 1..9
hexadecimal-digit -> digit | a..f | A..F
character-constant -> ' c-char-sequence '
c-char-sequence -> c-char | c-char-sequence c-char
c-char -> any character except ' and \ | escape-sequence
escape-sequence -> \ ' | \ " | \ ? | \ \ | \ a | \ b | \ f | \ n | \ r | \ t | \ v | \ octal-digit | \ octal-digit octal-digit | \ octal-digit octal-digit octal-digit | \ x hexadecimal-digit+ | \ u hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit? | \ U hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit?
identifier -> nondigit | identifier nondigit | identifier digit
nondigit -> _ | a..z | A..Z
digit -> 0..9
```