228 lines
9.5 KiB
C
228 lines
9.5 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 "atn/ContextSensitivityInfo.h"
|
||
|
#include "atn/AmbiguityInfo.h"
|
||
|
#include "atn/PredicateEvalInfo.h"
|
||
|
#include "atn/ErrorInfo.h"
|
||
|
|
||
|
namespace antlr4 {
|
||
|
namespace atn {
|
||
|
|
||
|
class LookaheadEventInfo;
|
||
|
|
||
|
/// <summary>
|
||
|
/// This class contains profiling gathered for a particular decision.
|
||
|
///
|
||
|
/// <para>
|
||
|
/// Parsing performance in ANTLR 4 is heavily influenced by both static factors
|
||
|
/// (e.g. the form of the rules in the grammar) and dynamic factors (e.g. the
|
||
|
/// choice of input and the state of the DFA cache at the time profiling
|
||
|
/// operations are started). For best results, gather and use aggregate
|
||
|
/// statistics from a large sample of inputs representing the inputs expected in
|
||
|
/// production before using the results to make changes in the grammar.</para>
|
||
|
///
|
||
|
/// @since 4.3
|
||
|
/// </summary>
|
||
|
class ANTLR4CPP_PUBLIC DecisionInfo {
|
||
|
public:
|
||
|
/// <summary>
|
||
|
/// The decision number, which is an index into <seealso cref="ATN#decisionToState"/>.
|
||
|
/// </summary>
|
||
|
const size_t decision;
|
||
|
|
||
|
/// <summary>
|
||
|
/// The total number of times <seealso cref="ParserATNSimulator#adaptivePredict"/> was
|
||
|
/// invoked for this decision.
|
||
|
/// </summary>
|
||
|
long long invocations = 0;
|
||
|
|
||
|
/// <summary>
|
||
|
/// The total time spent in <seealso cref="ParserATNSimulator#adaptivePredict"/> for
|
||
|
/// this decision, in nanoseconds.
|
||
|
///
|
||
|
/// <para>
|
||
|
/// The value of this field contains the sum of differential results obtained
|
||
|
/// by <seealso cref="System#nanoTime()"/>, and is not adjusted to compensate for JIT
|
||
|
/// and/or garbage collection overhead. For best accuracy, use a modern JVM
|
||
|
/// implementation that provides precise results from
|
||
|
/// <seealso cref="System#nanoTime()"/>, and perform profiling in a separate process
|
||
|
/// which is warmed up by parsing the input prior to profiling. If desired,
|
||
|
/// call <seealso cref="ATNSimulator#clearDFA"/> to reset the DFA cache to its initial
|
||
|
/// state before starting the profiling measurement pass.</para>
|
||
|
/// </summary>
|
||
|
long long timeInPrediction = 0;
|
||
|
|
||
|
/// <summary>
|
||
|
/// The sum of the lookahead required for SLL prediction for this decision.
|
||
|
/// Note that SLL prediction is used before LL prediction for performance
|
||
|
/// reasons even when <seealso cref="PredictionMode#LL"/> or
|
||
|
/// <seealso cref="PredictionMode#LL_EXACT_AMBIG_DETECTION"/> is used.
|
||
|
/// </summary>
|
||
|
long long SLL_TotalLook = 0;
|
||
|
|
||
|
/// <summary>
|
||
|
/// Gets the minimum lookahead required for any single SLL prediction to
|
||
|
/// complete for this decision, by reaching a unique prediction, reaching an
|
||
|
/// SLL conflict state, or encountering a syntax error.
|
||
|
/// </summary>
|
||
|
long long SLL_MinLook = 0;
|
||
|
|
||
|
/// <summary>
|
||
|
/// Gets the maximum lookahead required for any single SLL prediction to
|
||
|
/// complete for this decision, by reaching a unique prediction, reaching an
|
||
|
/// SLL conflict state, or encountering a syntax error.
|
||
|
/// </summary>
|
||
|
long long SLL_MaxLook = 0;
|
||
|
|
||
|
/// Gets the <seealso cref="LookaheadEventInfo"/> associated with the event where the
|
||
|
/// <seealso cref="#SLL_MaxLook"/> value was set.
|
||
|
Ref<LookaheadEventInfo> SLL_MaxLookEvent;
|
||
|
|
||
|
/// <summary>
|
||
|
/// The sum of the lookahead required for LL prediction for this decision.
|
||
|
/// Note that LL prediction is only used when SLL prediction reaches a
|
||
|
/// conflict state.
|
||
|
/// </summary>
|
||
|
long long LL_TotalLook = 0;
|
||
|
|
||
|
/// <summary>
|
||
|
/// Gets the minimum lookahead required for any single LL prediction to
|
||
|
/// complete for this decision. An LL prediction completes when the algorithm
|
||
|
/// reaches a unique prediction, a conflict state (for
|
||
|
/// <seealso cref="PredictionMode#LL"/>, an ambiguity state (for
|
||
|
/// <seealso cref="PredictionMode#LL_EXACT_AMBIG_DETECTION"/>, or a syntax error.
|
||
|
/// </summary>
|
||
|
long long LL_MinLook = 0;
|
||
|
|
||
|
/// <summary>
|
||
|
/// Gets the maximum lookahead required for any single LL prediction to
|
||
|
/// complete for this decision. An LL prediction completes when the algorithm
|
||
|
/// reaches a unique prediction, a conflict state (for
|
||
|
/// <seealso cref="PredictionMode#LL"/>, an ambiguity state (for
|
||
|
/// <seealso cref="PredictionMode#LL_EXACT_AMBIG_DETECTION"/>, or a syntax error.
|
||
|
/// </summary>
|
||
|
long long LL_MaxLook = 0;
|
||
|
|
||
|
/// <summary>
|
||
|
/// Gets the <seealso cref="LookaheadEventInfo"/> associated with the event where the
|
||
|
/// <seealso cref="#LL_MaxLook"/> value was set.
|
||
|
/// </summary>
|
||
|
Ref<LookaheadEventInfo> LL_MaxLookEvent;
|
||
|
|
||
|
/// <summary>
|
||
|
/// A collection of <seealso cref="ContextSensitivityInfo"/> instances describing the
|
||
|
/// context sensitivities encountered during LL prediction for this decision.
|
||
|
/// </summary>
|
||
|
/// <seealso cref= ContextSensitivityInfo </seealso>
|
||
|
std::vector<ContextSensitivityInfo> contextSensitivities;
|
||
|
|
||
|
/// <summary>
|
||
|
/// A collection of <seealso cref="ErrorInfo"/> instances describing the parse errors
|
||
|
/// identified during calls to <seealso cref="ParserATNSimulator#adaptivePredict"/> for
|
||
|
/// this decision.
|
||
|
/// </summary>
|
||
|
/// <seealso cref= ErrorInfo </seealso>
|
||
|
std::vector<ErrorInfo> errors;
|
||
|
|
||
|
/// <summary>
|
||
|
/// A collection of <seealso cref="AmbiguityInfo"/> instances describing the
|
||
|
/// ambiguities encountered during LL prediction for this decision.
|
||
|
/// </summary>
|
||
|
/// <seealso cref= AmbiguityInfo </seealso>
|
||
|
std::vector<AmbiguityInfo> ambiguities;
|
||
|
|
||
|
/// <summary>
|
||
|
/// A collection of <seealso cref="PredicateEvalInfo"/> instances describing the
|
||
|
/// results of evaluating individual predicates during prediction for this
|
||
|
/// decision.
|
||
|
/// </summary>
|
||
|
/// <seealso cref= PredicateEvalInfo </seealso>
|
||
|
std::vector<PredicateEvalInfo> predicateEvals;
|
||
|
|
||
|
/// <summary>
|
||
|
/// The total number of ATN transitions required during SLL prediction for
|
||
|
/// this decision. An ATN transition is determined by the number of times the
|
||
|
/// DFA does not contain an edge that is required for prediction, resulting
|
||
|
/// in on-the-fly computation of that edge.
|
||
|
///
|
||
|
/// <para>
|
||
|
/// If DFA caching of SLL transitions is employed by the implementation, ATN
|
||
|
/// computation may cache the computed edge for efficient lookup during
|
||
|
/// future parsing of this decision. Otherwise, the SLL parsing algorithm
|
||
|
/// will use ATN transitions exclusively.</para>
|
||
|
/// </summary>
|
||
|
/// <seealso cref= #SLL_ATNTransitions </seealso>
|
||
|
/// <seealso cref= ParserATNSimulator#computeTargetState </seealso>
|
||
|
/// <seealso cref= LexerATNSimulator#computeTargetState </seealso>
|
||
|
long long SLL_ATNTransitions = 0;
|
||
|
|
||
|
/// <summary>
|
||
|
/// The total number of DFA transitions required during SLL prediction for
|
||
|
/// this decision.
|
||
|
///
|
||
|
/// <para>If the ATN simulator implementation does not use DFA caching for SLL
|
||
|
/// transitions, this value will be 0.</para>
|
||
|
/// </summary>
|
||
|
/// <seealso cref= ParserATNSimulator#getExistingTargetState </seealso>
|
||
|
/// <seealso cref= LexerATNSimulator#getExistingTargetState </seealso>
|
||
|
long long SLL_DFATransitions = 0;
|
||
|
|
||
|
/// <summary>
|
||
|
/// Gets the total number of times SLL prediction completed in a conflict
|
||
|
/// state, resulting in fallback to LL prediction.
|
||
|
///
|
||
|
/// <para>Note that this value is not related to whether or not
|
||
|
/// <seealso cref="PredictionMode#SLL"/> may be used successfully with a particular
|
||
|
/// grammar. If the ambiguity resolution algorithm applied to the SLL
|
||
|
/// conflicts for this decision produce the same result as LL prediction for
|
||
|
/// this decision, <seealso cref="PredictionMode#SLL"/> would produce the same overall
|
||
|
/// parsing result as <seealso cref="PredictionMode#LL"/>.</para>
|
||
|
/// </summary>
|
||
|
long long LL_Fallback = 0;
|
||
|
|
||
|
/// <summary>
|
||
|
/// The total number of ATN transitions required during LL prediction for
|
||
|
/// this decision. An ATN transition is determined by the number of times the
|
||
|
/// DFA does not contain an edge that is required for prediction, resulting
|
||
|
/// in on-the-fly computation of that edge.
|
||
|
///
|
||
|
/// <para>
|
||
|
/// If DFA caching of LL transitions is employed by the implementation, ATN
|
||
|
/// computation may cache the computed edge for efficient lookup during
|
||
|
/// future parsing of this decision. Otherwise, the LL parsing algorithm will
|
||
|
/// use ATN transitions exclusively.</para>
|
||
|
/// </summary>
|
||
|
/// <seealso cref= #LL_DFATransitions </seealso>
|
||
|
/// <seealso cref= ParserATNSimulator#computeTargetState </seealso>
|
||
|
/// <seealso cref= LexerATNSimulator#computeTargetState </seealso>
|
||
|
long long LL_ATNTransitions = 0;
|
||
|
|
||
|
/// <summary>
|
||
|
/// The total number of DFA transitions required during LL prediction for
|
||
|
/// this decision.
|
||
|
///
|
||
|
/// <para>If the ATN simulator implementation does not use DFA caching for LL
|
||
|
/// transitions, this value will be 0.</para>
|
||
|
/// </summary>
|
||
|
/// <seealso cref= ParserATNSimulator#getExistingTargetState </seealso>
|
||
|
/// <seealso cref= LexerATNSimulator#getExistingTargetState </seealso>
|
||
|
long long LL_DFATransitions = 0;
|
||
|
|
||
|
/// <summary>
|
||
|
/// Constructs a new instance of the <seealso cref="DecisionInfo"/> class to contain
|
||
|
/// statistics for a particular decision.
|
||
|
/// </summary>
|
||
|
/// <param name="decision"> The decision number </param>
|
||
|
DecisionInfo(size_t decision);
|
||
|
|
||
|
std::string toString() const;
|
||
|
};
|
||
|
|
||
|
} // namespace atn
|
||
|
} // namespace antlr4
|