diff --git a/src/Node.cc b/src/Node.cc index f8e9571..a43a997 100644 --- a/src/Node.cc +++ b/src/Node.cc @@ -1,2 +1,13 @@ #include "Node.h" #include + +Node::Node(int _type) +{ + type = _type; + switch (type) + { + case NODE_TYPE_LIST: + list = new std::vector(); + break; + } +} diff --git a/src/Node.h b/src/Node.h index e3beaa9..bc29918 100644 --- a/src/Node.h +++ b/src/Node.h @@ -2,14 +2,12 @@ #define NODE_H #include +#include class Node { public: - Node(int _type) - { - type = _type; - } + Node(int _type); int type; union @@ -20,12 +18,19 @@ public: size_t line; std::string * text; } token; + std::vector * list; + struct + { + std::string * name; + } declarator; }; }; enum { NODE_TYPE_TOKEN, + NODE_TYPE_LIST, + NODE_TYPE_DECLARATOR, }; #endif diff --git a/src/parser/parser.yc b/src/parser/parser.yc index 5aec199..d828a27 100644 --- a/src/parser/parser.yc +++ b/src/parser/parser.yc @@ -261,21 +261,46 @@ constant_expression declaration : declaration_specifiers SEMICOLON - | declaration_specifiers init_declarator_list SEMICOLON + | declaration_specifiers init_declarator_list SEMICOLON { + } ; declaration_specifiers - : storage_class_specifier - | storage_class_specifier declaration_specifiers - | type_specifier - | type_specifier declaration_specifiers - | type_qualifier - | type_qualifier declaration_specifiers + : storage_class_specifier { + $$ = new Node(NODE_TYPE_LIST); + $$->list->push_back($1); + } + | storage_class_specifier declaration_specifiers { + $$ = $2; + $$->list->push_back($1); + } + | type_specifier { + $$ = new Node(NODE_TYPE_LIST); + $$->list->push_back($1); + } + | type_specifier declaration_specifiers { + $$ = $2; + $$->list->push_back($1); + } + | type_qualifier { + $$ = new Node(NODE_TYPE_LIST); + $$->list->push_back($1); + } + | type_qualifier declaration_specifiers { + $$ = $2; + $$->list->push_back($1); + } ; init_declarator_list - : init_declarator - | init_declarator_list COMMA init_declarator + : init_declarator { + $$ = new Node(NODE_TYPE_LIST); + $$->list->push_back($1); + } + | init_declarator_list COMMA init_declarator { + $$ = $1; + $$->list->push_back($3); + } ; init_declarator @@ -366,13 +391,16 @@ type_qualifier ; declarator - : pointer direct_declarator + : pointer direct_declarator { $$ = $2; } | direct_declarator ; direct_declarator - : IDENTIFIER - | LPAREN declarator RPAREN + : IDENTIFIER { + $$ = new Node(NODE_TYPE_DECLARATOR); + $$->declarator.name = $1->token.text; + } + | LPAREN declarator RPAREN { $$ = $2; } | direct_declarator LBRACKET constant_expression RBRACKET | direct_declarator LBRACKET RBRACKET | direct_declarator LPAREN parameter_type_list RPAREN