add list, declarator node types
This commit is contained in:
parent
86c6243053
commit
0a2e719f2c
11
src/Node.cc
11
src/Node.cc
@ -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;
|
||||
}
|
||||
}
|
||||
|
13
src/Node.h
13
src/Node.h
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user