class Antlr4::Runtime::PredictionMode

Constants

LL
LL_EXACT_AMBIG_DETECTION
SLL

Public Class Methods

all_configs_in_rule_stop_states?(configs) click to toggle source
# File lib/antlr4/runtime/prediction_mode.rb, line 72
def self.all_configs_in_rule_stop_states?(configs)
  i = 0
  while i < configs.configs.length
    return false unless configs.configs[i].state.is_a? RuleStopState
    i += 1
  end

  true
end
all_subsets_conflict?(altsets) click to toggle source
# File lib/antlr4/runtime/prediction_mode.rb, line 86
def self.all_subsets_conflict?(altsets)
  !has_non_conflicting_alt_set?(altsets)
end
conflicting_alt_subsets(configs) click to toggle source
# File lib/antlr4/runtime/prediction_mode.rb, line 154
def self.conflicting_alt_subsets(configs)
  config_to_alts = AltAndContextMap.new
  i = 0
  while i < configs.configs.length
    c = configs.configs[i]
    alts = config_to_alts.get(c)
    if alts.nil?
      alts = BitSet.new
      config_to_alts.put(c, alts)
    end
    alts.set(c.alt)
    i += 1
  end
  config_to_alts.values
end
get_alts1(altsets) click to toggle source
# File lib/antlr4/runtime/prediction_mode.rb, line 132
def self.get_alts1(altsets)
  all = BitSet.new
  i = 0
  while i < altsets.length
    alts = altsets[i]
    all.or(alts)
    i += 1
  end
  all
end
has_config_in_rule_stop_state?(configs) click to toggle source
# File lib/antlr4/runtime/prediction_mode.rb, line 62
def self.has_config_in_rule_stop_state?(configs)
  i = 0
  while i < configs.configs.length
    return true if configs.configs[i].state.is_a? RuleStopState
    i += 1
  end

  false
end
has_conflicting_alt_set?(altsets) click to toggle source
# File lib/antlr4/runtime/prediction_mode.rb, line 100
def self.has_conflicting_alt_set?(altsets)
  i = 0
  while i < altsets.length
    alts = altsets[i]
    return true if alts.cardinality > 1
    i += 1
  end
  false
end
has_non_conflicting_alt_set?(altsets) click to toggle source
# File lib/antlr4/runtime/prediction_mode.rb, line 90
def self.has_non_conflicting_alt_set?(altsets)
  i = 0
  while i < altsets.length
    alts = altsets[i]
    return true if alts.cardinality == 1
    i += 1
  end
  false
end
has_sll_conflict_terminating_prediction(mode, configs) click to toggle source
# File lib/antlr4/runtime/prediction_mode.rb, line 29
def self.has_sll_conflict_terminating_prediction(mode, configs)
  return true if all_configs_in_rule_stop_states?(configs)

  # pure SLL mode parsing
  if mode == PredictionMode::SLL
    # Don't bother with combining configs from different semantic
    # contexts if we can fail over to full LL costs more time
    # since we'll often fail over anyway.
    if configs.has_semantic_context
      # dup configs, tossing out semantic predicates
      dup = ATNConfigSet.new
      i = 0
      while i < configs.configs.length
        cfg = configs.configs[i]
        c = ATNConfig.new
        c.atn_config5(cfg, SemanticContext::NONE)
        dup.add(c)

        i += 1
      end

      configs = dup
    end
    # now we have combined contexts for configs with dissimilar preds
  end

  # pure SLL or combined SLL+LL mode parsing

  alt_sets = conflicting_alt_subsets(configs)
  heuristic = has_conflicting_alt_set?(alt_sets) && !has_state_associated_with_one_alt?(configs)
  heuristic
end
has_state_associated_with_one_alt?(configs) click to toggle source
# File lib/antlr4/runtime/prediction_mode.rb, line 186
def self.has_state_associated_with_one_alt?(configs)
  x = state_to_alt_map(configs)
  i = 0
  while i < x.values.length
    alts = x.values[i]
    return true if alts.cardinality == 1
    i += 1
  end
  false
end
resolves_to_just_one_viable_alt?(altsets) click to toggle source
# File lib/antlr4/runtime/prediction_mode.rb, line 82
def self.resolves_to_just_one_viable_alt?(altsets)
  single_viable_alt(altsets)
end
single_viable_alt(altsets) click to toggle source
# File lib/antlr4/runtime/prediction_mode.rb, line 197
def self.single_viable_alt(altsets)
  viable_alts = BitSet.new
  i = 0
  while i < altsets.length
    alts = altsets[i]
    min_alt = alts.next_set_bit(0)
    viable_alts.set(min_alt)
    return ATN::INVALID_ALT_NUMBER if viable_alts.cardinality > 1 # more than 1 viable alt
    i += 1
  end
  viable_alts.next_set_bit(0)
end
state_to_alt_map(configs) click to toggle source
# File lib/antlr4/runtime/prediction_mode.rb, line 170
def self.state_to_alt_map(configs)
  m = {}
  i = 0
  while i < configs.configs.length
    c = configs.configs[i]
    alts = m[c.state]
    if alts.nil?
      alts = BitSet.new
      m[c.state] = alts
    end
    alts.set(c.alt)
    i += 1
  end
  m
end
unique_alt(altsets) click to toggle source
# File lib/antlr4/runtime/prediction_mode.rb, line 125
def self.unique_alt(altsets)
  all = get_alts1(altsets)
  return all.next_set_bit(0) if all.cardinality == 1

  ATN::INVALID_ALT_NUMBER
end

Public Instance Methods

all_subsets_equal?(altsets) click to toggle source
# File lib/antlr4/runtime/prediction_mode.rb, line 110
def all_subsets_equal?(altsets)
  first = nil
  i = 0
  while i < altsets.length
    alt = altsets[i]
    if i == 0
      first = altsets[0]
    else
      return false unless alt.eql?(first)
    end
    i += 1
  end
  true
end
get_alts2(configs) click to toggle source
# File lib/antlr4/runtime/prediction_mode.rb, line 143
def get_alts2(configs)
  alts = BitSet.new
  i = 0
  while i < configs.length
    config = configs[i]
    alts.set(config.alt)
    i += 1
  end
  alts
end