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