//===-- Automaton.h - Support for driving TableGen-produced DFAs ----------===// // // 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 file implements class that drive and introspect deterministic finite- // state automata (DFAs) as generated by TableGen's -gen-automata backend. // // For a description of how to define an automaton, see // include/llvm/TableGen/Automaton.td. // // One important detail is that these deterministic automata are created from // (potentially) nondeterministic definitions. Therefore a unique sequence of // input symbols will produce one path through the DFA but multiple paths // through the original NFA. An automaton by default only returns "accepted" or // "not accepted", but frequently we want to analyze what NFA path was taken. // Finding a path through the NFA states that results in a DFA state can help // answer *what* the solution to a problem was, not just that there exists a // solution. // //===----------------------------------------------------------------------===// #ifndef LLVM_SUPPORT_AUTOMATON_H #define LLVM_SUPPORT_AUTOMATON_H #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Support/Allocator.h" #include <deque> #include <map> #include <memory> namespace llvm { NfaPath; /// Forward define the pair type used by the automata transition info tables. /// /// Experimental results with large tables have shown a significant (multiple /// orders of magnitude) parsing speedup by using a custom struct here with a /// trivial constructor rather than std::pair<uint64_t, uint64_t>. struct NfaStatePair { … }; namespace internal { /// The internal class that maintains all possible paths through an NFA based /// on a path through the DFA. class NfaTranscriber { … }; } // namespace internal /// A deterministic finite-state automaton. The automaton is defined in /// TableGen; this object drives an automaton defined by tblgen-emitted tables. /// /// An automaton accepts a sequence of input tokens ("actions"). This class is /// templated on the type of these actions. template <typename ActionT> class Automaton { … }; } // namespace llvm #endif // LLVM_SUPPORT_AUTOMATON_H