/* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. * Use of this file is governed by the BSD 3-clause license that * can be found in the LICENSE.txt file in the project root. */ #pragma once #include "support/BitSet.h" #include "atn/PredictionContext.h" namespace antlr4 { namespace atn { /// Specialized set that can track info about the set, with support for combining similar configurations using a /// graph-structured stack. class ANTLR4CPP_PUBLIC ATNConfigSet { public: /// Track the elements as they are added to the set; supports get(i) std::vector> configs; // TODO: these fields make me pretty uncomfortable but nice to pack up info together, saves recomputation // TODO: can we track conflicts as they are added to save scanning configs later? size_t uniqueAlt; /** Currently this is only used when we detect SLL conflict; this does * not necessarily represent the ambiguous alternatives. In fact, * I should also point out that this seems to include predicated alternatives * that have predicates that evaluate to false. Computed in computeTargetState(). */ antlrcpp::BitSet conflictingAlts; // Used in parser and lexer. In lexer, it indicates we hit a pred // while computing a closure operation. Don't make a DFA state from this. bool hasSemanticContext; bool dipsIntoOuterContext; /// Indicates that this configuration set is part of a full context /// LL prediction. It will be used to determine how to merge $. With SLL /// it's a wildcard whereas it is not for LL context merge. const bool fullCtx; ATNConfigSet(bool fullCtx = true); ATNConfigSet(const Ref &old); virtual ~ATNConfigSet(); virtual bool add(const Ref &config); /// /// Adding a new config means merging contexts with existing configs for /// {@code (s, i, pi, _)}, where {@code s} is the /// , {@code i} is the , and /// {@code pi} is the . We use /// {@code (s,i,pi)} as key. ///

/// This method updates and /// when necessary. ///

virtual bool add(const Ref &config, PredictionContextMergeCache *mergeCache); virtual std::vector getStates(); /** * Gets the complete set of represented alternatives for the configuration * set. * * @return the set of represented alternatives in this configuration set * * @since 4.3 */ antlrcpp::BitSet getAlts(); virtual std::vector> getPredicates(); virtual Ref get(size_t i) const; virtual void optimizeConfigs(ATNSimulator *interpreter); bool addAll(const Ref &other); bool operator == (const ATNConfigSet &other); virtual size_t hashCode(); virtual size_t size(); virtual bool isEmpty(); virtual void clear(); virtual bool isReadonly(); virtual void setReadonly(bool readonly); virtual std::string toString(); protected: /// Indicates that the set of configurations is read-only. Do not /// allow any code to manipulate the set; DFA states will point at /// the sets and they must not change. This does not protect the other /// fields; in particular, conflictingAlts is set after /// we've made this readonly. bool _readonly; virtual size_t getHash(ATNConfig *c); // Hash differs depending on set type. private: size_t _cachedHashCode; /// All configs but hashed by (s, i, _, pi) not including context. Wiped out /// when we go readonly as this set becomes a DFA state. std::unordered_map _configLookup; void InitializeInstanceFields(); }; } // namespace atn } // namespace antlr4