Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F61693664
astnode.hpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Wed, May 8, 09:18
Size
2 KB
Mime Type
text/x-c
Expires
Fri, May 10, 09:18 (2 d)
Engine
blob
Format
Raw Data
Handle
17545824
Attached To
rPHU libphutil
astnode.hpp
View Options
#pragma once
#include <cstdio>
#include <cstdlib>
#include <list>
#include <string>
namespace xhpast {
class Token;
typedef std::list<Token *> token_list_t;
class Token {
public:
unsigned int type;
std::string value;
unsigned int lineno;
unsigned int n;
Token(unsigned int type, char *value, unsigned int n) :
type(type),
value(value),
n(n) {
}
};
class Node;
typedef std::list<Node *> node_list_t;
class Node {
public:
unsigned int type;
int l_tok;
int r_tok;
node_list_t children;
Node() : type(0), l_tok(-1), r_tok(-1) {};
Node(unsigned int type) : type(type), l_tok(-1), r_tok(-1) {};
Node(unsigned int type, int end_tok) :
type(type) {
this->l_tok = end_tok;
this->r_tok = end_tok;
}
Node(unsigned int type, int l_tok, int r_tok) :
type(type),
l_tok(l_tok),
r_tok(r_tok) {
}
Node *appendChild(Node *node) {
this->children.push_back(node);
return this->setEnd(node);
}
Node *appendChildren(Node *node) {
for (node_list_t::iterator ii = node->children.begin(); ii != node->children.end(); ++ii) {
this->children.push_back(*ii);
this->setEnd(*ii);
}
return this;
}
Node *firstChild() {
if (this->children.empty()) {
return NULL;
}
return *(this->children.begin());
}
Node *setType(unsigned int t) {
this->type = t;
return this;
}
Node *setEnd(Node *n) {
if (!n) {
fprintf(stderr, "Trying to setEnd() a null node to one of type %d\n", this->type);
exit(1);
}
if (n->r_tok != -1 && (n->r_tok > this->r_tok || (this->r_tok == -1))) {
this->r_tok = n->r_tok;
}
if (this->l_tok == -1) {
this->l_tok = n->l_tok;
}
return this;
}
Node *setBegin(Node *n) {
if (!n) {
fprintf(stderr, "Trying to setBegin() a null node to one of type %d\n", this->type);
exit(1);
}
if (n->l_tok != -1 && (n->l_tok < this->l_tok || (this->l_tok == -1))) {
this->l_tok = n->l_tok;
}
if (this->r_tok == -1) {
this->r_tok = n->r_tok;
}
return this;
}
};
}
Event Timeline
Log In to Comment