| Name | Description | Parse |
Compile |
Test |
| T.1 | token := keyword |  |  | mt_1 |
| T.2 | token := id |  |  | triv |
| T.3 | token := const |  |  | mt_3 |
| T.4 | token := string |  |  | mt_4 |
| T.5 | token := punctuator |  |  | mt_5 |
| T.6 | token := comment |  |  | mt_6 |
| G.1 | program := list of functions or declarations (one funcion must be main) |  |  | mg_1 |
| G.2.1 | declaration := type_name comma list of declarators ; |  |  | mg_2_1 |
| G.2.2 | declaration := extern type_name comma list of ( id or id[] ) ; |  |  | mg_2_2 |
| G.3 | type_name := void, int, or char plus optional *'s |  |  | mg_3 |
| G.4.1 | declarator := id |  |  | mg_4_1 |
| G.4.2 | declarator := id = ass_expr |  |  | mg_4_2 |
| G.4.3 | declarator := id [ ass_expr ] |  |  | mg_4_3 |
| G.4.4 | declarator := id [ ] = string |  |  | mg_4_4 |
| G.4.5 | declarator := id [ ] = { expr_list } |  |  | mg_4_5 |
| G.5.1 | function := type_name id ( param_type_list ) block |  |  | mg_5_1 |
| G.5.2 | function := type_name id ( param_type_list ) ; |  |  | mg_5_2 |
| G.6 | param_type_list := empty or comma list of type_name idopt |  |  | mg_6 |
| G.7 | block := { list of statements } |  |  | mg_7 |
| G.8.1 | statement := ; |  |  | mg_8_1 |
| G.8.2 | statement := block |  |  | mg_8_2 |
| G.8.3 | statement := keyword_statement |  |  | mg_8_3 |
| G.8.4 | statement := labeled_statement |  |  | mg_8_4 |
| G.8.5 | statement := expression ; |  |  | mg_8_5 |
| G.8.6 | statement := declaration |  |  | mg_8_6 |
| G.9.1 | keyword_statement := for ( statement expressionopt ; expressionopt ) statement |  |  | mg_9_1 |
| G.9.2 | keyword_statement := while ( expression ) statement |  |  | mg_9_2 |
| G.9.3 | keyword_statement := if ( expression ) statement |  |  | mg_9_3 |
| G.9.4 | keyword_statement := if ( expression ) statement else statement |  |  | mg_9_4 |
| G.9.5 | keyword_statement := goto id ; (id may not be defined at this point) |  |  | mg_9_5 |
| G.9.6 | keyword_statement := goto expression ; |  |  | mg_9_6 |
| G.9.7 | keyword_statement := continue; |  |  | mg_9_7 |
| G.9.8 | keyword_statement := break; |  |  | mg_9_8 |
| G.9.9 | keyword_statement := return; |  |  | mg_9_9 |
| G.9.10 | keyword_statement := return expression; |  |  | mg_9_10 |
| G.10 | labeled_statement := new in current scopes id : statement |  |  | mg_8_4 |
| G.11.1 | expression := ass_expr |  |  | mg_11_1 |
| G.11.2 | expression := exression , ass_expr |  |  | mg_11_2 |
| G.12.1 | ass_expr := conditional_expr |  |  | mg_12_1 |
| G.12.2 | ass_expr := unary_expr ass_operator ass_expr |  |  | mg_12_2 |
| G.13 | ass_operator := one of = -= += |  |  | mg_13 |
| G.14.1 | equality_expr := rel_expr |  |  | mg_14_1 |
| G.14.2 | equality_expr := equality_expr == rel_expr |  |  | mg_14_2 |
| G.14.3 | equality_expr := equality_expr != rel_expr |  |  | mg_14_3 |
| G.15.1 | rel_expr := add_expr |  |  | mg_15_1 |
| G.15.2 | rel_expr := rel_expr < add_expr |  |  | mg_15_2 |
| G.15.3 | rel_expr := rel_expr > add_expr |  |  | mg_15_3 |
| G.15.4 | rel_expr := rel_expr <= add_expr |  |  | mg_15_4 |
| G.15.5 | rel_expr := rel_expr >= add_expr |  |  | mg_15_5 |
| G.16.1 | add_expr := mul_expr |  |  | mg_16_1 |
| G.16.2 | add_expr := add_expr + mul_expr |  |  | mg_16_2 |
| G.16.3 | add_expr := add_expr - mul_expr |  |  | mg_16_3 |
| G.17.1 | mul_expr := unary_expr |  |  | mg_17_1 |
| G.17.2 | mul_expr := mul_expr * unary_expr |  |  | mg_17_2 |
| G.17.3 | mul_expr := mul_expr / unary_expr |  |  | mg_17_3 |
| G.17.4 | mul_expr := mul_expr % unary_expr |  |  | mg_17_4 |
| G.18.1 | unary_expr := postfix_expr |  |  | mg_18_1 |
| G.18.2 | unary_expr := ++ unary_expr |  |  | mg_18_2 |
| G.18.3 | unary_expr := -- unary_expr |  |  | mg_18_3 |
| G.18.4 | unary_expr := & unary_expr |  |  | mg_18_4 |
| G.18.5 | unary_expr := * unary_expr |  |  | mg_18_5 |
| G.18.6 | unary_expr := + unary_expr |  |  | mg_18_6 |
| G.18.7 | unary_expr := - unary_expr |  |  | mg_18_7 |
| G.18.8 | unary_expr := ! unary_expr |  |  | mg_18_8 |
| G.19.1 | postfix_expr := prim_expr |  |  | mg_19_1 |
| G.19.2 | postfix_expr := postfix_expr [ expression ] |  |  | mg_19_2 |
| G.19.3 | postfix_expr := postfix_expr ( expr_list ) |  |  | mg_19_3 |
| G.19.4 | postfix_expr := postfix_expr ++ |  |  | mg_19_4 |
| G.19.5 | postfix_expr := postfix_expr -- |  |  | mg_19_5 |
| G.20 | expr_list := empty or comma list of ass_expr |  |  | mg_20 |
| G.21.1 | prim_expr := known id |  |  | mg_21_1 |
| G.21.2 | prim_expr := const |  |  | mg_21_2 |
| G.21.3 | prim_expr := string |  |  | mg_21_3 |
| G.21.4 | prim_expr := ( expression ) |  |  | mg_21_4 |
| G.21.5 | prim_expr := operator_io |  |  | mg_21_5 |
| G.22.1 | operator_io := __out expression |  |  | mg_22_1 |
| G.22.2 | operator_io := __in |  |  | mg_22_2 |
| G.23.1 | conditional_expr := logic_or_expr |  |  | mg_23_1 |
| G.23.2 | conditional_expr := logic_or_expr ? expression : conditional_expr |  |  | mg_23_2 |
| G.24.1 | logic_or_expr := logic_and_expr |  |  | mg_24_1 |
| G.24.2 | logic_or_expr := logic_or_expr || logic_and_expr |  |  | mg_24_2 |
| G.25.1 | logic_and_expr := equality_expr |  |  | mg_25_1 |
| G.25.2 | logic_and_expr := logic_and_expr && equality_expr |  |  | mg_25_2 |
| L.1 | Library: int putchar(int); |  |  | ml_1 |
| L.2 | Library: int _putint(int); |  |  | ml_2 |
| L.3 | Library: int getchar(); |  |  | ml_3 |
| L.4 | Library: int puts(int); |  |  | ml_4 |
| L.5 | Library: int printf(int,...); support %%, %d, %c, and %s |  |  | ml_5 |
|
|