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