xref: /aosp_15_r20/external/openscreen/tools/cddl/parse.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2018 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard 
5*3f982cf4SFabien Sanglard #ifndef TOOLS_CDDL_PARSE_H_
6*3f982cf4SFabien Sanglard #define TOOLS_CDDL_PARSE_H_
7*3f982cf4SFabien Sanglard 
8*3f982cf4SFabien Sanglard #include <stddef.h>
9*3f982cf4SFabien Sanglard 
10*3f982cf4SFabien Sanglard #include <iostream>
11*3f982cf4SFabien Sanglard #include <memory>
12*3f982cf4SFabien Sanglard #include <string>
13*3f982cf4SFabien Sanglard #include <vector>
14*3f982cf4SFabien Sanglard 
15*3f982cf4SFabien Sanglard #include "absl/strings/string_view.h"
16*3f982cf4SFabien Sanglard #include "absl/types/optional.h"
17*3f982cf4SFabien Sanglard 
18*3f982cf4SFabien Sanglard struct AstNode {
19*3f982cf4SFabien Sanglard   // These types all correspond to types in the grammar, which can be found in
20*3f982cf4SFabien Sanglard   // grammar.abnf.
21*3f982cf4SFabien Sanglard   enum class Type {
22*3f982cf4SFabien Sanglard     kRule,
23*3f982cf4SFabien Sanglard     kTypename,
24*3f982cf4SFabien Sanglard     kGroupname,
25*3f982cf4SFabien Sanglard     kAssign,
26*3f982cf4SFabien Sanglard     kAssignT,
27*3f982cf4SFabien Sanglard     kAssignG,
28*3f982cf4SFabien Sanglard     kType,
29*3f982cf4SFabien Sanglard     kGrpent,
30*3f982cf4SFabien Sanglard     kType1,
31*3f982cf4SFabien Sanglard     kType2,
32*3f982cf4SFabien Sanglard     kValue,
33*3f982cf4SFabien Sanglard     kGroup,
34*3f982cf4SFabien Sanglard     kUint,
35*3f982cf4SFabien Sanglard     kDigit,
36*3f982cf4SFabien Sanglard     kRangeop,
37*3f982cf4SFabien Sanglard     kCtlop,
38*3f982cf4SFabien Sanglard     kGrpchoice,
39*3f982cf4SFabien Sanglard     kOccur,
40*3f982cf4SFabien Sanglard     kMemberKey,
41*3f982cf4SFabien Sanglard     kId,
42*3f982cf4SFabien Sanglard     kNumber,
43*3f982cf4SFabien Sanglard     kText,
44*3f982cf4SFabien Sanglard     kBytes,
45*3f982cf4SFabien Sanglard     kOther,
46*3f982cf4SFabien Sanglard   };
47*3f982cf4SFabien Sanglard 
48*3f982cf4SFabien Sanglard   // A node that (along with its' sublings) represents some sub-section of the
49*3f982cf4SFabien Sanglard   // text represented by this node.
50*3f982cf4SFabien Sanglard   AstNode* children;
51*3f982cf4SFabien Sanglard 
52*3f982cf4SFabien Sanglard   // Pointer to the next sibling of this node in the siblings linked list.
53*3f982cf4SFabien Sanglard   AstNode* sibling;
54*3f982cf4SFabien Sanglard 
55*3f982cf4SFabien Sanglard   // Type of node being represented.
56*3f982cf4SFabien Sanglard   Type type;
57*3f982cf4SFabien Sanglard 
58*3f982cf4SFabien Sanglard   // Text parsed from the CDDL spec to create this node.
59*3f982cf4SFabien Sanglard   std::string text;
60*3f982cf4SFabien Sanglard 
61*3f982cf4SFabien Sanglard   // Text parsed from another source but used when serializing this node.
62*3f982cf4SFabien Sanglard   std::string integer_member_key_text;
63*3f982cf4SFabien Sanglard 
64*3f982cf4SFabien Sanglard   // Text parsed from the CDDL spec for the type key.
65*3f982cf4SFabien Sanglard   absl::optional<std::string> type_key;
66*3f982cf4SFabien Sanglard };
67*3f982cf4SFabien Sanglard 
68*3f982cf4SFabien Sanglard // Override for << operator to simplify logging.
69*3f982cf4SFabien Sanglard // NOTE: If a new enum value is added without modifying this operator, it will
70*3f982cf4SFabien Sanglard // lead to a compilation failure because an enum class is used.
71*3f982cf4SFabien Sanglard inline std::ostream& operator<<(std::ostream& os, const AstNode::Type& which) {
72*3f982cf4SFabien Sanglard   switch (which) {
73*3f982cf4SFabien Sanglard     case AstNode::Type::kRule:
74*3f982cf4SFabien Sanglard       os << "kRule";
75*3f982cf4SFabien Sanglard       break;
76*3f982cf4SFabien Sanglard     case AstNode::Type::kTypename:
77*3f982cf4SFabien Sanglard       os << "kTypename";
78*3f982cf4SFabien Sanglard       break;
79*3f982cf4SFabien Sanglard     case AstNode::Type::kGroupname:
80*3f982cf4SFabien Sanglard       os << "kGroupname";
81*3f982cf4SFabien Sanglard       break;
82*3f982cf4SFabien Sanglard     case AstNode::Type::kAssign:
83*3f982cf4SFabien Sanglard       os << "kAssign";
84*3f982cf4SFabien Sanglard       break;
85*3f982cf4SFabien Sanglard     case AstNode::Type::kAssignT:
86*3f982cf4SFabien Sanglard       os << "kAssignT";
87*3f982cf4SFabien Sanglard       break;
88*3f982cf4SFabien Sanglard     case AstNode::Type::kAssignG:
89*3f982cf4SFabien Sanglard       os << "kAssignG";
90*3f982cf4SFabien Sanglard       break;
91*3f982cf4SFabien Sanglard     case AstNode::Type::kType:
92*3f982cf4SFabien Sanglard       os << "kType";
93*3f982cf4SFabien Sanglard       break;
94*3f982cf4SFabien Sanglard     case AstNode::Type::kGrpent:
95*3f982cf4SFabien Sanglard       os << "kGrpent";
96*3f982cf4SFabien Sanglard       break;
97*3f982cf4SFabien Sanglard     case AstNode::Type::kType1:
98*3f982cf4SFabien Sanglard       os << "kType1";
99*3f982cf4SFabien Sanglard       break;
100*3f982cf4SFabien Sanglard     case AstNode::Type::kType2:
101*3f982cf4SFabien Sanglard       os << "kType2";
102*3f982cf4SFabien Sanglard       break;
103*3f982cf4SFabien Sanglard     case AstNode::Type::kValue:
104*3f982cf4SFabien Sanglard       os << "kValue";
105*3f982cf4SFabien Sanglard       break;
106*3f982cf4SFabien Sanglard     case AstNode::Type::kGroup:
107*3f982cf4SFabien Sanglard       os << "kGroup";
108*3f982cf4SFabien Sanglard       break;
109*3f982cf4SFabien Sanglard     case AstNode::Type::kUint:
110*3f982cf4SFabien Sanglard       os << "kUint";
111*3f982cf4SFabien Sanglard       break;
112*3f982cf4SFabien Sanglard     case AstNode::Type::kDigit:
113*3f982cf4SFabien Sanglard       os << "kDigit";
114*3f982cf4SFabien Sanglard       break;
115*3f982cf4SFabien Sanglard     case AstNode::Type::kRangeop:
116*3f982cf4SFabien Sanglard       os << "kRangeop";
117*3f982cf4SFabien Sanglard       break;
118*3f982cf4SFabien Sanglard     case AstNode::Type::kCtlop:
119*3f982cf4SFabien Sanglard       os << "kCtlop";
120*3f982cf4SFabien Sanglard       break;
121*3f982cf4SFabien Sanglard     case AstNode::Type::kGrpchoice:
122*3f982cf4SFabien Sanglard       os << "kGrpchoice";
123*3f982cf4SFabien Sanglard       break;
124*3f982cf4SFabien Sanglard     case AstNode::Type::kOccur:
125*3f982cf4SFabien Sanglard       os << "kOccur";
126*3f982cf4SFabien Sanglard       break;
127*3f982cf4SFabien Sanglard     case AstNode::Type::kMemberKey:
128*3f982cf4SFabien Sanglard       os << "kMemberKey";
129*3f982cf4SFabien Sanglard       break;
130*3f982cf4SFabien Sanglard     case AstNode::Type::kId:
131*3f982cf4SFabien Sanglard       os << "kId";
132*3f982cf4SFabien Sanglard       break;
133*3f982cf4SFabien Sanglard     case AstNode::Type::kNumber:
134*3f982cf4SFabien Sanglard       os << "kNumber";
135*3f982cf4SFabien Sanglard       break;
136*3f982cf4SFabien Sanglard     case AstNode::Type::kText:
137*3f982cf4SFabien Sanglard       os << "kText";
138*3f982cf4SFabien Sanglard       break;
139*3f982cf4SFabien Sanglard     case AstNode::Type::kBytes:
140*3f982cf4SFabien Sanglard       os << "kBytes";
141*3f982cf4SFabien Sanglard       break;
142*3f982cf4SFabien Sanglard     case AstNode::Type::kOther:
143*3f982cf4SFabien Sanglard       os << "kOther";
144*3f982cf4SFabien Sanglard       break;
145*3f982cf4SFabien Sanglard   }
146*3f982cf4SFabien Sanglard   return os;
147*3f982cf4SFabien Sanglard }
148*3f982cf4SFabien Sanglard 
149*3f982cf4SFabien Sanglard struct ParseResult {
150*3f982cf4SFabien Sanglard   AstNode* root;
151*3f982cf4SFabien Sanglard   std::vector<std::unique_ptr<AstNode>> nodes;
152*3f982cf4SFabien Sanglard };
153*3f982cf4SFabien Sanglard 
154*3f982cf4SFabien Sanglard ParseResult ParseCddl(absl::string_view data);
155*3f982cf4SFabien Sanglard void DumpAst(AstNode* node, int indent_level = 0);
156*3f982cf4SFabien Sanglard 
157*3f982cf4SFabien Sanglard #endif  // TOOLS_CDDL_PARSE_H_
158