//===- YAMLParser.h - Simple YAML parser ------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This is a YAML 1.2 parser. // // See http://www.yaml.org/spec/1.2/spec.html for the full standard. // // This currently does not implement the following: // * Tag resolution. // * UTF-16. // * BOMs anywhere other than the first Unicode scalar value in the file. // // The most important class here is Stream. This represents a YAML stream with // 0, 1, or many documents. // // SourceMgr sm; // StringRef input = getInput(); // yaml::Stream stream(input, sm); // // for (yaml::document_iterator di = stream.begin(), de = stream.end(); // di != de; ++di) { // yaml::Node *n = di->getRoot(); // if (n) { // // Do something with n... // } else // break; // } // //===----------------------------------------------------------------------===// #ifndef LLVM_SUPPORT_YAMLPARSER_H #define LLVM_SUPPORT_YAMLPARSER_H #include "llvm/ADT/StringRef.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/SMLoc.h" #include "llvm/Support/SourceMgr.h" #include <cassert> #include <cstddef> #include <iterator> #include <map> #include <memory> #include <optional> #include <string> #include <system_error> namespace llvm { class MemoryBufferRef; class raw_ostream; class Twine; namespace yaml { class Document; class document_iterator; class Node; class Scanner; struct Token; /// Dump all the tokens in this stream to OS. /// \returns true if there was an error, false otherwise. bool dumpTokens(StringRef Input, raw_ostream &); /// Scans all tokens in input without outputting anything. This is used /// for benchmarking the tokenizer. /// \returns true if there was an error, false otherwise. bool scanTokens(StringRef Input); /// Escape \a Input for a double quoted scalar; if \p EscapePrintable /// is true, all UTF8 sequences will be escaped, if \p EscapePrintable is /// false, those UTF8 sequences encoding printable unicode scalars will not be /// escaped, but emitted verbatim. std::string escape(StringRef Input, bool EscapePrintable = true); /// Parse \p S as a bool according to https://yaml.org/type/bool.html. std::optional<bool> parseBool(StringRef S); /// This class represents a YAML stream potentially containing multiple /// documents. class Stream { … }; /// Abstract base class for all Nodes. class Node { … }; /// A null value. /// /// Example: /// !!null null class NullNode final : public Node { … }; /// A scalar node is an opaque datum that can be presented as a /// series of zero or more Unicode scalar values. /// /// Example: /// Adena class ScalarNode final : public Node { … }; /// A block scalar node is an opaque datum that can be presented as a /// series of zero or more Unicode scalar values. /// /// Example: /// | /// Hello /// World class BlockScalarNode final : public Node { … }; /// A key and value pair. While not technically a Node under the YAML /// representation graph, it is easier to treat them this way. /// /// TODO: Consider making this not a child of Node. /// /// Example: /// Section: .text class KeyValueNode final : public Node { … }; /// This is an iterator abstraction over YAML collections shared by both /// sequences and maps. /// /// BaseT must have a ValueT* member named CurrentEntry and a member function /// increment() which must set CurrentEntry to 0 to create an end iterator. template <class BaseT, class ValueT> class basic_collection_iterator { … }; // The following two templates are used for both MappingNode and Sequence Node. template <class CollectionType> typename CollectionType::iterator begin(CollectionType &C) { … } template <class CollectionType> void skip(CollectionType &C) { … } /// Represents a YAML map created from either a block map for a flow map. /// /// This parses the YAML stream as increment() is called. /// /// Example: /// Name: _main /// Scope: Global class MappingNode final : public Node { … }; /// Represents a YAML sequence created from either a block sequence for a /// flow sequence. /// /// This parses the YAML stream as increment() is called. /// /// Example: /// - Hello /// - World class SequenceNode final : public Node { … }; /// Represents an alias to a Node with an anchor. /// /// Example: /// *AnchorName class AliasNode final : public Node { … }; /// A YAML Stream is a sequence of Documents. A document contains a root /// node. class Document { … }; /// Iterator abstraction for Documents over a Stream. class document_iterator { … }; } // end namespace yaml } // end namespace llvm #endif // LLVM_SUPPORT_YAMLPARSER_H