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