OILS / cpp / pgen2.cc View on Github | oilshell.org

44 lines, 21 significant
1// pgen2.cc
2
3#include "pgen2.h"
4
5#include <vector>
6
7namespace pnode {
8
9PNode::PNode(int typ, syntax_asdl::Token* tok, List<PNode*>*)
10 : typ(typ), tok(tok), children() {
11}
12
13void PNode::AddChild(PNode* node) {
14 children.push_back(node);
15}
16
17PNode* PNode::GetChild(int i) {
18 int j = i;
19 if (j < 0) {
20 j += NumChildren();
21 }
22 return children[j];
23}
24
25int PNode::NumChildren() {
26 return children.size();
27}
28
29// TODO: It would be nicer to reuse the std::deque arena_ throughout the whole
30// program. Rather than new/delete for parsing each YSH expression.
31PNodeAllocator::PNodeAllocator() : arena_(new std::deque<PNode>()) {
32}
33
34PNode* PNodeAllocator::NewPNode(int typ, syntax_asdl::Token* tok) {
35 arena_->emplace_back(typ, tok, nullptr);
36 return &(arena_->back());
37}
38
39void PNodeAllocator::Clear() {
40 delete arena_;
41 arena_ = nullptr;
42}
43
44} // namespace pnode