158 lines
3.5 KiB
C++
158 lines
3.5 KiB
C++
// Copyright 2018 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef TOOLS_CDDL_PARSE_H_
|
|
#define TOOLS_CDDL_PARSE_H_
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <iostream>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "absl/strings/string_view.h"
|
|
#include "absl/types/optional.h"
|
|
|
|
struct AstNode {
|
|
// These types all correspond to types in the grammar, which can be found in
|
|
// grammar.abnf.
|
|
enum class Type {
|
|
kRule,
|
|
kTypename,
|
|
kGroupname,
|
|
kAssign,
|
|
kAssignT,
|
|
kAssignG,
|
|
kType,
|
|
kGrpent,
|
|
kType1,
|
|
kType2,
|
|
kValue,
|
|
kGroup,
|
|
kUint,
|
|
kDigit,
|
|
kRangeop,
|
|
kCtlop,
|
|
kGrpchoice,
|
|
kOccur,
|
|
kMemberKey,
|
|
kId,
|
|
kNumber,
|
|
kText,
|
|
kBytes,
|
|
kOther,
|
|
};
|
|
|
|
// A node that (along with its' sublings) represents some sub-section of the
|
|
// text represented by this node.
|
|
AstNode* children;
|
|
|
|
// Pointer to the next sibling of this node in the siblings linked list.
|
|
AstNode* sibling;
|
|
|
|
// Type of node being represented.
|
|
Type type;
|
|
|
|
// Text parsed from the CDDL spec to create this node.
|
|
std::string text;
|
|
|
|
// Text parsed from another source but used when serializing this node.
|
|
std::string integer_member_key_text;
|
|
|
|
// Text parsed from the CDDL spec for the type key.
|
|
absl::optional<std::string> type_key;
|
|
};
|
|
|
|
// Override for << operator to simplify logging.
|
|
// NOTE: If a new enum value is added without modifying this operator, it will
|
|
// lead to a compilation failure because an enum class is used.
|
|
inline std::ostream& operator<<(std::ostream& os, const AstNode::Type& which) {
|
|
switch (which) {
|
|
case AstNode::Type::kRule:
|
|
os << "kRule";
|
|
break;
|
|
case AstNode::Type::kTypename:
|
|
os << "kTypename";
|
|
break;
|
|
case AstNode::Type::kGroupname:
|
|
os << "kGroupname";
|
|
break;
|
|
case AstNode::Type::kAssign:
|
|
os << "kAssign";
|
|
break;
|
|
case AstNode::Type::kAssignT:
|
|
os << "kAssignT";
|
|
break;
|
|
case AstNode::Type::kAssignG:
|
|
os << "kAssignG";
|
|
break;
|
|
case AstNode::Type::kType:
|
|
os << "kType";
|
|
break;
|
|
case AstNode::Type::kGrpent:
|
|
os << "kGrpent";
|
|
break;
|
|
case AstNode::Type::kType1:
|
|
os << "kType1";
|
|
break;
|
|
case AstNode::Type::kType2:
|
|
os << "kType2";
|
|
break;
|
|
case AstNode::Type::kValue:
|
|
os << "kValue";
|
|
break;
|
|
case AstNode::Type::kGroup:
|
|
os << "kGroup";
|
|
break;
|
|
case AstNode::Type::kUint:
|
|
os << "kUint";
|
|
break;
|
|
case AstNode::Type::kDigit:
|
|
os << "kDigit";
|
|
break;
|
|
case AstNode::Type::kRangeop:
|
|
os << "kRangeop";
|
|
break;
|
|
case AstNode::Type::kCtlop:
|
|
os << "kCtlop";
|
|
break;
|
|
case AstNode::Type::kGrpchoice:
|
|
os << "kGrpchoice";
|
|
break;
|
|
case AstNode::Type::kOccur:
|
|
os << "kOccur";
|
|
break;
|
|
case AstNode::Type::kMemberKey:
|
|
os << "kMemberKey";
|
|
break;
|
|
case AstNode::Type::kId:
|
|
os << "kId";
|
|
break;
|
|
case AstNode::Type::kNumber:
|
|
os << "kNumber";
|
|
break;
|
|
case AstNode::Type::kText:
|
|
os << "kText";
|
|
break;
|
|
case AstNode::Type::kBytes:
|
|
os << "kBytes";
|
|
break;
|
|
case AstNode::Type::kOther:
|
|
os << "kOther";
|
|
break;
|
|
}
|
|
return os;
|
|
}
|
|
|
|
struct ParseResult {
|
|
AstNode* root;
|
|
std::vector<std::unique_ptr<AstNode>> nodes;
|
|
};
|
|
|
|
ParseResult ParseCddl(absl::string_view data);
|
|
void DumpAst(AstNode* node, int indent_level = 0);
|
|
|
|
#endif // TOOLS_CDDL_PARSE_H_
|