//===--- Forest.h - Parse forest, the output of the GLR 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 // //===----------------------------------------------------------------------===// // // A parse forest represents a set of possible parse trees efficiently, it is // produced by the GLR parser. // // Despite the name, its data structure is a tree-like DAG with a single root. // Multiple ways to parse the same tokens are presented as an ambiguous node // with all possible interpretations as children. // Common sub-parses are shared: if two interpretations both parse "1 + 1" as // "expr := expr + expr", they will share a Sequence node representing the expr. // //===----------------------------------------------------------------------===// #ifndef CLANG_PSEUDO_FOREST_H #define CLANG_PSEUDO_FOREST_H #include "clang-pseudo/Token.h" #include "clang-pseudo/grammar/Grammar.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/Allocator.h" #include <cstdint> namespace clang { namespace pseudo { // A node represents ways to parse a sequence of tokens, it interprets a fixed // range of tokens as a fixed grammar symbol. // // There are different kinds of nodes, some nodes have "children" (stored in a // trailing array) and have pointers to them. "Children" has different semantics // depending on the node kinds. For an Ambiguous node, it means all // possible interpretations; for a Sequence node, it means each symbol on the // right hand side of the production rule. // // Since this is a node in a DAG, a node may have multiple parents. And a node // doesn't have parent pointers. class alignas(class ForestNode *) ForestNode { … }; // ForestNode may not be destroyed (for BumpPtrAllocator). static_assert …; // A memory arena for the parse forest. class ForestArena { … }; class ForestNode::RecursiveIterator : public llvm::iterator_facade_base<ForestNode::RecursiveIterator, std::input_iterator_tag, const ForestNode> { … }; } // namespace pseudo } // namespace clang #endif // CLANG_PSEUDO_FOREST_H