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,131 @@
|
|
|
1
|
+
require 'antlr4/runtime/rule_node'
|
|
2
|
+
|
|
3
|
+
module Antlr4::Runtime
|
|
4
|
+
|
|
5
|
+
class RuleContext < RuleNode
|
|
6
|
+
attr_accessor :parent
|
|
7
|
+
attr_accessor :invoking_state
|
|
8
|
+
|
|
9
|
+
def initialize(parent = nil, invoking_state = nil)
|
|
10
|
+
@invoking_state = -1
|
|
11
|
+
@parent = parent
|
|
12
|
+
@invoking_state = invoking_state
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def depth
|
|
16
|
+
n = 0
|
|
17
|
+
p = self
|
|
18
|
+
until p.nil?
|
|
19
|
+
p = p.parent
|
|
20
|
+
n += 1
|
|
21
|
+
end
|
|
22
|
+
n
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def empty?
|
|
26
|
+
@invoking_state == -1
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# satisfy the ParseTree / SyntaxTree interface
|
|
30
|
+
|
|
31
|
+
def source_interval
|
|
32
|
+
Interval.invalid
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def rule_context
|
|
36
|
+
self
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def payload
|
|
40
|
+
self
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def set_alt_number(_num)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def text
|
|
47
|
+
return '' if child_count == 0
|
|
48
|
+
|
|
49
|
+
builder = ''
|
|
50
|
+
i = 0
|
|
51
|
+
while i < child_count
|
|
52
|
+
builder << child_at(i).text
|
|
53
|
+
i += 1
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
builder.to_s
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def rule_index
|
|
60
|
+
-1
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def alt_number
|
|
64
|
+
ATN::INVALID_ALT_NUMBER
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def child(_i)
|
|
68
|
+
nil
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def child_count
|
|
72
|
+
0
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def accept(visitor)
|
|
76
|
+
visitor.visit_children(self)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def to_string_tree_recog(recog)
|
|
80
|
+
Trees.to_sTree(self, recog)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def to_string_tree_rulenames(rule_names)
|
|
84
|
+
Trees.to_sTree(self, rule_names)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def to_string_tree
|
|
88
|
+
to_string_tree_rulenames(nil)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def to_s
|
|
92
|
+
to_s_recog_ctx(nil, nil)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def to_s_recog(recog)
|
|
96
|
+
to_s_recog_ctx(recog, ParserRuleContext::EMPTY)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def to_s_list(rule_names)
|
|
100
|
+
to_s_list_ctx(rule_names, nil)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def to_s_recog_ctx(recog, stop)
|
|
104
|
+
rule_names = !recog.nil? ? recog.rule_names : nil
|
|
105
|
+
rule_names_list = !rule_names.nil? ? rule_names : nil
|
|
106
|
+
to_s_list_ctx(rule_names_list, stop)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def to_s_list_ctx(rule_names, stop)
|
|
110
|
+
buf = ''
|
|
111
|
+
p = self
|
|
112
|
+
buf << '['
|
|
113
|
+
while !p.nil? && p != stop
|
|
114
|
+
if rule_names.nil?
|
|
115
|
+
buf << p.invoking_state unless p.empty?
|
|
116
|
+
else
|
|
117
|
+
rule_index = p.rule_index
|
|
118
|
+
rule_name = rule_index >= 0 && rule_index < rule_names.size ? rule_names[rule_index] : rule_index
|
|
119
|
+
buf << rule_name.to_s
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
buf << ' ' if !p.parent.nil? && (!rule_names.nil? || !p.parent.empty?)
|
|
123
|
+
|
|
124
|
+
p = p.parent
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
buf << ']'
|
|
128
|
+
buf
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Antlr4::Runtime
|
|
2
|
+
|
|
3
|
+
class RuleStartState < ATNState
|
|
4
|
+
attr_accessor :stop_state
|
|
5
|
+
attr_accessor :is_left_recursive_rule
|
|
6
|
+
|
|
7
|
+
def initialize
|
|
8
|
+
super
|
|
9
|
+
@is_left_recursive_rule = false
|
|
10
|
+
@stop_state = nil
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def state_type
|
|
14
|
+
RULE_START
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
module Antlr4::Runtime
|
|
2
|
+
|
|
3
|
+
class RuleTagToken < Token
|
|
4
|
+
attr_reader :rule_name
|
|
5
|
+
attr_reader :bypass_token_type
|
|
6
|
+
attr_reader :label
|
|
7
|
+
|
|
8
|
+
def initialize(rule_name, bypass_token_type, label = nil)
|
|
9
|
+
if rule_name.nil? || rule_name.empty?
|
|
10
|
+
raise IllegalArgumentException, 'rule_name cannot be nil or empty.'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
@rule_name = rule_name
|
|
14
|
+
@bypass_token_type = bypass_token_type
|
|
15
|
+
@label = label
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def channel
|
|
19
|
+
DEFAULT_CHANNEL
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def text
|
|
23
|
+
return '<' + @label + ':' + @rule_name + '>' unless @label.nil?
|
|
24
|
+
|
|
25
|
+
'<' + @rule_name + '>'
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def type
|
|
29
|
+
@bypass_token_type
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def line
|
|
33
|
+
0
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def char_position_in_line
|
|
37
|
+
-1
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def token_index
|
|
41
|
+
-1
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def start_index
|
|
45
|
+
-1
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def stop_index
|
|
49
|
+
-1
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def token_source
|
|
53
|
+
nil
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def input_stream
|
|
57
|
+
nil
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def to_s
|
|
61
|
+
@rule_name + ':' + @bypass_token_type
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Antlr4::Runtime
|
|
2
|
+
|
|
3
|
+
class RuleTransition < Transition
|
|
4
|
+
attr_reader :rule_index # no Rule object at runtime
|
|
5
|
+
|
|
6
|
+
attr_reader :precedence
|
|
7
|
+
|
|
8
|
+
attr_reader :follow_state
|
|
9
|
+
|
|
10
|
+
def initialize(rule_start, rule_index, precedence, follow_state)
|
|
11
|
+
super(rule_start)
|
|
12
|
+
@rule_index = rule_index
|
|
13
|
+
@precedence = precedence
|
|
14
|
+
@follow_state = follow_state
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def serialization_type
|
|
18
|
+
RULE
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def epsilon?
|
|
22
|
+
true
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def matches(_symbol, _min_vocab_symbol, _max_vocab_symbol)
|
|
26
|
+
false
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
module Antlr4::Runtime
|
|
2
|
+
class SemanticContext
|
|
3
|
+
def eval(parser, parser_call_stack)
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def eval_precedence(_parser, _parser_call_stack)
|
|
7
|
+
self
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class Predicate < SemanticContext
|
|
11
|
+
attr_accessor :rule_index
|
|
12
|
+
attr_accessor :pred_index
|
|
13
|
+
attr_accessor :is_ctx_dependent # e.g., $i ref in pred
|
|
14
|
+
|
|
15
|
+
def initialize(rule_index = -1, pred_index = -1, is_ctx_dependent = false)
|
|
16
|
+
@rule_index = rule_index
|
|
17
|
+
@pred_index = pred_index
|
|
18
|
+
@is_ctx_dependent = is_ctx_dependent
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def eval(parser, parser_call_stack)
|
|
22
|
+
localctx = @is_ctx_dependent ? parser_call_stack : nil
|
|
23
|
+
parser.sempred(localctx, @rule_index, @pred_index)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def hash
|
|
27
|
+
return @_hash unless @_hash.nil?
|
|
28
|
+
|
|
29
|
+
hash_code = MurmurHash.hash_ints([@rule_index, @pred_index, @is_ctx_dependent ? 1 : 0])
|
|
30
|
+
|
|
31
|
+
if !@_hash.nil?
|
|
32
|
+
if hash_code == @_hash
|
|
33
|
+
puts 'Same hash_code for SemanticContext'
|
|
34
|
+
else
|
|
35
|
+
puts 'Different hash_code for SemanticContext'
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
@_hash = hash_code
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def eql?(other)
|
|
42
|
+
return false unless other.is_a? Predicate
|
|
43
|
+
return true if self == other
|
|
44
|
+
|
|
45
|
+
@rule_index == other.rule_index && @pred_index == other.pred_index && @is_ctx_dependent == other.is_ctx_dependent
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def to_s
|
|
49
|
+
'' + @rule_index + ':' + @pred_index + 'end?'
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
class PrecedencePredicate < SemanticContext
|
|
54
|
+
attr_accessor :precedence
|
|
55
|
+
|
|
56
|
+
def initialize(precedence = 0)
|
|
57
|
+
@precedence = precedence
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def eval(parser, parser_call_stack)
|
|
61
|
+
parser.precpred(parser_call_stack, @precedence)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def eval_precedence(parser, parser_call_stack)
|
|
65
|
+
SemanticContext::NONE if parser.precpred(parser_call_stack, @precedence)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def compare_to(o)
|
|
69
|
+
@precedence - o.precedence
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def hash
|
|
73
|
+
hash_code = 1
|
|
74
|
+
31 * hash_code + @precedence
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def eql?(other)
|
|
78
|
+
return false unless other.is_a? PrecedencePredicate
|
|
79
|
+
|
|
80
|
+
return true if self == other
|
|
81
|
+
|
|
82
|
+
@precedence == other.precedence
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# precedence >= _precedenceStack.peek()
|
|
86
|
+
def to_s
|
|
87
|
+
'' + @precedence + '>=precend?'
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
class Operator < SemanticContext
|
|
92
|
+
def operands
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
class AND < Operator
|
|
97
|
+
attr_accessor :opnds
|
|
98
|
+
|
|
99
|
+
def initialize(a, b)
|
|
100
|
+
operands = Set.new
|
|
101
|
+
if a.is_a? AND
|
|
102
|
+
operands.add_all(a.opnds)
|
|
103
|
+
else
|
|
104
|
+
operands.add(a)
|
|
105
|
+
end
|
|
106
|
+
if b.is_a? AND
|
|
107
|
+
operands.add_all(b.opnds)
|
|
108
|
+
else
|
|
109
|
+
operands.add(b)
|
|
110
|
+
end
|
|
111
|
+
precedence_predicates = filter_precedence_predicates(operands)
|
|
112
|
+
unless precedence_predicates.empty?
|
|
113
|
+
# interested in the transition with the lowest precedence
|
|
114
|
+
reduced = precedence_predicates.min
|
|
115
|
+
operands.add(reduced)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
@opnds = operands.to_a
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def eql?(other)
|
|
122
|
+
return true if self == other
|
|
123
|
+
return false unless other.is_a? AND
|
|
124
|
+
|
|
125
|
+
@opnds.eql?(other.opnds)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def hash
|
|
129
|
+
hash_code = MurmurHash.hash(@opnds, AND.hash)
|
|
130
|
+
if !@_hash2.nil?
|
|
131
|
+
if hash_code == @_hash2
|
|
132
|
+
puts 'Same hash_code for SemanticContext_2'
|
|
133
|
+
else
|
|
134
|
+
puts 'Different hash_code for SemanticContext_2'
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
@_hash2 = hash_code
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def eval(parser, parser_call_stack)
|
|
141
|
+
i = 0
|
|
142
|
+
while i < @opnds.length
|
|
143
|
+
opnd = @opnds[i]
|
|
144
|
+
return false unless opnd.eval(parser, parser_call_stack)
|
|
145
|
+
i += 1
|
|
146
|
+
end
|
|
147
|
+
true
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def eval_precedence(parser, parser_call_stack)
|
|
151
|
+
differs = false
|
|
152
|
+
operands = []
|
|
153
|
+
i = 0
|
|
154
|
+
while i < @opnds.length
|
|
155
|
+
context = @opnds[i]
|
|
156
|
+
evaluated = context.eval_precedence(parser, parser_call_stack)
|
|
157
|
+
differs |= (evaluated != context)
|
|
158
|
+
if evaluated == null
|
|
159
|
+
# The AND context is false if any element is false
|
|
160
|
+
return nil
|
|
161
|
+
elsif evaluated != NONE
|
|
162
|
+
# Reduce the result by skipping true elements
|
|
163
|
+
operands.add(evaluated)
|
|
164
|
+
end
|
|
165
|
+
i += 1
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
return self unless differs
|
|
169
|
+
|
|
170
|
+
if operands.empty?
|
|
171
|
+
# all elements were true, so the AND context is true
|
|
172
|
+
return NONE
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
result = operands[0]
|
|
176
|
+
i = 1
|
|
177
|
+
while i < operands.length
|
|
178
|
+
result = SemanticContext.and(result, operands.get(i))
|
|
179
|
+
i += 1
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
result
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def to_s
|
|
186
|
+
@opnds.join('&&')
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
class OR < Operator
|
|
191
|
+
attr_accessor :opnds
|
|
192
|
+
|
|
193
|
+
def initialize(a, b)
|
|
194
|
+
operands = Set.new
|
|
195
|
+
if a.is_a? OR
|
|
196
|
+
operands.add_all(a.opnds)
|
|
197
|
+
else
|
|
198
|
+
operands.add(a)
|
|
199
|
+
end
|
|
200
|
+
if b.is_a? OR
|
|
201
|
+
operands.add_all(b.opnds)
|
|
202
|
+
else
|
|
203
|
+
operands.add(b)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
precedence_predicates = filter_precedence_predicates(operands)
|
|
207
|
+
unless precedence_predicates.empty?
|
|
208
|
+
# interested in the transition with the highest precedence
|
|
209
|
+
reduced = precedence_predicates.max
|
|
210
|
+
operands.add(reduced)
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
@opnds = operands.to_s
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def eql?(other)
|
|
217
|
+
return true if self == other
|
|
218
|
+
return false unless other.is_a? OR
|
|
219
|
+
|
|
220
|
+
@opnds.eql?(other.opnds)
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def hash
|
|
224
|
+
hash_code = MurmurHash.hash(@opnds, OR.hash)
|
|
225
|
+
if !@_hash3.nil?
|
|
226
|
+
if hash_code == @_hash3
|
|
227
|
+
puts 'Same hash_code for SemanticContext_2'
|
|
228
|
+
else
|
|
229
|
+
puts 'Different hash_code for SemanticContext_2'
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
@_hash3 = hash_code
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
def eval(parser, parser_call_stack)
|
|
236
|
+
i = 0
|
|
237
|
+
while i < @opnds.length
|
|
238
|
+
opnd = @opnds[i]
|
|
239
|
+
return true if opnd.eval(parser, parser_call_stack)
|
|
240
|
+
i += 1
|
|
241
|
+
end
|
|
242
|
+
false
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
def eval_precedence(parser, parser_call_stack)
|
|
246
|
+
differs = false
|
|
247
|
+
operands = []
|
|
248
|
+
i = 0
|
|
249
|
+
while i < @opnds.length
|
|
250
|
+
context = @opnds[i]
|
|
251
|
+
evaluated = context.eval_precedence(parser, parser_call_stack)
|
|
252
|
+
differs |= (evaluated != context)
|
|
253
|
+
if evaluated == NONE
|
|
254
|
+
# The OR context is true if any element is true
|
|
255
|
+
return NONE
|
|
256
|
+
elsif evaluated != null
|
|
257
|
+
# Reduce the result by skipping false elements
|
|
258
|
+
operands.add(evaluated)
|
|
259
|
+
end
|
|
260
|
+
i += 1
|
|
261
|
+
end
|
|
262
|
+
return self unless differs
|
|
263
|
+
|
|
264
|
+
if operands.empty?
|
|
265
|
+
# all elements were false, so the OR context is false
|
|
266
|
+
return nil
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
result = operands[0]
|
|
270
|
+
i = 1
|
|
271
|
+
while i < operands.size
|
|
272
|
+
result = SemanticContext.or(result, operands.get(i))
|
|
273
|
+
i += 1
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
result
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def to_s
|
|
280
|
+
@opnds.join('||')
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
def self.and(a, b)
|
|
285
|
+
return b if a.nil? || a == NONE
|
|
286
|
+
return a if b.nil? || b == NONE
|
|
287
|
+
|
|
288
|
+
result = AND.new(a, b)
|
|
289
|
+
return result.opnds[0] if result.opnds.length == 1
|
|
290
|
+
|
|
291
|
+
result
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
def self.or(a, b)
|
|
295
|
+
return b if a.nil?
|
|
296
|
+
return a if b.nil?
|
|
297
|
+
return NONE if a == NONE || b == NONE
|
|
298
|
+
|
|
299
|
+
OR result = OR.new(a, b)
|
|
300
|
+
return result.opnds[0] if result.opnds.length == 1
|
|
301
|
+
|
|
302
|
+
result
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
def self.filter_precedence_predicates(collection)
|
|
306
|
+
result = collection.select {|item| item.is_a? PrecedencePredicate}
|
|
307
|
+
collection.reject! {|item| (item.is_a? PrecedencePredicate)}
|
|
308
|
+
result
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
NONE = Predicate.new
|
|
312
|
+
end
|
|
313
|
+
end
|