111 lines
3.9 KiB
C
111 lines
3.9 KiB
C
|
/* 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<Ref<ATNConfig>> 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<ATNConfigSet> &old);
|
||
|
|
||
|
virtual ~ATNConfigSet();
|
||
|
|
||
|
virtual bool add(const Ref<ATNConfig> &config);
|
||
|
|
||
|
/// <summary>
|
||
|
/// Adding a new config means merging contexts with existing configs for
|
||
|
/// {@code (s, i, pi, _)}, where {@code s} is the
|
||
|
/// <seealso cref="ATNConfig#state"/>, {@code i} is the <seealso cref="ATNConfig#alt"/>, and
|
||
|
/// {@code pi} is the <seealso cref="ATNConfig#semanticContext"/>. We use
|
||
|
/// {@code (s,i,pi)} as key.
|
||
|
/// <p/>
|
||
|
/// This method updates <seealso cref="#dipsIntoOuterContext"/> and
|
||
|
/// <seealso cref="#hasSemanticContext"/> when necessary.
|
||
|
/// </summary>
|
||
|
virtual bool add(const Ref<ATNConfig> &config, PredictionContextMergeCache *mergeCache);
|
||
|
|
||
|
virtual std::vector<ATNState *> 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<Ref<SemanticContext>> getPredicates();
|
||
|
|
||
|
virtual Ref<ATNConfig> get(size_t i) const;
|
||
|
|
||
|
virtual void optimizeConfigs(ATNSimulator *interpreter);
|
||
|
|
||
|
bool addAll(const Ref<ATNConfigSet> &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<size_t, ATNConfig *> _configLookup;
|
||
|
|
||
|
void InitializeInstanceFields();
|
||
|
};
|
||
|
|
||
|
} // namespace atn
|
||
|
} // namespace antlr4
|