finish adding grammar

This commit is contained in:
Josh Holtrop 2018-04-13 22:16:07 -04:00
parent 9d2c41edc1
commit 3508deecc5

View File

@ -115,6 +115,10 @@ static void handle_error(const char * str, const YYLTYPE * yylloc);
%%
translation_unit: external_declaration
| translation_unit external_declaration
;
constant: TOK_FLOAT_CONST
| TOK_INT_CONST
| TOK_IDENTIFIER
@ -225,6 +229,228 @@ logical_or_expression: logical_and_expression
| logical_or_expression TOK_OR logical_and_expression
;
declaration: declaration_specifiers
| declaration_specifiers init_declarator_list
;
declaration_specifiers: storage_class_specifier
| storage_class_specifier declaration_specifiers
| type_specifier
| type_specifier declaration_specifiers
| type_qualifier
| type_qualifier declaration_specifiers
;
init_declarator_list: init_declarator
| init_declarator_list TOK_COMMA init_declarator
;
init_declarator: declarator
| declarator TOK_ASSIGN initializer
;
storage_class_specifier: TOK_AUTO
| TOK_REGISTER
| TOK_STATIC
| TOK_EXTERN
| TOK_TYPEDEF
;
type_specifier: TOK_VOID
| TOK_CHAR
| TOK_SHORT
| TOK_INT
| TOK_LONG
| TOK_FLOAT
| TOK_DOUBLE
| TOK_SIGNED
| TOK_UNSIGNED
| struct_or_union_specifier
| enum_specifier
| typedef_name
;
type_qualifier: TOK_CONST
| TOK_VOLATILE
;
declarator: direct_declarator
| pointer direct_declarator
;
direct_declarator: TOK_IDENTIFIER
| TOK_LPAREN declarator TOK_RPAREN
| direct_declarator TOK_LBRACKET TOK_RBRACKET
| direct_declarator TOK_LBRACKET constant_expression TOK_RBRACKET
| direct_declarator TOK_LPAREN parameter_type_list TOK_RPAREN
| direct_declarator TOK_LPAREN TOK_RPAREN
| direct_declarator TOK_LPAREN identifier_list TOK_RPAREN
;
pointer: TOK_TIMES
| TOK_TIMES type_qualifier_list
| TOK_TIMES pointer
;
parameter_type_list: parameter_list
| parameter_list TOK_COMMA TOK_ELLIPSES
;
parameter_list: parameter_declaration
| parameter_list TOK_COMMA parameter_declaration
;
type_qualifier_list: type_qualifier
| type_qualifier_list type_qualifier
;
enum_specifier: TOK_ENUM TOK_LBRACKET enumerator_list TOK_RBRACKET
| TOK_ENUM TOK_IDENTIFIER TOK_LBRACKET enumerator_list TOK_RBRACKET
| TOK_ENUM TOK_IDENTIFIER
;
enumerator_list: enumerator
| enumerator_list TOK_COMMA enumerator
;
enumerator: enumeration_constant
| enumeration_constant TOK_ASSIGN constant_expression
;
enumeration_constant: TOK_IDENTIFIER;
struct_or_union_specifier: struct_or_union TOK_LBRACKET struct_declaration_list TOK_RBRACKET
| struct_or_union TOK_IDENTIFIER TOK_LBRACKET struct_declaration_list TOK_RBRACKET
| struct_or_union TOK_IDENTIFIER
;
struct_or_union: TOK_STRUCT
| TOK_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_specifier specifier_qualifier_list
| type_qualifier
| type_qualifier specifier_qualifier_list
;
struct_declarator_list: struct_declarator
| struct_declarator_list TOK_COMMA struct_declarator
;
struct_declarator: declarator
| type_specifier TOK_COLON constant_expression
| type_specifier declarator TOK_COLON constant_expression
;
parameter_declaration: declaration_specifiers declarator
| declaration_specifiers
| declaration_specifiers abstract_declarator
;
identifier_list: TOK_IDENTIFIER
| identifier_list TOK_COMMA TOK_IDENTIFIER
;
abstract_declarator: pointer
| direct_abstract_declarator
| pointer direct_abstract_declarator
;
direct_abstract_declarator: TOK_LPAREN abstract_declarator TOK_RPAREN
| TOK_LBRACKET TOK_RBRACKET
| direct_abstract_declarator TOK_LBRACKET TOK_RBRACKET
| TOK_LBRACKET constant_expression TOK_RBRACKET
| direct_abstract_declarator TOK_LBRACKET constant_expression TOK_RBRACKET
| TOK_LPAREN TOK_RPAREN
| direct_abstract_declarator TOK_LPAREN TOK_RPAREN
| TOK_LPAREN parameter_type_list TOK_RPAREN
| direct_abstract_declarator TOK_LPAREN parameter_type_list TOK_RPAREN
;
initializer: assignment_expression
| TOK_LBRACKET initializer_list TOK_RBRACKET
| TOK_LBRACKET initializer_list TOK_COMMA TOK_RBRACKET
;
initializer_list: initializer
| initializer_list TOK_COMMA initializer
;
type_name: specifier_qualifier_list
| specifier_qualifier_list abstract_declarator
;
typedef_name: TOK_IDENTIFIER;
statement: labeled_statement
| compound_statement
| expression_statement
| selection_statement
| iteration_statement
| jump_statement
;
jump_statement: TOK_GOTO TOK_IDENTIFIER TOK_SEMICOLON
| TOK_CONTINUE TOK_SEMICOLON
| TOK_BREAK TOK_SEMICOLON
| TOK_RETURN TOK_SEMICOLON
| TOK_RETURN expression TOK_SEMICOLON
;
compound_statement: TOK_LBRACKET TOK_RBRACKET
| TOK_LBRACKET declaration_list TOK_RBRACKET
| TOK_LBRACKET statement_list TOK_RBRACKET
| TOK_LBRACKET declaration_list TOK_RBRACKET
| TOK_LBRACKET declaration_list statement_list TOK_RBRACKET
;
declaration_list: declaration
| declaration_list declaration
;
statement_list: statement
| statement_list statement
;
expression_statement: TOK_SEMICOLON
| expression TOK_SEMICOLON
;
iteration_statement: TOK_WHILE TOK_LPAREN expression TOK_RPAREN statement
| TOK_DO statement TOK_WHILE TOK_LPAREN expression TOK_RPAREN TOK_SEMICOLON
| TOK_FOR TOK_LPAREN expressionopt TOK_SEMICOLON expressionopt TOK_SEMICOLON expressionopt TOK_RPAREN statement
;
expressionopt:
| expression
;
selection_statement: TOK_IF TOK_LPAREN expression TOK_RPAREN statement
| TOK_IF TOK_LPAREN expression TOK_RPAREN statement TOK_ELSE statement
| TOK_SWITCH TOK_LPAREN expression TOK_RPAREN statement
;
labeled_statement: TOK_IDENTIFIER TOK_COLON statement
| TOK_CASE constant_expression TOK_COLON statement
| TOK_DEFAULT TOK_COLON statement
;
external_declaration: function_definition
| declaration
;
function_definition: declarator declaration_list compound_statement
| declaration_specifiers declarator declaration_list compound_statement
| declarator compound_statement
| declaration_specifiers declarator compound_statement
;
%%
static void handle_error(const char * str, const YYLTYPE * yylloc)