From 3508deecc5dbb75bdea40c76a45422ca773275f9 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 13 Apr 2018 22:16:07 -0400 Subject: [PATCH] finish adding grammar --- src/parser/parser.y | 226 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) diff --git a/src/parser/parser.y b/src/parser/parser.y index 03beb9e..6955e4c 100644 --- a/src/parser/parser.y +++ b/src/parser/parser.y @@ -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)