Changeset View
Changeset View
Standalone View
Standalone View
support/xhpast/astnode.hpp
| #pragma once | #pragma once | ||||
| #include <cstdio> | #include <cstdio> | ||||
| #include <cstdlib> | #include <cstdlib> | ||||
| #include <list> | #include <list> | ||||
| #include <string> | #include <string> | ||||
| namespace xhpast { | namespace xhpast { | ||||
| class Token; | class Token; | ||||
| typedef std::list<Token *> token_list_t; | typedef std::list<Token *> token_list_t; | ||||
| class Token { | class Token { | ||||
| public: | public: | ||||
| unsigned int type; | unsigned int type; | ||||
| std::string value; | std::string value; | ||||
| unsigned int lineno; | unsigned int lineno; | ||||
| unsigned int n; | unsigned int n; | ||||
| Token(unsigned int type, char *value, unsigned int n) : | Token(unsigned int type, char * value, unsigned int n) : | ||||
| type(type), | type(type), | ||||
| value(value), | value(value), | ||||
| lineno(0), | lineno(0), | ||||
| n(n) { | n(n) {} | ||||
| } | |||||
| }; | }; | ||||
| class Node; | class Node; | ||||
| typedef std::list<Node *> node_list_t; | typedef std::list<Node *> node_list_t; | ||||
| class Node { | class Node { | ||||
| public: | public: | ||||
| unsigned int type; | unsigned int type; | ||||
| int l_tok; | int l_tok; | ||||
| int r_tok; | int r_tok; | ||||
| node_list_t children; | node_list_t children; | ||||
| Node() : | |||||
| type(0), | |||||
| l_tok(-1), | |||||
| r_tok(-1) {} | |||||
| Node() : type(0), l_tok(-1), r_tok(-1) {}; | explicit Node(unsigned int type) : | ||||
| type(type), | |||||
| Node(unsigned int type) : type(type), l_tok(-1), r_tok(-1) {}; | l_tok(-1), | ||||
| r_tok(-1) {} | |||||
| Node(unsigned int type, int end_tok) : | Node(unsigned int type, int end_tok) : | ||||
| type(type) { | type(type), | ||||
| this->l_tok = end_tok; | l_tok(end_tok), | ||||
| this->r_tok = end_tok; | r_tok(end_tok) {} | ||||
| } | |||||
| Node(unsigned int type, int l_tok, int r_tok) : | Node(unsigned int type, int l_tok, int r_tok) : | ||||
| type(type), | type(type), | ||||
| l_tok(l_tok), | l_tok(l_tok), | ||||
| r_tok(r_tok) { | r_tok(r_tok) {} | ||||
| } | |||||
| Node *appendChild(Node *node) { | Node * appendChild(Node * node) { | ||||
| this->children.push_back(node); | this->children.push_back(node); | ||||
| return this->expandRange(node); | return this->expandRange(node); | ||||
| } | } | ||||
| Node *appendChildren(Node *node) { | Node * appendChildren(Node * node) { | ||||
| for (node_list_t::iterator ii = node->children.begin(); | for (node_list_t::iterator ii = node->children.begin(); | ||||
| ii != node->children.end(); | ii != node->children.end(); | ||||
| ++ii) { | ++ii) { | ||||
| this->appendChild(*ii); | this->appendChild(*ii); | ||||
| } | } | ||||
| return this; | return this; | ||||
| } | } | ||||
| Node *firstChild() { | Node * firstChild() { | ||||
| if (this->children.empty()) { | if (this->children.empty()) { | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| return *(this->children.begin()); | return *(this->children.begin()); | ||||
| } | } | ||||
| Node *setType(unsigned int t) { | Node * setType(unsigned int t) { | ||||
| this->type = t; | this->type = t; | ||||
| return this; | return this; | ||||
| } | } | ||||
| Node *expandRange(Node *n) { | Node * expandRange(Node * n) { | ||||
| if (!n) { | if (!n) { | ||||
| fprintf( | fprintf( | ||||
| stderr, | stderr, | ||||
| "Trying to expandRange() a null node to one of type %d\n", | "Trying to expandRange() a null node to one of type %d\n", | ||||
| this->type); | this->type); | ||||
| exit(1); | exit(1); | ||||
| }; | } | ||||
| if (n->l_tok != -1 && (n->l_tok < this->l_tok || (this->l_tok == -1))) { | if (n->l_tok != -1 && (n->l_tok < this->l_tok || (this->l_tok == -1))) { | ||||
| this->l_tok = n->l_tok; | this->l_tok = n->l_tok; | ||||
| } | } | ||||
| if (n->r_tok != -1 && (n->r_tok > this->r_tok || (this->r_tok == -1))) { | if (n->r_tok != -1 && (n->r_tok > this->r_tok || (this->r_tok == -1))) { | ||||
| this->r_tok = n->r_tok; | this->r_tok = n->r_tok; | ||||
| } | } | ||||
| return this; | return this; | ||||
| } | } | ||||
| }; | }; | ||||
| } | } | ||||