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 <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
#include <string>
#include <vector>
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<Node *> * list;
struct
{
std::string * name;
} declarator;
};
};
enum
{
NODE_TYPE_TOKEN,
NODE_TYPE_LIST,
NODE_TYPE_DECLARATOR,
};
#endif

View File

@ -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