antlr4-runtime 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +35 -0
- data/LICENSE.txt +21 -0
- data/README.md +65 -0
- data/Rakefile +6 -0
- data/antlr4-runtime.gemspec +30 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/ext/rumourhash/Makefile +264 -0
- data/ext/rumourhash/extconf.rb +3 -0
- data/ext/rumourhash/rumourhash.c +59 -0
- data/lib/antlr4/runtime.rb +37 -0
- data/lib/antlr4/runtime/abstract_parse_tree_visitor.rb +43 -0
- data/lib/antlr4/runtime/abstract_predicate_transition.rb +11 -0
- data/lib/antlr4/runtime/action_transition.rb +29 -0
- data/lib/antlr4/runtime/ambiguity_info.rb +10 -0
- data/lib/antlr4/runtime/antlr_error_listener.rb +15 -0
- data/lib/antlr4/runtime/antlr_error_strategy.rb +24 -0
- data/lib/antlr4/runtime/antlr_file_stream.rb +17 -0
- data/lib/antlr4/runtime/antlr_input_stream.rb +6 -0
- data/lib/antlr4/runtime/array_2d_hash_set.rb +471 -0
- data/lib/antlr4/runtime/array_prediction_context.rb +76 -0
- data/lib/antlr4/runtime/atn.rb +100 -0
- data/lib/antlr4/runtime/atn_config.rb +140 -0
- data/lib/antlr4/runtime/atn_config_set.rb +150 -0
- data/lib/antlr4/runtime/atn_deserialization_options.rb +48 -0
- data/lib/antlr4/runtime/atn_deserializer.rb +737 -0
- data/lib/antlr4/runtime/atn_simulator.rb +69 -0
- data/lib/antlr4/runtime/atn_state.rb +118 -0
- data/lib/antlr4/runtime/atn_type.rb +8 -0
- data/lib/antlr4/runtime/atom_transition.rb +27 -0
- data/lib/antlr4/runtime/bail_error_strategy.rb +31 -0
- data/lib/antlr4/runtime/base_error_listener.rb +18 -0
- data/lib/antlr4/runtime/basic_block_start_state.rb +12 -0
- data/lib/antlr4/runtime/basic_state.rb +11 -0
- data/lib/antlr4/runtime/bit_set.rb +54 -0
- data/lib/antlr4/runtime/block_end_state.rb +15 -0
- data/lib/antlr4/runtime/block_start_state.rb +12 -0
- data/lib/antlr4/runtime/buffered_token_stream.rb +335 -0
- data/lib/antlr4/runtime/char_stream.rb +6 -0
- data/lib/antlr4/runtime/char_streams.rb +12 -0
- data/lib/antlr4/runtime/chunk.rb +4 -0
- data/lib/antlr4/runtime/code_point_char_stream.rb +83 -0
- data/lib/antlr4/runtime/common_token.rb +125 -0
- data/lib/antlr4/runtime/common_token_factory.rb +30 -0
- data/lib/antlr4/runtime/common_token_stream.rb +63 -0
- data/lib/antlr4/runtime/console_error_listener.rb +12 -0
- data/lib/antlr4/runtime/context_sensitivity_info.rb +7 -0
- data/lib/antlr4/runtime/decision_event_info.rb +19 -0
- data/lib/antlr4/runtime/decision_info.rb +36 -0
- data/lib/antlr4/runtime/decision_state.rb +15 -0
- data/lib/antlr4/runtime/default_error_strategy.rb +314 -0
- data/lib/antlr4/runtime/dfa.rb +97 -0
- data/lib/antlr4/runtime/dfa_serializer.rb +62 -0
- data/lib/antlr4/runtime/dfa_state.rb +109 -0
- data/lib/antlr4/runtime/diagnostic_error_listener.rb +58 -0
- data/lib/antlr4/runtime/double_key_map.rb +49 -0
- data/lib/antlr4/runtime/empty_prediction_context.rb +35 -0
- data/lib/antlr4/runtime/epsilon_transition.rb +27 -0
- data/lib/antlr4/runtime/equality_comparator.rb +4 -0
- data/lib/antlr4/runtime/error_info.rb +7 -0
- data/lib/antlr4/runtime/error_node.rb +5 -0
- data/lib/antlr4/runtime/error_node_impl.rb +12 -0
- data/lib/antlr4/runtime/failed_predicate_exception.rb +33 -0
- data/lib/antlr4/runtime/flexible_hash_map.rb +232 -0
- data/lib/antlr4/runtime/input_mismatch_exception.rb +20 -0
- data/lib/antlr4/runtime/int_stream.rb +31 -0
- data/lib/antlr4/runtime/integer.rb +14 -0
- data/lib/antlr4/runtime/interval.rb +111 -0
- data/lib/antlr4/runtime/interval_set.rb +540 -0
- data/lib/antlr4/runtime/lexer.rb +257 -0
- data/lib/antlr4/runtime/lexer_action.rb +12 -0
- data/lib/antlr4/runtime/lexer_action_executor.rb +75 -0
- data/lib/antlr4/runtime/lexer_action_type.rb +12 -0
- data/lib/antlr4/runtime/lexer_atn_config.rb +50 -0
- data/lib/antlr4/runtime/lexer_atn_simulator.rb +522 -0
- data/lib/antlr4/runtime/lexer_channel_action.rb +51 -0
- data/lib/antlr4/runtime/lexer_custom_action.rb +49 -0
- data/lib/antlr4/runtime/lexer_dfa_serializer.rb +12 -0
- data/lib/antlr4/runtime/lexer_indexed_custom_action.rb +49 -0
- data/lib/antlr4/runtime/lexer_mode_action.rb +51 -0
- data/lib/antlr4/runtime/lexer_more_action.rb +41 -0
- data/lib/antlr4/runtime/lexer_no_viable_alt_exception.rb +4 -0
- data/lib/antlr4/runtime/lexer_pop_mode_action.rb +41 -0
- data/lib/antlr4/runtime/lexer_push_mode_action.rb +51 -0
- data/lib/antlr4/runtime/lexer_skip_action.rb +43 -0
- data/lib/antlr4/runtime/lexer_type_action.rb +51 -0
- data/lib/antlr4/runtime/ll1_analyzer.rb +133 -0
- data/lib/antlr4/runtime/lookahead_event_info.rb +10 -0
- data/lib/antlr4/runtime/loop_end_state.rb +15 -0
- data/lib/antlr4/runtime/murmur_hash.rb +99 -0
- data/lib/antlr4/runtime/no_viable_alt_exception.rb +7 -0
- data/lib/antlr4/runtime/not_set_transition.rb +20 -0
- data/lib/antlr4/runtime/object_equality_comparator.rb +18 -0
- data/lib/antlr4/runtime/ordered_atn_config_set.rb +15 -0
- data/lib/antlr4/runtime/parse_cancellation_exception.rb +5 -0
- data/lib/antlr4/runtime/parse_tree.rb +7 -0
- data/lib/antlr4/runtime/parse_tree_listener.rb +4 -0
- data/lib/antlr4/runtime/parse_tree_visitor.rb +4 -0
- data/lib/antlr4/runtime/parser.rb +522 -0
- data/lib/antlr4/runtime/parser_atn_simulator.rb +1171 -0
- data/lib/antlr4/runtime/parser_rule_context.rb +186 -0
- data/lib/antlr4/runtime/plus_block_start_state.rb +11 -0
- data/lib/antlr4/runtime/plus_loopback_state.rb +12 -0
- data/lib/antlr4/runtime/precedence_predicate_transition.rb +31 -0
- data/lib/antlr4/runtime/predicate.rb +6 -0
- data/lib/antlr4/runtime/predicate_eval_info.rb +16 -0
- data/lib/antlr4/runtime/predicate_transition.rb +35 -0
- data/lib/antlr4/runtime/prediction_context.rb +103 -0
- data/lib/antlr4/runtime/prediction_context_cache.rb +28 -0
- data/lib/antlr4/runtime/prediction_context_utils.rb +407 -0
- data/lib/antlr4/runtime/prediction_mode.rb +213 -0
- data/lib/antlr4/runtime/profiling_atn_simulator.rb +149 -0
- data/lib/antlr4/runtime/proxy_error_listener.rb +33 -0
- data/lib/antlr4/runtime/range_transition.rb +29 -0
- data/lib/antlr4/runtime/recognition_exception.rb +17 -0
- data/lib/antlr4/runtime/recognizer.rb +136 -0
- data/lib/antlr4/runtime/rule_context.rb +131 -0
- data/lib/antlr4/runtime/rule_context_with_alt_num.rb +11 -0
- data/lib/antlr4/runtime/rule_node.rb +8 -0
- data/lib/antlr4/runtime/rule_start_state.rb +17 -0
- data/lib/antlr4/runtime/rule_stop_state.rb +12 -0
- data/lib/antlr4/runtime/rule_tag_token.rb +64 -0
- data/lib/antlr4/runtime/rule_transition.rb +29 -0
- data/lib/antlr4/runtime/semantic_context.rb +313 -0
- data/lib/antlr4/runtime/set_transition.rb +29 -0
- data/lib/antlr4/runtime/singleton_prediction_context.rb +56 -0
- data/lib/antlr4/runtime/star_block_start_state.rb +12 -0
- data/lib/antlr4/runtime/star_loop_entry_state.rb +17 -0
- data/lib/antlr4/runtime/star_loopback_state.rb +16 -0
- data/lib/antlr4/runtime/syntax_tree.rb +6 -0
- data/lib/antlr4/runtime/tag_chunk.rb +22 -0
- data/lib/antlr4/runtime/terminal_node.rb +5 -0
- data/lib/antlr4/runtime/terminal_node_impl.rb +50 -0
- data/lib/antlr4/runtime/text_chunk.rb +16 -0
- data/lib/antlr4/runtime/token.rb +13 -0
- data/lib/antlr4/runtime/token_stream.rb +13 -0
- data/lib/antlr4/runtime/token_tag_token.rb +22 -0
- data/lib/antlr4/runtime/tokens_start_state.rb +14 -0
- data/lib/antlr4/runtime/transition.rb +51 -0
- data/lib/antlr4/runtime/tree.rb +4 -0
- data/lib/antlr4/runtime/trees.rb +195 -0
- data/lib/antlr4/runtime/triple.rb +40 -0
- data/lib/antlr4/runtime/utils.rb +117 -0
- data/lib/antlr4/runtime/uuid.rb +46 -0
- data/lib/antlr4/runtime/version.rb +5 -0
- data/lib/antlr4/runtime/vocabulary.rb +12 -0
- data/lib/antlr4/runtime/vocabulary_impl.rb +82 -0
- data/lib/antlr4/runtime/wildcard_transition.rb +20 -0
- data/lib/antlr4/runtime/writable_token.rb +7 -0
- metadata +243 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require 'antlr4/runtime/dfa_state'
|
|
2
|
+
|
|
3
|
+
module Antlr4::Runtime
|
|
4
|
+
|
|
5
|
+
class ATNSimulator
|
|
6
|
+
SERIALIZED_VERSION = ATNDeserializer.SERIALIZED_VERSION
|
|
7
|
+
|
|
8
|
+
SERIALIZED_UUID = ATNDeserializer.SERIALIZED_Uuid
|
|
9
|
+
|
|
10
|
+
attr_accessor :atn
|
|
11
|
+
|
|
12
|
+
class << self
|
|
13
|
+
attr_accessor :error
|
|
14
|
+
@@error = DFAState.new
|
|
15
|
+
@@error.initialize_configs(ATNConfigSet.new)
|
|
16
|
+
@@error.state_number = Integer::MAX
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def initialize(atn, shared_context_cache)
|
|
20
|
+
@atn = atn
|
|
21
|
+
@shared_context_cache = shared_context_cache
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def clear_dfa
|
|
25
|
+
raise UnsupportedOperationException, 'This ATN simulator does not support clearing the DFA.'
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
attr_reader :shared_context_cache
|
|
29
|
+
|
|
30
|
+
def cached_context(context)
|
|
31
|
+
return context if @shared_context_cache.nil?
|
|
32
|
+
|
|
33
|
+
visited = {}
|
|
34
|
+
PredictionContextUtils.cached_context(context, @shared_context_cache, visited)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.deserialize(data)
|
|
38
|
+
ATNDeserializer.new.deserialize(data)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def self.check_condition(condition, message = nil)
|
|
42
|
+
ATNDeserializer.new.check_condition(condition, message)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def self.to_int(c)
|
|
46
|
+
ATNDeserializer.to_int(c)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def self.to_int32(data, offset)
|
|
50
|
+
ATNDeserializer.to_int32(data, offset)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def self.to_long(data, offset)
|
|
54
|
+
ATNDeserializer.to_long(data, offset)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def self.to_uuid(data, offset)
|
|
58
|
+
ATNDeserializer.to_uuid(data, offset)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def edge_factory(atn, type, src, trg, arg1, arg2, arg3, sets)
|
|
62
|
+
ATNDeserializer.new.edge_factory(atn, type, src, trg, arg1, arg2, arg3, sets)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def state_factory(type, rule_index)
|
|
66
|
+
ATNDeserializer.new.state_factory(type, rule_index)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
module Antlr4::Runtime
|
|
2
|
+
|
|
3
|
+
class ATNState
|
|
4
|
+
INITIAL_NUM_TRANSITIONS = 4
|
|
5
|
+
INVALID_TYPE = 0
|
|
6
|
+
BASIC = 1
|
|
7
|
+
RULE_START = 2
|
|
8
|
+
BLOCK_START = 3
|
|
9
|
+
PLUS_BLOCK_START = 4
|
|
10
|
+
STAR_BLOCK_START = 5
|
|
11
|
+
TOKEN_START = 6
|
|
12
|
+
RULE_STOP = 7
|
|
13
|
+
BLOCK_END = 8
|
|
14
|
+
STAR_LOOP_BACK = 9
|
|
15
|
+
STAR_LOOP_ENTRY = 10
|
|
16
|
+
PLUS_LOOP_BACK = 11
|
|
17
|
+
LOOP_END = 12
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class << self
|
|
21
|
+
attr_accessor :invalid_state_number
|
|
22
|
+
@@serialization_names = %w[INVALID BASIC RULE_START BLOCK_START PLUS_BLOCK_START STAR_BLOCK_START TOKEN_START RULE_STOP BLOCK_END STAR_LOOP_BACK STAR_LOOP_ENTRY PLUS_LOOP_BACK LOOP_END]
|
|
23
|
+
|
|
24
|
+
@@invalid_state_number = -1
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
attr_accessor :next_token_within_rule
|
|
28
|
+
attr_accessor :atn
|
|
29
|
+
attr_accessor :state_number
|
|
30
|
+
attr_accessor :rule_index
|
|
31
|
+
|
|
32
|
+
def initialize
|
|
33
|
+
@atn = nil
|
|
34
|
+
@state_number = @@invalid_state_number
|
|
35
|
+
@rule_index = 0
|
|
36
|
+
@epsilon_only_transitions = false
|
|
37
|
+
@transitions = []
|
|
38
|
+
@next_token_within_rule = nil
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def hash
|
|
42
|
+
@state_number
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def eql?(other_key)
|
|
46
|
+
@state_number == other_key.state_number
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def non_greedy_exit_state?
|
|
50
|
+
false
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def to_s
|
|
54
|
+
@state_number.to_s
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
attr_reader :transitions
|
|
58
|
+
|
|
59
|
+
def number_of_transitions
|
|
60
|
+
@transitions.length
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def add_transition(e)
|
|
64
|
+
add_transition_at(@transitions.length, e)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def add_transition_at(index, e)
|
|
68
|
+
if @transitions.empty?
|
|
69
|
+
|
|
70
|
+
@epsilon_only_transitions = e.epsilon?
|
|
71
|
+
|
|
72
|
+
elsif @epsilon_only_transitions != e.epsilon?
|
|
73
|
+
|
|
74
|
+
STDERR.puts format("ATN state %d has both epsilon and non-epsilon transitions.\n", state_number)
|
|
75
|
+
@epsilon_only_transitions = false
|
|
76
|
+
end
|
|
77
|
+
already_present = false
|
|
78
|
+
|
|
79
|
+
i = 0
|
|
80
|
+
while i < @transitions.length
|
|
81
|
+
t = @transitions[i]
|
|
82
|
+
if t.target.state_number == e.target.state_number
|
|
83
|
+
|
|
84
|
+
if !t.label.nil? && !e.label.nil? && t.label.eql?(e.label)
|
|
85
|
+
already_present = true
|
|
86
|
+
break
|
|
87
|
+
elsif t.epsilon? && e.epsilon?
|
|
88
|
+
already_present = true
|
|
89
|
+
break
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
i += 1
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
@transitions[index] = e unless already_present
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def transition(i)
|
|
99
|
+
@transitions[i]
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def set_transition(i, e)
|
|
103
|
+
@transitions[i] = e
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def remove_transition(index)
|
|
107
|
+
@transitions.delete_at index
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def only_has_epsilon_transitions
|
|
111
|
+
@epsilon_only_transitions
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def set_rule_index(rule_index)
|
|
115
|
+
@rule_index = rule_index
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Antlr4::Runtime
|
|
2
|
+
|
|
3
|
+
class AtomTransition < Transition
|
|
4
|
+
attr_reader :the_label
|
|
5
|
+
|
|
6
|
+
def initialize(target, label)
|
|
7
|
+
super(target)
|
|
8
|
+
@the_label = label
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def serialization_type
|
|
12
|
+
ATOM
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def label
|
|
16
|
+
IntervalSet.of(@the_label)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def matches(symbol, _min_vocab_symbol, _max_vocab_symbol)
|
|
20
|
+
@the_label == symbol
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def to_s
|
|
24
|
+
'' + @the_label
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'antlr4/runtime/parse_cancellation_exception'
|
|
2
|
+
|
|
3
|
+
module Antlr4::Runtime
|
|
4
|
+
|
|
5
|
+
class BailErrorStrategy < DefaultErrorStrategy
|
|
6
|
+
def recover(recognizer, e)
|
|
7
|
+
context = recognizer.getContext
|
|
8
|
+
until context.nil?
|
|
9
|
+
context = context.get_parent
|
|
10
|
+
context.exception = e
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
raise ParseCancellationException(e)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def recover_in_line(recognizer)
|
|
17
|
+
e = InputMismatchException.new recognizer
|
|
18
|
+
context = recognizer.getContext
|
|
19
|
+
until context.nil?
|
|
20
|
+
context = context.get_parent
|
|
21
|
+
context.exception = e
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
raise ParseCancellationException(e)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def sync(recognizer)
|
|
28
|
+
;
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'antlr4/runtime/antlr_error_listener'
|
|
2
|
+
|
|
3
|
+
module Antlr4::Runtime
|
|
4
|
+
|
|
5
|
+
class BaseErrorListener < ANTLRErrorListener
|
|
6
|
+
def syntax_error(_recognizer, _offending_symbol, _line, _char_position_in_line, _msg, _e)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def report_ambiguity(_recognizer, _dfa, _start_index, _stop_index, _exact, _ambig_ilts, _configs)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def report_attempting_full_context(_recognizer, _dfa, _start_index, _stop_index, _conflicting_alts, _configs)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def report_context_sensitivity(_recognizer, _dfa, _start_index, _stop_index, _prediction, _configs)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'rumourhash/rumourhash'
|
|
2
|
+
|
|
3
|
+
include RumourHash
|
|
4
|
+
|
|
5
|
+
module Antlr4::Runtime
|
|
6
|
+
|
|
7
|
+
class BitSet
|
|
8
|
+
MAX_BITS = 128
|
|
9
|
+
|
|
10
|
+
attr_reader :bits
|
|
11
|
+
|
|
12
|
+
def initialize
|
|
13
|
+
@bits = 0
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def set(x)
|
|
17
|
+
@bits |= (1 << x)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def get(x)
|
|
21
|
+
(@bits & (1 << x)) > 0 ? true : false
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def cardinality
|
|
25
|
+
bit_count(@bits)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def or(bit_set)
|
|
29
|
+
@bits |= bit_set.bits
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def next_set_bit(bit)
|
|
33
|
+
result = bit
|
|
34
|
+
i = 0
|
|
35
|
+
mask = (1 << bit)
|
|
36
|
+
while i < MAX_BITS
|
|
37
|
+
if (@bits & mask) > 0
|
|
38
|
+
return result
|
|
39
|
+
end
|
|
40
|
+
result += 1
|
|
41
|
+
mask <<= 1
|
|
42
|
+
i += 1
|
|
43
|
+
end
|
|
44
|
+
-1
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def to_s
|
|
48
|
+
buf = '['
|
|
49
|
+
buf << @bits.to_s(2)
|
|
50
|
+
buf << ']'
|
|
51
|
+
buf
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
require 'antlr4/runtime/writable_token'
|
|
2
|
+
require 'antlr4/runtime/token_stream'
|
|
3
|
+
|
|
4
|
+
module Antlr4::Runtime
|
|
5
|
+
|
|
6
|
+
class BufferedTokenStream < TokenStream
|
|
7
|
+
def initialize(token_source)
|
|
8
|
+
raise NilPointerException, 'token_source cannot be nil' if token_source.nil?
|
|
9
|
+
|
|
10
|
+
@token_source = token_source
|
|
11
|
+
@tokens = []
|
|
12
|
+
@ptr = -1
|
|
13
|
+
@fetched_eof = false
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
attr_reader :token_source
|
|
17
|
+
|
|
18
|
+
def index
|
|
19
|
+
@ptr
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def mark
|
|
23
|
+
0
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def release(marker)
|
|
27
|
+
;
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def reset
|
|
31
|
+
seek(0)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def seek(index)
|
|
35
|
+
lazy_init
|
|
36
|
+
@ptr = adjust_seek_index(index)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def size
|
|
40
|
+
@tokens.length
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def consume
|
|
44
|
+
skip_eof_check = false
|
|
45
|
+
if @ptr >= 0
|
|
46
|
+
if @fetched_eof
|
|
47
|
+
# the last token in tokens is EOF. skip check if p indexes any
|
|
48
|
+
# fetched token except the last.
|
|
49
|
+
skip_eof_check = @ptr < @tokens.length - 1
|
|
50
|
+
else # no EOF token in tokens. skip check if p indexes a fetched token.
|
|
51
|
+
skip_eof_check = @ptr < @tokens.length
|
|
52
|
+
end
|
|
53
|
+
else # not yet initialized
|
|
54
|
+
skip_eof_check = false
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
if !skip_eof_check && la(1) == EOF
|
|
58
|
+
raise IllegalStateException, 'cannot consume EOF'
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
@ptr = adjust_seek_index(@ptr + 1) if sync(@ptr + 1)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def sync(i)
|
|
65
|
+
n = i - @tokens.length + 1 # how many more elements we need?
|
|
66
|
+
|
|
67
|
+
if n > 0
|
|
68
|
+
fetched = fetch(n)
|
|
69
|
+
return fetched >= n
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
true
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def fetch(n)
|
|
76
|
+
return 0 if @fetched_eof
|
|
77
|
+
|
|
78
|
+
i = 0
|
|
79
|
+
while i < n
|
|
80
|
+
t = @token_source.next_token
|
|
81
|
+
t.setTokenIndex(@tokens.length) if t.is_a? WritableToken
|
|
82
|
+
@tokens << t
|
|
83
|
+
if t.type == Token::EOF
|
|
84
|
+
@fetched_eof = true
|
|
85
|
+
return i + 1
|
|
86
|
+
end
|
|
87
|
+
i += 1
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
n
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def get(i)
|
|
94
|
+
if i < 0 || i >= @tokens.length
|
|
95
|
+
raise IndexOutOfBoundsException, 'token index ' + i + ' out of range 0..' + (@tokens.length - 1)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
@tokens[i]
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def get_list(start, stop)
|
|
102
|
+
return nil if start < 0 || stop < 0
|
|
103
|
+
|
|
104
|
+
lazy_init
|
|
105
|
+
subset = []
|
|
106
|
+
stop = @tokens.length - 1 if stop >= @tokens.length
|
|
107
|
+
i = start
|
|
108
|
+
while i <= stop
|
|
109
|
+
t = @tokens[i]
|
|
110
|
+
break if t.type == Token::EOF
|
|
111
|
+
|
|
112
|
+
subset.add(t)
|
|
113
|
+
i += 1
|
|
114
|
+
end
|
|
115
|
+
subset
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def la(i)
|
|
119
|
+
lt(i).type
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def lb(k)
|
|
123
|
+
return nil if (@ptr - k) < 0
|
|
124
|
+
|
|
125
|
+
@tokens[@ptr - k]
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def lt(k)
|
|
129
|
+
lazy_init
|
|
130
|
+
return nil if k == 0
|
|
131
|
+
|
|
132
|
+
return lb(-k) if k < 0
|
|
133
|
+
|
|
134
|
+
i = @ptr + k - 1
|
|
135
|
+
sync(i)
|
|
136
|
+
if i >= @tokens.length # return EOF token
|
|
137
|
+
# EOF must be last token
|
|
138
|
+
return @tokens.get(@tokens.length - 1)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# if ( i>range ) range = i
|
|
142
|
+
@tokens[i]
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def adjust_seek_index(i)
|
|
146
|
+
i
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def lazy_init
|
|
150
|
+
setup if @ptr == -1
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def setup
|
|
154
|
+
sync(0)
|
|
155
|
+
@ptr = adjust_seek_index(0)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def token_source(tokenSource)
|
|
159
|
+
@token_source = tokenSource
|
|
160
|
+
@tokens.clear
|
|
161
|
+
@ptr = -1
|
|
162
|
+
@fetched_eof = false
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
attr_reader :tokens
|
|
166
|
+
|
|
167
|
+
def tokens1(start, stop, types = nil)
|
|
168
|
+
lazy_init
|
|
169
|
+
if start < 0 || stop >= @tokens.length || stop < 0 || start >= @tokens.length
|
|
170
|
+
|
|
171
|
+
raise IndexOutOfBoundsException, 'start ' + start + ' or stop ' + stop + ' not in 0..' + (@tokens.length - 1)
|
|
172
|
+
end
|
|
173
|
+
return nil if start > stop
|
|
174
|
+
|
|
175
|
+
# list = tokens[start:stop]:T t, t.getType() in typesend
|
|
176
|
+
filtered_tokens = []
|
|
177
|
+
i = start
|
|
178
|
+
while i <= stop
|
|
179
|
+
t = @tokens[i]
|
|
180
|
+
filtered_tokens.add(t) if types.nil? || types.include?(t.type)
|
|
181
|
+
i += 1
|
|
182
|
+
end
|
|
183
|
+
filtered_tokens = nil if filtered_tokens.empty?
|
|
184
|
+
filtered_tokens
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def get_tokens2(start, stop, ttype)
|
|
188
|
+
s = Set.new
|
|
189
|
+
s.add(ttype)
|
|
190
|
+
tokens1(start, stop, s)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def next_token_on_channel(i, channel)
|
|
194
|
+
sync(i)
|
|
195
|
+
return size - 1 if i >= size
|
|
196
|
+
|
|
197
|
+
token = @tokens[i]
|
|
198
|
+
while token.channel != channel
|
|
199
|
+
return i if token.type == Token::EOF
|
|
200
|
+
|
|
201
|
+
i += 1
|
|
202
|
+
sync(i)
|
|
203
|
+
token = @tokens[i]
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
i
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def previous_token_on_channel(i, channel)
|
|
210
|
+
sync(i)
|
|
211
|
+
if i >= size
|
|
212
|
+
# the EOF token is on every channel
|
|
213
|
+
return size - 1
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
while i >= 0
|
|
217
|
+
token = @tokens[i]
|
|
218
|
+
return i if token.type == Token::EOF || token.channel == channel
|
|
219
|
+
|
|
220
|
+
i -= 1
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
i
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def hidden_tokens_to_right(token_index, channel)
|
|
227
|
+
lazy_init
|
|
228
|
+
if token_index < 0 || token_index >= tokens.size
|
|
229
|
+
raise IndexOutOfBoundsException, token_index + ' not in 0..' + (@tokens.length - 1)
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
next_on_channel = next_token_on_channel(token_index + 1, Lexer.DEFAULT_TOKEN_CHANNEL)
|
|
233
|
+
from = token_index + 1
|
|
234
|
+
# if none onchannel to right, next_on_channel=-1 so set to = last token
|
|
235
|
+
to = next_on_channel == -1 ? size - 1 : next_on_channel
|
|
236
|
+
|
|
237
|
+
filter_for_channel(from, to, channel)
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
def hidden_tokens_to_right2(token_index)
|
|
241
|
+
hidden_tokens_to_right(token_index, -1)
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def hidden_tokens_to_left(token_index, channel)
|
|
245
|
+
lazy_init
|
|
246
|
+
if token_index < 0 || token_index >= tokens.size
|
|
247
|
+
raise IndexOutOfBoundsException, token_index + ' not in 0..' + (@tokens.length - 1)
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
if token_index == 0
|
|
251
|
+
# obviously no tokens can appear before the first token
|
|
252
|
+
return nil
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
prev_on_channel = previous_token_on_channel(token_index - 1, Lexer.DEFAULT_TOKEN_CHANNEL)
|
|
256
|
+
return nil if prev_on_channel == token_index - 1
|
|
257
|
+
|
|
258
|
+
# if none onchannel to left, prev_on_channel=-1 then from=0
|
|
259
|
+
from = prev_on_channel + 1
|
|
260
|
+
to = token_index - 1
|
|
261
|
+
|
|
262
|
+
filter_for_channel(from, to, channel)
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def hidden_tokens_to_left1(token_index)
|
|
266
|
+
hidden_tokens_to_left(token_index, -1)
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
def filter_for_channel(from, to, channel)
|
|
270
|
+
hidden = []
|
|
271
|
+
i = from
|
|
272
|
+
while i <= to
|
|
273
|
+
t = @tokens[i]
|
|
274
|
+
if channel == -1
|
|
275
|
+
hidden.add(t) if t.channel != Lexer.DEFAULT_TOKEN_CHANNEL
|
|
276
|
+
else
|
|
277
|
+
hidden.add(t) if t.channel == channel
|
|
278
|
+
end
|
|
279
|
+
i += 1
|
|
280
|
+
end
|
|
281
|
+
return nil if hidden.empty?
|
|
282
|
+
|
|
283
|
+
hidden
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
def source_name
|
|
287
|
+
@token_source.get_source_name
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
def text
|
|
291
|
+
text2(Interval.of(0, size - 1))
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
def text2(interval)
|
|
295
|
+
start = interval.a
|
|
296
|
+
stop = interval.b
|
|
297
|
+
return '' if start < 0 || stop < 0
|
|
298
|
+
|
|
299
|
+
fill
|
|
300
|
+
stop = @tokens.length - 1 if stop >= @tokens.length
|
|
301
|
+
|
|
302
|
+
buf = ''
|
|
303
|
+
i = start
|
|
304
|
+
while i <= stop
|
|
305
|
+
t = @tokens[i]
|
|
306
|
+
break if t.type == Token::EOF
|
|
307
|
+
|
|
308
|
+
buf << t.text
|
|
309
|
+
buf << i += 1
|
|
310
|
+
end
|
|
311
|
+
buf
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
def text3(ctx)
|
|
315
|
+
text2(ctx.source_interval)
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
def text4(start, stop)
|
|
319
|
+
if !start.nil? && !stop.nil?
|
|
320
|
+
return text2(Interval.of(start.index, stop.index))
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
''
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
def fill
|
|
327
|
+
lazy_init
|
|
328
|
+
block_size = 1000
|
|
329
|
+
loop do
|
|
330
|
+
fetched = fetch(block_size)
|
|
331
|
+
return if fetched < block_size
|
|
332
|
+
end
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
end
|