add list, declarator node types

This commit is contained in:
Josh Holtrop 2018-05-08 22:10:06 -04:00
parent 86c6243053
commit 0a2e719f2c
3 changed files with 60 additions and 16 deletions

View File

@ -1,2 +1,13 @@
#include "Node.h" #include "Node.h"
#include <stdlib.h> #include <stdlib.h>
Node::Node(int _type)
{
type = _type;
switch (type)
{
case NODE_TYPE_LIST:
list = new std::vector<Node *>();
break;
}
}

View File

@ -2,14 +2,12 @@
#define NODE_H #define NODE_H
#include <string> #include <string>
#include <vector>
class Node class Node
{ {
public: public:
Node(int _type) Node(int _type);
{
type = _type;
}
int type; int type;
union union
@ -20,12 +18,19 @@ public:
size_t line; size_t line;
std::string * text; std::string * text;
} token; } token;
std::vector<Node *> * list;
struct
{
std::string * name;
} declarator;
}; };
}; };
enum enum
{ {
NODE_TYPE_TOKEN, NODE_TYPE_TOKEN,
NODE_TYPE_LIST,
NODE_TYPE_DECLARATOR,
}; };
#endif #endif

View File

@ -261,21 +261,46 @@ constant_expression
declaration declaration
: declaration_specifiers SEMICOLON : declaration_specifiers SEMICOLON
| declaration_specifiers init_declarator_list SEMICOLON | declaration_specifiers init_declarator_list SEMICOLON {
}
; ;
declaration_specifiers declaration_specifiers
: storage_class_specifier : storage_class_specifier {
| storage_class_specifier declaration_specifiers $$ = new Node(NODE_TYPE_LIST);
| type_specifier $$->list->push_back($1);
| type_specifier declaration_specifiers }
| type_qualifier | storage_class_specifier declaration_specifiers {
| type_qualifier 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_list
: init_declarator : init_declarator {
| init_declarator_list COMMA init_declarator $$ = new Node(NODE_TYPE_LIST);
$$->list->push_back($1);
}
| init_declarator_list COMMA init_declarator {
$$ = $1;
$$->list->push_back($3);
}
; ;
init_declarator init_declarator
@ -366,13 +391,16 @@ type_qualifier
; ;
declarator declarator
: pointer direct_declarator : pointer direct_declarator { $$ = $2; }
| direct_declarator | direct_declarator
; ;
direct_declarator direct_declarator
: IDENTIFIER : IDENTIFIER {
| LPAREN declarator RPAREN $$ = new Node(NODE_TYPE_DECLARATOR);
$$->declarator.name = $1->token.text;
}
| LPAREN declarator RPAREN { $$ = $2; }
| direct_declarator LBRACKET constant_expression RBRACKET | direct_declarator LBRACKET constant_expression RBRACKET
| direct_declarator LBRACKET RBRACKET | direct_declarator LBRACKET RBRACKET
| direct_declarator LPAREN parameter_type_list RPAREN | direct_declarator LPAREN parameter_type_list RPAREN