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.
Files changed (156) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +7 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +4 -0
  7. data/Gemfile.lock +35 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +65 -0
  10. data/Rakefile +6 -0
  11. data/antlr4-runtime.gemspec +30 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/ext/rumourhash/Makefile +264 -0
  15. data/ext/rumourhash/extconf.rb +3 -0
  16. data/ext/rumourhash/rumourhash.c +59 -0
  17. data/lib/antlr4/runtime.rb +37 -0
  18. data/lib/antlr4/runtime/abstract_parse_tree_visitor.rb +43 -0
  19. data/lib/antlr4/runtime/abstract_predicate_transition.rb +11 -0
  20. data/lib/antlr4/runtime/action_transition.rb +29 -0
  21. data/lib/antlr4/runtime/ambiguity_info.rb +10 -0
  22. data/lib/antlr4/runtime/antlr_error_listener.rb +15 -0
  23. data/lib/antlr4/runtime/antlr_error_strategy.rb +24 -0
  24. data/lib/antlr4/runtime/antlr_file_stream.rb +17 -0
  25. data/lib/antlr4/runtime/antlr_input_stream.rb +6 -0
  26. data/lib/antlr4/runtime/array_2d_hash_set.rb +471 -0
  27. data/lib/antlr4/runtime/array_prediction_context.rb +76 -0
  28. data/lib/antlr4/runtime/atn.rb +100 -0
  29. data/lib/antlr4/runtime/atn_config.rb +140 -0
  30. data/lib/antlr4/runtime/atn_config_set.rb +150 -0
  31. data/lib/antlr4/runtime/atn_deserialization_options.rb +48 -0
  32. data/lib/antlr4/runtime/atn_deserializer.rb +737 -0
  33. data/lib/antlr4/runtime/atn_simulator.rb +69 -0
  34. data/lib/antlr4/runtime/atn_state.rb +118 -0
  35. data/lib/antlr4/runtime/atn_type.rb +8 -0
  36. data/lib/antlr4/runtime/atom_transition.rb +27 -0
  37. data/lib/antlr4/runtime/bail_error_strategy.rb +31 -0
  38. data/lib/antlr4/runtime/base_error_listener.rb +18 -0
  39. data/lib/antlr4/runtime/basic_block_start_state.rb +12 -0
  40. data/lib/antlr4/runtime/basic_state.rb +11 -0
  41. data/lib/antlr4/runtime/bit_set.rb +54 -0
  42. data/lib/antlr4/runtime/block_end_state.rb +15 -0
  43. data/lib/antlr4/runtime/block_start_state.rb +12 -0
  44. data/lib/antlr4/runtime/buffered_token_stream.rb +335 -0
  45. data/lib/antlr4/runtime/char_stream.rb +6 -0
  46. data/lib/antlr4/runtime/char_streams.rb +12 -0
  47. data/lib/antlr4/runtime/chunk.rb +4 -0
  48. data/lib/antlr4/runtime/code_point_char_stream.rb +83 -0
  49. data/lib/antlr4/runtime/common_token.rb +125 -0
  50. data/lib/antlr4/runtime/common_token_factory.rb +30 -0
  51. data/lib/antlr4/runtime/common_token_stream.rb +63 -0
  52. data/lib/antlr4/runtime/console_error_listener.rb +12 -0
  53. data/lib/antlr4/runtime/context_sensitivity_info.rb +7 -0
  54. data/lib/antlr4/runtime/decision_event_info.rb +19 -0
  55. data/lib/antlr4/runtime/decision_info.rb +36 -0
  56. data/lib/antlr4/runtime/decision_state.rb +15 -0
  57. data/lib/antlr4/runtime/default_error_strategy.rb +314 -0
  58. data/lib/antlr4/runtime/dfa.rb +97 -0
  59. data/lib/antlr4/runtime/dfa_serializer.rb +62 -0
  60. data/lib/antlr4/runtime/dfa_state.rb +109 -0
  61. data/lib/antlr4/runtime/diagnostic_error_listener.rb +58 -0
  62. data/lib/antlr4/runtime/double_key_map.rb +49 -0
  63. data/lib/antlr4/runtime/empty_prediction_context.rb +35 -0
  64. data/lib/antlr4/runtime/epsilon_transition.rb +27 -0
  65. data/lib/antlr4/runtime/equality_comparator.rb +4 -0
  66. data/lib/antlr4/runtime/error_info.rb +7 -0
  67. data/lib/antlr4/runtime/error_node.rb +5 -0
  68. data/lib/antlr4/runtime/error_node_impl.rb +12 -0
  69. data/lib/antlr4/runtime/failed_predicate_exception.rb +33 -0
  70. data/lib/antlr4/runtime/flexible_hash_map.rb +232 -0
  71. data/lib/antlr4/runtime/input_mismatch_exception.rb +20 -0
  72. data/lib/antlr4/runtime/int_stream.rb +31 -0
  73. data/lib/antlr4/runtime/integer.rb +14 -0
  74. data/lib/antlr4/runtime/interval.rb +111 -0
  75. data/lib/antlr4/runtime/interval_set.rb +540 -0
  76. data/lib/antlr4/runtime/lexer.rb +257 -0
  77. data/lib/antlr4/runtime/lexer_action.rb +12 -0
  78. data/lib/antlr4/runtime/lexer_action_executor.rb +75 -0
  79. data/lib/antlr4/runtime/lexer_action_type.rb +12 -0
  80. data/lib/antlr4/runtime/lexer_atn_config.rb +50 -0
  81. data/lib/antlr4/runtime/lexer_atn_simulator.rb +522 -0
  82. data/lib/antlr4/runtime/lexer_channel_action.rb +51 -0
  83. data/lib/antlr4/runtime/lexer_custom_action.rb +49 -0
  84. data/lib/antlr4/runtime/lexer_dfa_serializer.rb +12 -0
  85. data/lib/antlr4/runtime/lexer_indexed_custom_action.rb +49 -0
  86. data/lib/antlr4/runtime/lexer_mode_action.rb +51 -0
  87. data/lib/antlr4/runtime/lexer_more_action.rb +41 -0
  88. data/lib/antlr4/runtime/lexer_no_viable_alt_exception.rb +4 -0
  89. data/lib/antlr4/runtime/lexer_pop_mode_action.rb +41 -0
  90. data/lib/antlr4/runtime/lexer_push_mode_action.rb +51 -0
  91. data/lib/antlr4/runtime/lexer_skip_action.rb +43 -0
  92. data/lib/antlr4/runtime/lexer_type_action.rb +51 -0
  93. data/lib/antlr4/runtime/ll1_analyzer.rb +133 -0
  94. data/lib/antlr4/runtime/lookahead_event_info.rb +10 -0
  95. data/lib/antlr4/runtime/loop_end_state.rb +15 -0
  96. data/lib/antlr4/runtime/murmur_hash.rb +99 -0
  97. data/lib/antlr4/runtime/no_viable_alt_exception.rb +7 -0
  98. data/lib/antlr4/runtime/not_set_transition.rb +20 -0
  99. data/lib/antlr4/runtime/object_equality_comparator.rb +18 -0
  100. data/lib/antlr4/runtime/ordered_atn_config_set.rb +15 -0
  101. data/lib/antlr4/runtime/parse_cancellation_exception.rb +5 -0
  102. data/lib/antlr4/runtime/parse_tree.rb +7 -0
  103. data/lib/antlr4/runtime/parse_tree_listener.rb +4 -0
  104. data/lib/antlr4/runtime/parse_tree_visitor.rb +4 -0
  105. data/lib/antlr4/runtime/parser.rb +522 -0
  106. data/lib/antlr4/runtime/parser_atn_simulator.rb +1171 -0
  107. data/lib/antlr4/runtime/parser_rule_context.rb +186 -0
  108. data/lib/antlr4/runtime/plus_block_start_state.rb +11 -0
  109. data/lib/antlr4/runtime/plus_loopback_state.rb +12 -0
  110. data/lib/antlr4/runtime/precedence_predicate_transition.rb +31 -0
  111. data/lib/antlr4/runtime/predicate.rb +6 -0
  112. data/lib/antlr4/runtime/predicate_eval_info.rb +16 -0
  113. data/lib/antlr4/runtime/predicate_transition.rb +35 -0
  114. data/lib/antlr4/runtime/prediction_context.rb +103 -0
  115. data/lib/antlr4/runtime/prediction_context_cache.rb +28 -0
  116. data/lib/antlr4/runtime/prediction_context_utils.rb +407 -0
  117. data/lib/antlr4/runtime/prediction_mode.rb +213 -0
  118. data/lib/antlr4/runtime/profiling_atn_simulator.rb +149 -0
  119. data/lib/antlr4/runtime/proxy_error_listener.rb +33 -0
  120. data/lib/antlr4/runtime/range_transition.rb +29 -0
  121. data/lib/antlr4/runtime/recognition_exception.rb +17 -0
  122. data/lib/antlr4/runtime/recognizer.rb +136 -0
  123. data/lib/antlr4/runtime/rule_context.rb +131 -0
  124. data/lib/antlr4/runtime/rule_context_with_alt_num.rb +11 -0
  125. data/lib/antlr4/runtime/rule_node.rb +8 -0
  126. data/lib/antlr4/runtime/rule_start_state.rb +17 -0
  127. data/lib/antlr4/runtime/rule_stop_state.rb +12 -0
  128. data/lib/antlr4/runtime/rule_tag_token.rb +64 -0
  129. data/lib/antlr4/runtime/rule_transition.rb +29 -0
  130. data/lib/antlr4/runtime/semantic_context.rb +313 -0
  131. data/lib/antlr4/runtime/set_transition.rb +29 -0
  132. data/lib/antlr4/runtime/singleton_prediction_context.rb +56 -0
  133. data/lib/antlr4/runtime/star_block_start_state.rb +12 -0
  134. data/lib/antlr4/runtime/star_loop_entry_state.rb +17 -0
  135. data/lib/antlr4/runtime/star_loopback_state.rb +16 -0
  136. data/lib/antlr4/runtime/syntax_tree.rb +6 -0
  137. data/lib/antlr4/runtime/tag_chunk.rb +22 -0
  138. data/lib/antlr4/runtime/terminal_node.rb +5 -0
  139. data/lib/antlr4/runtime/terminal_node_impl.rb +50 -0
  140. data/lib/antlr4/runtime/text_chunk.rb +16 -0
  141. data/lib/antlr4/runtime/token.rb +13 -0
  142. data/lib/antlr4/runtime/token_stream.rb +13 -0
  143. data/lib/antlr4/runtime/token_tag_token.rb +22 -0
  144. data/lib/antlr4/runtime/tokens_start_state.rb +14 -0
  145. data/lib/antlr4/runtime/transition.rb +51 -0
  146. data/lib/antlr4/runtime/tree.rb +4 -0
  147. data/lib/antlr4/runtime/trees.rb +195 -0
  148. data/lib/antlr4/runtime/triple.rb +40 -0
  149. data/lib/antlr4/runtime/utils.rb +117 -0
  150. data/lib/antlr4/runtime/uuid.rb +46 -0
  151. data/lib/antlr4/runtime/version.rb +5 -0
  152. data/lib/antlr4/runtime/vocabulary.rb +12 -0
  153. data/lib/antlr4/runtime/vocabulary_impl.rb +82 -0
  154. data/lib/antlr4/runtime/wildcard_transition.rb +20 -0
  155. data/lib/antlr4/runtime/writable_token.rb +7 -0
  156. 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,8 @@
1
+ module Antlr4::Runtime
2
+ class ATNType
3
+ LEXER = 0
4
+ PARSER = 1
5
+
6
+ VALUES = [LEXER, PARSER]
7
+ end
8
+ 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,12 @@
1
+ module Antlr4::Runtime
2
+
3
+ class BasicBlockStartState < BlockStartState
4
+ def initialize
5
+ super
6
+ end
7
+
8
+ def state_type
9
+ BLOCK_START
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ module Antlr4::Runtime
2
+ class BasicState < ATNState
3
+ def initialize
4
+ super
5
+ end
6
+
7
+ def state_type
8
+ BASIC
9
+ end
10
+ end
11
+ 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,15 @@
1
+ module Antlr4::Runtime
2
+
3
+ class BlockEndState < ATNState
4
+ attr_accessor :start_state
5
+
6
+ def initialize
7
+ super
8
+ @start_state = nil
9
+ end
10
+
11
+ def state_type
12
+ BLOCK_END
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ require 'antlr4/runtime/decision_state'
2
+
3
+ module Antlr4::Runtime
4
+ class BlockStartState < DecisionState
5
+ attr_accessor :end_state
6
+
7
+ def initialize
8
+ super
9
+ @end_state = nil
10
+ end
11
+ end
12
+ 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