File: astnode.hpp

package info (click to toggle)
phabricator 0~git20190207-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 71,728 kB
  • sloc: php: 552,244; sql: 16,997; ansic: 3,619; yacc: 2,503; sh: 754; xml: 519; lex: 488; cpp: 221; python: 186; makefile: 177; sed: 66
file content (106 lines) | stat: -rw-r--r-- 2,121 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#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),
        lineno(0),
        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->expandRange(node);
      }

      Node *appendChildren(Node *node) {
        for (node_list_t::iterator ii = node->children.begin();
          ii != node->children.end();
          ++ii) {

          this->appendChild(*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 *expandRange(Node *n) {
        if (!n) {
          fprintf(
            stderr,
            "Trying to expandRange() 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 (n->r_tok != -1 && (n->r_tok > this->r_tok || (this->r_tok == -1))) {
          this->r_tok = n->r_tok;
        }

        return this;
      }

  };
}