cpp

Coverage Report

Created: 2023-09-13 01:07

/home/andy/git/oilshell/oil/cpp/pgen2.h
Line
Count
Source (jump to first uncovered line)
1
// pgen2.h
2
3
#ifndef CPP_PGEN2_H
4
#define CPP_PGEN2_H
5
6
#include <vector>
7
8
#include "_gen/frontend/syntax.asdl.h"
9
#include "mycpp/runtime.h"
10
11
namespace grammar {
12
13
typedef Tuple2<int, int> arc_t;
14
typedef Dict<int, int> first_t;
15
typedef List<List<arc_t*>*> states_t;
16
typedef Tuple2<states_t*, first_t*> dfa_t;
17
18
class Grammar {
19
 public:
20
  Grammar();
21
22
  Dict<Str*, int>* symbol2number;
23
  Dict<int, Str*>* number2symbol;
24
  List<List<Tuple2<int, int>*>*>* states;
25
  Dict<int, Tuple2<List<List<Tuple2<int, int>*>*>*, Dict<int, int>*>*>* dfas;
26
  List<int>* labels;
27
  Dict<Str*, int>* keywords;
28
  Dict<int, int>* tokens;
29
  Dict<Str*, int>* symbol2label;
30
  int start;
31
32
0
  static constexpr ObjHeader obj_header() {
33
0
    return ObjHeader::ClassFixed(field_mask(), sizeof(Grammar));
34
0
  }
35
36
0
  static constexpr uint32_t field_mask() {
37
0
    return maskbit(offsetof(Grammar, symbol2number)) |
38
0
           maskbit(offsetof(Grammar, number2symbol)) |
39
0
           maskbit(offsetof(Grammar, states)) |
40
0
           maskbit(offsetof(Grammar, dfas)) |
41
0
           maskbit(offsetof(Grammar, labels)) |
42
0
           maskbit(offsetof(Grammar, keywords)) |
43
0
           maskbit(offsetof(Grammar, tokens)) |
44
0
           maskbit(offsetof(Grammar, symbol2label));
45
0
  }
46
47
  DISALLOW_COPY_AND_ASSIGN(Grammar)
48
};
49
50
}  // namespace grammar
51
52
namespace pnode {
53
54
class PNode {
55
 public:
56
  PNode(int typ, syntax_asdl::Token* tok, List<PNode*>*);
57
58
  void AddChild(PNode* node);
59
  PNode* GetChild(int i);
60
  int NumChildren();
61
62
  int typ;
63
  syntax_asdl::Token* tok;
64
  std::vector<PNode*> children;
65
};
66
67
class PNodeAllocator {
68
 public:
69
  PNodeAllocator();
70
71
  PNode* NewPNode(int typ, syntax_asdl::Token* tok);
72
  void Clear();
73
74
0
  static constexpr ObjHeader obj_header() {
75
0
    return ObjHeader::Class(HeapTag::Opaque, kZeroMask, sizeof(PNodeAllocator));
76
0
  }
77
78
 private:
79
  // We put this on the heap so we can call its destructor from `Clear()`...
80
  std::vector<PNode>* arena_;
81
};
82
83
}  // namespace pnode
84
85
#endif  // CPP_PGEN2_H