| translation_unit | ::= | ( external_declaration )* <EOF> | 
| external_declaration | ::= | var_declaration | 
| | | function_defn | |
| | | struct_defn | |
| | | enum_defn | |
| function_defn | ::= | type_name declarator compound_statement | 
| struct_defn | ::= | "struct" <ID> "{" var_decl_list "}" ";" | 
| var_decl_list | ::= | ( var_declaration )+ | 
| enum_defn | ::= | "enum" <ID> "{" enum_id_list "}" ";" | 
| enum_id_list | ::= | ( <ID> ( "," <ID> )* )? | 
| var_declaration | ::= | type_name declarator_list | 
| declarator_list | ::= | declarator ( init | ) ( ";" | "," declarator_list ) | 
| init | ::= | "=" exp | 
| type_name | ::= | "void" | 
| | | "char" | |
| | | "signed" ( "char" | "short" ( "int" )? | "long" ( "int" )? | ( "int" )? ) | |
| | | "unsigned" ( "char" | "short" ( "int" )? | "long" ( "int" )? | ( "int" )? ) | |
| | | "short" ( "int" )? | |
| | | "bool" | |
| | | "int" | |
| | | "long" ( "int" )? | |
| | | "float" | |
| | | "double" | |
| | | <ID> | |
| declarator | ::= | <ID> declarator_prime | 
| | | "(" declarator ")" declarator_prime | |
| | | "*" declarator | |
| | | "&" declarator | |
| declarator_prime | ::= | ( "[" expression "]" | parameter_list )* | 
| parameter_list | ::= | "(" ( param_declaration ( "," param_declaration )* )? ")" | 
| param_declaration | ::= | type_name declarator | 
| statement | ::= | "break" ";" | 
| | | "continue" ";" | |
| | | "return" opt_exp ";" | |
| | | compound_statement | |
| | | var_declaration | |
| | | opt_exp ";" | |
| | | "if" "(" expression ")" statement ( "else" statement | ) | |
| | | "switch" "(" expression ")" "{" cases "}" | |
| | | "while" "(" expression ")" statement | |
| | | "do" statement "while" "(" expression ")" ";" | |
| | | "for" "(" more_for | |
| more_for | ::= | var_declaration opt_exp ";" opt_exp ")" statement | 
| | | opt_exp ";" opt_exp ";" opt_exp ")" statement | |
| opt_exp | ::= | expression | 
| | | ||
| cases | ::= | ( ( ( "case" expression ":" | "default" ":" ) )+ ( statement )+ )+ | 
| compound_statement | ::= | "{" ( statement )* "}" | 
| expression | ::= | exp | 
| exp | ::= | unary ( ( binaryOp exp | "?" expression ":" exp ) )* | 
| unary | ::= | unaryOp exp | 
| | | "delete" ( "[" "]" exp | exp ) | |
| | | simple | |
| unaryOp | ::= | ( "++" | "--" | "~" | "!" | "-" | "+" | "&" | "*" ) | 
| binaryOp | ::= | ( "*" | "/" | "%" | "+" | "-" | "<<" | ">>" | "<" | "<=" | ">" | ">=" | "==" | "!=" | "&" | "^" | "|" | "&&" | "||" | "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | "&=" | "|=" | "^=" | "," ) | 
| simple | ::= | "new" type_name ( "[" expression "]" | ) | 
| | | primary after_primary | |
| after_primary | ::= | ( "++" | "--" | "." <ID> | "->" <ID> | "[" expression "]" | "(" argument_list ")" )* | 
| argument_list | ::= | ( exp ( "," exp )* )? | 
| primary | ::= | "(" expression ")" | 
| | | <ID> | |
| | | constant | |
| constant | ::= | <OCTALINT> | 
| | | <DECIMALINT> | |
| | | <FLOATONE> | |
| | | <FLOATTWO> | |
| | | <CHARACTER> | |
| | | <STRING> |