rley 0.7.03 → 0.7.08
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 +4 -4
- data/.rubocop.yml +362 -62
- data/.travis.yml +6 -7
- data/CHANGELOG.md +20 -1
- data/LICENSE.txt +1 -1
- data/README.md +6 -7
- data/Rakefile +2 -0
- data/appveyor.yml +2 -4
- data/examples/NLP/benchmark_pico_en.rb +2 -0
- data/examples/NLP/engtagger.rb +193 -188
- data/examples/NLP/nano_eng/nano_en_demo.rb +2 -0
- data/examples/NLP/nano_eng/nano_grammar.rb +7 -5
- data/examples/NLP/pico_en_demo.rb +2 -0
- data/examples/data_formats/JSON/cli_options.rb +3 -1
- data/examples/data_formats/JSON/json_ast_builder.rb +14 -9
- data/examples/data_formats/JSON/json_ast_nodes.rb +14 -21
- data/examples/data_formats/JSON/json_demo.rb +2 -0
- data/examples/data_formats/JSON/json_grammar.rb +4 -2
- data/examples/data_formats/JSON/json_lexer.rb +10 -8
- data/examples/data_formats/JSON/json_minifier.rb +3 -1
- data/examples/general/calc_iter1/calc_ast_builder.rb +15 -10
- data/examples/general/calc_iter1/calc_ast_nodes.rb +25 -37
- data/examples/general/calc_iter1/calc_demo.rb +2 -0
- data/examples/general/calc_iter1/calc_grammar.rb +4 -2
- data/examples/general/calc_iter1/calc_lexer.rb +8 -4
- data/examples/general/calc_iter1/spec/calculator_spec.rb +7 -5
- data/examples/general/calc_iter2/calc_ast_builder.rb +7 -3
- data/examples/general/calc_iter2/calc_ast_nodes.rb +29 -43
- data/examples/general/calc_iter2/calc_demo.rb +2 -0
- data/examples/general/calc_iter2/calc_grammar.rb +5 -3
- data/examples/general/calc_iter2/calc_lexer.rb +13 -10
- data/examples/general/calc_iter2/spec/calculator_spec.rb +28 -26
- data/examples/general/left.rb +4 -2
- data/examples/general/right.rb +4 -2
- data/lib/rley.rb +2 -0
- data/lib/rley/base/base_parser.rb +2 -0
- data/lib/rley/base/dotted_item.rb +38 -41
- data/lib/rley/base/grm_items_builder.rb +2 -0
- data/lib/rley/constants.rb +5 -3
- data/lib/rley/engine.rb +22 -24
- data/lib/rley/formatter/asciitree.rb +6 -4
- data/lib/rley/formatter/base_formatter.rb +2 -0
- data/lib/rley/formatter/bracket_notation.rb +3 -8
- data/lib/rley/formatter/debug.rb +8 -6
- data/lib/rley/formatter/json.rb +4 -2
- data/lib/rley/gfg/call_edge.rb +3 -1
- data/lib/rley/gfg/edge.rb +7 -5
- data/lib/rley/gfg/end_vertex.rb +4 -6
- data/lib/rley/gfg/epsilon_edge.rb +3 -5
- data/lib/rley/gfg/grm_flow_graph.rb +31 -25
- data/lib/rley/gfg/item_vertex.rb +12 -22
- data/lib/rley/gfg/non_terminal_vertex.rb +6 -4
- data/lib/rley/gfg/return_edge.rb +2 -0
- data/lib/rley/gfg/scan_edge.rb +3 -1
- data/lib/rley/gfg/shortcut_edge.rb +4 -2
- data/lib/rley/gfg/start_vertex.rb +6 -8
- data/lib/rley/gfg/vertex.rb +47 -41
- data/lib/rley/lexical/token.rb +3 -1
- data/lib/rley/lexical/token_range.rb +8 -6
- data/lib/rley/parse_forest_visitor.rb +7 -5
- data/lib/rley/parse_rep/ast_base_builder.rb +11 -11
- data/lib/rley/parse_rep/cst_builder.rb +7 -4
- data/lib/rley/parse_rep/parse_forest_builder.rb +36 -25
- data/lib/rley/parse_rep/parse_forest_factory.rb +5 -3
- data/lib/rley/parse_rep/parse_rep_creator.rb +18 -13
- data/lib/rley/parse_rep/parse_tree_builder.rb +15 -15
- data/lib/rley/parse_rep/parse_tree_factory.rb +27 -25
- data/lib/rley/parse_tree_visitor.rb +3 -1
- data/lib/rley/parser/error_reason.rb +9 -8
- data/lib/rley/parser/gfg_chart.rb +54 -22
- data/lib/rley/parser/gfg_earley_parser.rb +3 -1
- data/lib/rley/parser/gfg_parsing.rb +51 -31
- data/lib/rley/parser/parse_entry.rb +29 -33
- data/lib/rley/parser/parse_entry_set.rb +32 -27
- data/lib/rley/parser/parse_entry_tracker.rb +6 -4
- data/lib/rley/parser/parse_state.rb +18 -21
- data/lib/rley/parser/parse_state_tracker.rb +6 -4
- data/lib/rley/parser/parse_tracer.rb +15 -13
- data/lib/rley/parser/parse_walker_factory.rb +28 -29
- data/lib/rley/parser/state_set.rb +11 -10
- data/lib/rley/ptree/non_terminal_node.rb +10 -6
- data/lib/rley/ptree/parse_tree.rb +6 -4
- data/lib/rley/ptree/parse_tree_node.rb +7 -5
- data/lib/rley/ptree/terminal_node.rb +9 -7
- data/lib/rley/rley_error.rb +12 -10
- data/lib/rley/sppf/alternative_node.rb +8 -6
- data/lib/rley/sppf/composite_node.rb +9 -7
- data/lib/rley/sppf/epsilon_node.rb +5 -3
- data/lib/rley/sppf/leaf_node.rb +5 -3
- data/lib/rley/sppf/non_terminal_node.rb +2 -0
- data/lib/rley/sppf/parse_forest.rb +19 -17
- data/lib/rley/sppf/sppf_node.rb +9 -8
- data/lib/rley/sppf/token_node.rb +5 -3
- data/lib/rley/syntax/grammar.rb +7 -5
- data/lib/rley/syntax/grammar_builder.rb +11 -9
- data/lib/rley/syntax/grm_symbol.rb +8 -6
- data/lib/rley/syntax/literal.rb +2 -0
- data/lib/rley/syntax/non_terminal.rb +11 -15
- data/lib/rley/syntax/production.rb +13 -11
- data/lib/rley/syntax/symbol_seq.rb +10 -10
- data/lib/rley/syntax/terminal.rb +6 -5
- data/lib/rley/syntax/verbatim_symbol.rb +5 -3
- data/lib/support/base_tokenizer.rb +23 -20
- data/spec/rley/base/dotted_item_spec.rb +4 -2
- data/spec/rley/base/grm_items_builder_spec.rb +2 -0
- data/spec/rley/engine_spec.rb +47 -9
- data/spec/rley/formatter/asciitree_spec.rb +11 -9
- data/spec/rley/formatter/bracket_notation_spec.rb +16 -14
- data/spec/rley/formatter/debug_spec.rb +4 -2
- data/spec/rley/formatter/json_spec.rb +5 -3
- data/spec/rley/gfg/call_edge_spec.rb +2 -0
- data/spec/rley/gfg/edge_spec.rb +2 -0
- data/spec/rley/gfg/end_vertex_spec.rb +7 -5
- data/spec/rley/gfg/epsilon_edge_spec.rb +2 -0
- data/spec/rley/gfg/grm_flow_graph_spec.rb +2 -0
- data/spec/rley/gfg/item_vertex_spec.rb +12 -10
- data/spec/rley/gfg/non_terminal_vertex_spec.rb +5 -3
- data/spec/rley/gfg/return_edge_spec.rb +2 -0
- data/spec/rley/gfg/scan_edge_spec.rb +2 -0
- data/spec/rley/gfg/shortcut_edge_spec.rb +3 -1
- data/spec/rley/gfg/start_vertex_spec.rb +7 -5
- data/spec/rley/gfg/vertex_spec.rb +5 -3
- data/spec/rley/lexical/token_range_spec.rb +18 -16
- data/spec/rley/lexical/token_spec.rb +4 -2
- data/spec/rley/parse_forest_visitor_spec.rb +167 -163
- data/spec/rley/parse_rep/ambiguous_parse_spec.rb +46 -44
- data/spec/rley/parse_rep/ast_builder_spec.rb +8 -6
- data/spec/rley/parse_rep/cst_builder_spec.rb +7 -5
- data/spec/rley/parse_rep/groucho_spec.rb +25 -25
- data/spec/rley/parse_rep/parse_forest_builder_spec.rb +28 -26
- data/spec/rley/parse_rep/parse_forest_factory_spec.rb +8 -6
- data/spec/rley/parse_rep/parse_tree_factory_spec.rb +4 -2
- data/spec/rley/parse_tree_visitor_spec.rb +12 -8
- data/spec/rley/parser/error_reason_spec.rb +8 -6
- data/spec/rley/parser/gfg_chart_spec.rb +17 -4
- data/spec/rley/parser/gfg_earley_parser_spec.rb +16 -11
- data/spec/rley/parser/gfg_parsing_spec.rb +41 -252
- data/spec/rley/parser/parse_entry_set_spec.rb +2 -0
- data/spec/rley/parser/parse_entry_spec.rb +21 -19
- data/spec/rley/parser/parse_state_spec.rb +7 -5
- data/spec/rley/parser/parse_tracer_spec.rb +16 -14
- data/spec/rley/parser/parse_walker_factory_spec.rb +10 -8
- data/spec/rley/parser/state_set_spec.rb +24 -22
- data/spec/rley/ptree/non_terminal_node_spec.rb +7 -3
- data/spec/rley/ptree/parse_tree_node_spec.rb +6 -4
- data/spec/rley/ptree/parse_tree_spec.rb +2 -0
- data/spec/rley/ptree/terminal_node_spec.rb +8 -6
- data/spec/rley/sppf/alternative_node_spec.rb +8 -6
- data/spec/rley/sppf/non_terminal_node_spec.rb +5 -3
- data/spec/rley/sppf/token_node_spec.rb +6 -4
- data/spec/rley/support/ambiguous_grammar_helper.rb +5 -4
- data/spec/rley/support/expectation_helper.rb +2 -0
- data/spec/rley/support/grammar_abc_helper.rb +4 -4
- data/spec/rley/support/grammar_ambig01_helper.rb +6 -5
- data/spec/rley/support/grammar_arr_int_helper.rb +6 -5
- data/spec/rley/support/grammar_b_expr_helper.rb +6 -5
- data/spec/rley/support/grammar_helper.rb +2 -0
- data/spec/rley/support/grammar_l0_helper.rb +15 -16
- data/spec/rley/support/grammar_pb_helper.rb +8 -5
- data/spec/rley/support/grammar_sppf_helper.rb +3 -1
- data/spec/rley/syntax/grammar_builder_spec.rb +7 -5
- data/spec/rley/syntax/grammar_spec.rb +8 -6
- data/spec/rley/syntax/grm_symbol_spec.rb +3 -1
- data/spec/rley/syntax/literal_spec.rb +2 -0
- data/spec/rley/syntax/non_terminal_spec.rb +10 -8
- data/spec/rley/syntax/production_spec.rb +15 -13
- data/spec/rley/syntax/symbol_seq_spec.rb +4 -2
- data/spec/rley/syntax/terminal_spec.rb +7 -5
- data/spec/rley/syntax/verbatim_symbol_spec.rb +3 -1
- data/spec/spec_helper.rb +2 -12
- data/spec/support/base_tokenizer_spec.rb +9 -2
- metadata +21 -63
- data/.simplecov +0 -7
- data/Gemfile +0 -8
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative '../../spec_helper'
|
2
4
|
|
3
5
|
require_relative '../../../lib/rley/parser/gfg_earley_parser'
|
@@ -17,11 +19,11 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
17
19
|
include ExpectationHelper # Mix-in with expectation on parse entry sets
|
18
20
|
|
19
21
|
# Emit a text representation of the current path.
|
20
|
-
def path_to_s
|
22
|
+
def path_to_s
|
21
23
|
text_parts = subject.curr_path.map do |path_element|
|
22
24
|
path_element.to_string(0)
|
23
25
|
end
|
24
|
-
|
26
|
+
text_parts.join('/')
|
25
27
|
end
|
26
28
|
|
27
29
|
def next_event(eventType, anEntryText)
|
@@ -86,28 +88,28 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
86
88
|
|
87
89
|
next_event(:visit, 'S. | 4') # Event 5
|
88
90
|
path_prefix = 'P[0, 5]/S[0, 5]/Alt(S => S * S .)[0, 5]'
|
89
|
-
expected_curr_path(path_prefix
|
91
|
+
expected_curr_path("#{path_prefix}/S[4, 5]")
|
90
92
|
|
91
93
|
next_event(:visit, 'S => L . | 4') # Event 6
|
92
|
-
expected_path5 = path_prefix
|
94
|
+
expected_path5 = "#{path_prefix}/S[4, 5]"
|
93
95
|
expect(path_to_s).to eq(expected_path5)
|
94
96
|
|
95
97
|
next_event(:visit, 'L. | 4') # Event 7
|
96
|
-
expected_curr_path(path_prefix
|
98
|
+
expected_curr_path("#{path_prefix}/S[4, 5]/L[4, 5]")
|
97
99
|
|
98
100
|
next_event(:visit, 'L => integer . | 4') # Event 8
|
99
|
-
expected_curr_path(path_prefix
|
101
|
+
expected_curr_path("#{path_prefix}/S[4, 5]/L[4, 5]")
|
100
102
|
expected_first_child('integer[4, 5]')
|
101
103
|
|
102
104
|
next_event(:visit, 'L => . integer | 4') # Event 9
|
103
|
-
expected_curr_path(path_prefix
|
105
|
+
expected_curr_path("#{path_prefix}/S[4, 5]/L[4, 5]")
|
104
106
|
|
105
107
|
next_event(:visit, '.L | 4') # Event 10
|
106
|
-
expected_curr_path(path_prefix
|
108
|
+
expected_curr_path("#{path_prefix}/S[4, 5]")
|
107
109
|
|
108
110
|
next_event(:visit, 'S => . L | 4') # Event 11
|
109
111
|
expected_curr_parent('S[4, 5]')
|
110
|
-
expected_curr_path(path_prefix
|
112
|
+
expected_curr_path("#{path_prefix}/S[4, 5]")
|
111
113
|
|
112
114
|
next_event(:visit, '.S | 4') # Event 12
|
113
115
|
expected_curr_parent('Alt(S => S * S .)[0, 5]')
|
@@ -121,73 +123,73 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
121
123
|
expected_curr_path(path_prefix)
|
122
124
|
|
123
125
|
next_event(:visit, 'S. | 0') # Event 15
|
124
|
-
expected_curr_path(path_prefix
|
126
|
+
expected_curr_path("#{path_prefix}/S[0, 3]")
|
125
127
|
|
126
128
|
next_event(:visit, 'S => S + S . | 0') # Event 16
|
127
129
|
expected_curr_parent('S[0, 3]')
|
128
|
-
expected_curr_path(path_prefix
|
130
|
+
expected_curr_path("#{path_prefix}/S[0, 3]")
|
129
131
|
|
130
132
|
next_event(:visit, 'S. | 2') # Event 17
|
131
|
-
expected_curr_path(path_prefix
|
133
|
+
expected_curr_path("#{path_prefix}/S[0, 3]/S[2, 3]")
|
132
134
|
|
133
135
|
next_event(:visit, 'S => L . | 2') # Event 18
|
134
|
-
expected_curr_path(path_prefix
|
136
|
+
expected_curr_path("#{path_prefix}/S[0, 3]/S[2, 3]")
|
135
137
|
|
136
138
|
next_event(:visit, 'L. | 2') # Event 19
|
137
|
-
expected_curr_path(path_prefix
|
139
|
+
expected_curr_path("#{path_prefix}/S[0, 3]/S[2, 3]/L[2, 3]")
|
138
140
|
|
139
141
|
next_event(:visit, 'L => integer . | 2') # Event 20
|
140
|
-
expected_curr_path(path_prefix
|
142
|
+
expected_curr_path("#{path_prefix}/S[0, 3]/S[2, 3]/L[2, 3]")
|
141
143
|
expected_first_child('integer[2, 3]')
|
142
144
|
|
143
145
|
next_event(:visit, 'L => . integer | 2') # Event 21
|
144
|
-
expected_curr_path(path_prefix
|
146
|
+
expected_curr_path("#{path_prefix}/S[0, 3]/S[2, 3]/L[2, 3]")
|
145
147
|
|
146
148
|
next_event(:visit, '.L | 2') # Event 22
|
147
149
|
expected_curr_parent('S[2, 3]')
|
148
|
-
expected_curr_path(path_prefix
|
150
|
+
expected_curr_path("#{path_prefix}/S[0, 3]/S[2, 3]")
|
149
151
|
|
150
152
|
next_event(:visit, 'S => . L | 2') # Event 23
|
151
|
-
expected_curr_path(path_prefix
|
153
|
+
expected_curr_path("#{path_prefix}/S[0, 3]/S[2, 3]")
|
152
154
|
|
153
155
|
next_event(:visit, '.S | 2') # Event 24
|
154
|
-
expected_curr_path(path_prefix
|
156
|
+
expected_curr_path("#{path_prefix}/S[0, 3]")
|
155
157
|
|
156
158
|
next_event(:visit, 'S => S + . S | 0') # Event 24
|
157
|
-
expected_curr_path(path_prefix
|
159
|
+
expected_curr_path("#{path_prefix}/S[0, 3]")
|
158
160
|
expected_first_child('+[1, 2]')
|
159
161
|
|
160
162
|
next_event(:visit, 'S => S . + S | 0') # Event 25
|
161
|
-
expected_curr_path(path_prefix
|
163
|
+
expected_curr_path("#{path_prefix}/S[0, 3]")
|
162
164
|
|
163
165
|
next_event(:visit, 'S. | 0') # Event 27
|
164
166
|
expected_curr_parent('S[0, 1]')
|
165
|
-
expected_curr_path(path_prefix
|
167
|
+
expected_curr_path("#{path_prefix}/S[0, 3]/S[0, 1]")
|
166
168
|
|
167
169
|
next_event(:visit, 'S => L . | 0') # Event 28
|
168
|
-
expected_curr_path(path_prefix
|
170
|
+
expected_curr_path("#{path_prefix}/S[0, 3]/S[0, 1]")
|
169
171
|
|
170
172
|
next_event(:visit, 'L. | 0') # Event 29
|
171
|
-
expected_curr_path(path_prefix
|
173
|
+
expected_curr_path("#{path_prefix}/S[0, 3]/S[0, 1]/L[0, 1]")
|
172
174
|
|
173
175
|
next_event(:visit, 'L => integer . | 0') # Event 30
|
174
|
-
expected_curr_path(path_prefix
|
176
|
+
expected_curr_path("#{path_prefix}/S[0, 3]/S[0, 1]/L[0, 1]")
|
175
177
|
expected_first_child('integer[0, 1]')
|
176
178
|
|
177
179
|
next_event(:visit, 'L => . integer | 0') # Event 31
|
178
|
-
expected_curr_path(path_prefix
|
180
|
+
expected_curr_path("#{path_prefix}/S[0, 3]/S[0, 1]/L[0, 1]")
|
179
181
|
|
180
182
|
next_event(:visit, '.L | 0') # Event 32
|
181
|
-
expected_curr_path(path_prefix
|
183
|
+
expected_curr_path("#{path_prefix}/S[0, 3]/S[0, 1]")
|
182
184
|
|
183
185
|
next_event(:visit, 'S => . L | 0') # Event 33
|
184
|
-
expected_curr_path(path_prefix
|
186
|
+
expected_curr_path("#{path_prefix}/S[0, 3]/S[0, 1]")
|
185
187
|
|
186
188
|
next_event(:visit, '.S | 0') # Event 34
|
187
|
-
expected_curr_path(path_prefix
|
189
|
+
expected_curr_path("#{path_prefix}/S[0, 3]")
|
188
190
|
|
189
191
|
next_event(:visit, 'S => . S + S | 0') # Event 35
|
190
|
-
expected_curr_path(path_prefix
|
192
|
+
expected_curr_path("#{path_prefix}/S[0, 3]")
|
191
193
|
|
192
194
|
next_event(:revisit, '.S | 0') # REVISIT Event 36
|
193
195
|
expected_curr_parent('Alt(S => S * S .)[0, 5]')
|
@@ -208,42 +210,42 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
208
210
|
next_event(:backtrack, 'S. | 0') # BACKTRACK Event 41
|
209
211
|
|
210
212
|
expected_curr_path('P[0, 5]/S[0, 5]')
|
211
|
-
|
213
|
+
|
212
214
|
next_event(:visit, 'S => S + S . | 0') # Event 42
|
213
215
|
expected_curr_parent('Alt(S => S + S .)[0, 5]')
|
214
216
|
path_prefix = 'P[0, 5]/S[0, 5]/Alt(S => S + S .)[0, 5]'
|
215
217
|
expected_curr_path(path_prefix)
|
216
218
|
|
217
219
|
next_event(:visit, 'S. | 2') # Event 43
|
218
|
-
expected_curr_path(path_prefix
|
220
|
+
expected_curr_path("#{path_prefix}/S[2, 5]")
|
219
221
|
|
220
222
|
next_event(:visit, 'S => S * S . | 2') # Event 44
|
221
|
-
expected_curr_path(path_prefix
|
222
|
-
|
223
|
+
expected_curr_path("#{path_prefix}/S[2, 5]")
|
224
|
+
|
223
225
|
# Up to now everything was running OK.
|
224
|
-
# Next steps are going wrong...
|
226
|
+
# Next steps are going wrong...
|
225
227
|
|
226
228
|
next_event(:revisit, 'S. | 4') # Event 45
|
227
|
-
expected_curr_path(path_prefix
|
229
|
+
expected_curr_path("#{path_prefix}/S[2, 5]")
|
228
230
|
expected_first_child('S[4, 5]')
|
229
|
-
|
231
|
+
|
230
232
|
next_event(:visit, 'S => S * . S | 2') # Event 46
|
231
|
-
expected_curr_path(path_prefix
|
233
|
+
expected_curr_path("#{path_prefix}/S[2, 5]")
|
232
234
|
expected_first_child('*[3, 4]')
|
233
235
|
|
234
236
|
next_event(:visit, 'S => S . * S | 2') # Event 47
|
235
|
-
expected_curr_path(path_prefix
|
236
|
-
|
237
|
+
expected_curr_path("#{path_prefix}/S[2, 5]")
|
238
|
+
|
237
239
|
next_event(:revisit, 'S. | 2') # Event 48
|
238
|
-
expected_curr_path(path_prefix
|
240
|
+
expected_curr_path("#{path_prefix}/S[2, 5]")
|
239
241
|
|
240
242
|
next_event(:visit, 'S => . S * S | 2') # Event 49
|
241
|
-
expected_curr_path(path_prefix
|
243
|
+
expected_curr_path("#{path_prefix}/S[2, 5]")
|
242
244
|
|
243
245
|
next_event(:revisit, '.S | 2') # Event 50
|
244
246
|
expected_curr_parent('Alt(S => S + S .)[0, 5]')
|
245
247
|
expected_curr_path(path_prefix)
|
246
|
-
|
248
|
+
|
247
249
|
# TODO: review previous and next steps...
|
248
250
|
|
249
251
|
next_event(:revisit, 'S => S + . S | 0') # Event 51
|
@@ -267,7 +269,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
267
269
|
expected_curr_path('P[0, 5]')
|
268
270
|
|
269
271
|
next_event(:revisit, '.P | 0') # Event 57
|
270
|
-
expected_curr_path('')
|
272
|
+
expected_curr_path('')
|
271
273
|
end
|
272
274
|
end # context
|
273
275
|
end # describe
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative '../../spec_helper'
|
2
4
|
|
3
5
|
require_relative '../../../lib/rley/parser/gfg_earley_parser'
|
@@ -10,16 +12,15 @@ require_relative '../support/expectation_helper'
|
|
10
12
|
require_relative '../support/grammar_b_expr_helper'
|
11
13
|
require_relative '../support/grammar_arr_int_helper'
|
12
14
|
|
13
|
-
|
14
15
|
module Rley # This module is used as a namespace
|
15
16
|
module ParseRep # This module is used as a namespace
|
16
17
|
ArrayNode = Struct.new(:children) do
|
17
|
-
def initialize
|
18
|
+
def initialize
|
18
19
|
super
|
19
20
|
self.children = []
|
20
21
|
end
|
21
22
|
|
22
|
-
def interpret
|
23
|
+
def interpret
|
23
24
|
return children.map(&:interpret)
|
24
25
|
end
|
25
26
|
end
|
@@ -31,17 +32,18 @@ module Rley # This module is used as a namespace
|
|
31
32
|
self.position = aPosition
|
32
33
|
end
|
33
34
|
|
34
|
-
def interpret
|
35
|
+
def interpret
|
35
36
|
value
|
36
37
|
end
|
37
38
|
end
|
38
39
|
|
40
|
+
# rubocop: disable Naming/VariableNumber
|
39
41
|
class ASTBuilder < ASTBaseBuilder
|
40
42
|
Terminal2NodeClass = {
|
41
43
|
'integer' => IntegerNode
|
42
44
|
}.freeze
|
43
45
|
|
44
|
-
def terminal2node
|
46
|
+
def terminal2node
|
45
47
|
Terminal2NodeClass
|
46
48
|
end
|
47
49
|
|
@@ -78,10 +80,10 @@ module Rley # This module is used as a namespace
|
|
78
80
|
return node
|
79
81
|
end
|
80
82
|
end # class
|
83
|
+
# rubocop: enable Naming/VariableNumber
|
81
84
|
end # module
|
82
85
|
end # module
|
83
86
|
|
84
|
-
|
85
87
|
module Rley # Open this namespace to avoid module qualifier prefixes
|
86
88
|
module ParseRep
|
87
89
|
describe ASTBuilder do
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative '../../spec_helper'
|
2
4
|
|
3
5
|
require_relative '../../../lib/rley/parser/gfg_earley_parser'
|
@@ -69,8 +71,8 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
69
71
|
end
|
70
72
|
end # context
|
71
73
|
|
72
|
-
|
73
|
-
|
74
|
+
|
75
|
+
|
74
76
|
context 'Parse tree construction (no null symbol):' do
|
75
77
|
before(:each) do
|
76
78
|
parser = Parser::GFGEarleyParser.new(sample_grammar)
|
@@ -117,7 +119,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
117
119
|
# Event: revisit .S | 0 0
|
118
120
|
# Event: visit P => . S | 0 0
|
119
121
|
# Event: visit .P | 0 0
|
120
|
-
|
122
|
+
|
121
123
|
it 'should react to a first end event' do
|
122
124
|
event = @walker.next
|
123
125
|
expect { subject.receive_event(*event) }.not_to raise_error
|
@@ -426,10 +428,10 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
426
428
|
next_event('visit P => . arr | 0 0')
|
427
429
|
expect(stack).to be_empty
|
428
430
|
expect(@instance.result).not_to be_nil
|
429
|
-
|
431
|
+
|
430
432
|
next_event('visit .P | 0 0')
|
431
433
|
expect(stack).to be_empty
|
432
|
-
expect(@instance.result).not_to be_nil
|
434
|
+
expect(@instance.result).not_to be_nil
|
433
435
|
end
|
434
436
|
end # context
|
435
437
|
end # describe
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Purpose: to test the parse forest generation for an emblematic
|
2
4
|
# ambiguous sentence
|
3
5
|
# Based on example found at: http://www.nltk.org/book_1ed/ch08.html
|
@@ -23,43 +25,41 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
23
25
|
builder = Rley::Syntax::GrammarBuilder.new do
|
24
26
|
add_terminals('N', 'V', 'Pro') # N(oun), V(erb), Pro(noun)
|
25
27
|
add_terminals('Det', 'P') # Det(erminer), P(reposition)
|
26
|
-
rule 'S' =>
|
27
|
-
rule 'NP' =>
|
28
|
-
rule 'NP' =>
|
28
|
+
rule 'S' => 'NP VP'
|
29
|
+
rule 'NP' => 'Det N'
|
30
|
+
rule 'NP' => 'Det N PP'
|
29
31
|
rule 'NP' => 'Pro'
|
30
|
-
rule 'VP' =>
|
31
|
-
rule 'VP' =>
|
32
|
-
rule 'PP' =>
|
32
|
+
rule 'VP' => 'V NP'
|
33
|
+
rule 'VP' => 'VP PP'
|
34
|
+
rule 'PP' => 'P NP'
|
33
35
|
end
|
34
36
|
builder.grammar
|
35
37
|
end
|
36
38
|
|
37
39
|
# The lexicon is just a Hash with pairs of the form:
|
38
40
|
# word => terminal symbol name
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
41
|
+
let(:groucho_lexicon) do
|
42
|
+
{
|
43
|
+
'elephant' => 'N',
|
44
|
+
'pajamas' => 'N',
|
45
|
+
'shot' => 'V',
|
46
|
+
'I' => 'Pro',
|
47
|
+
'an' => 'Det',
|
48
|
+
'my' => 'Det',
|
49
|
+
'in' => 'P'
|
50
|
+
}
|
51
|
+
end
|
48
52
|
|
49
53
|
# Highly simplified tokenizer implementation.
|
50
54
|
def tokenizer(aText, aGrammar)
|
51
55
|
pos = Rley::Lexical::Position.new(1, 2) # Dummy position
|
52
|
-
|
53
|
-
|
54
|
-
if
|
55
|
-
raise StandardError, "Word '#{word}' not found in lexicon"
|
56
|
-
end
|
56
|
+
aText.scan(/\S+/).map do |word|
|
57
|
+
term = groucho_lexicon[word]
|
58
|
+
raise StandardError, "Word '#{word}' not found in lexicon" if term.nil?
|
57
59
|
|
58
|
-
terminal = aGrammar.name2symbol[
|
60
|
+
terminal = aGrammar.name2symbol[term]
|
59
61
|
Rley::Lexical::Token.new(word, terminal, pos)
|
60
62
|
end
|
61
|
-
|
62
|
-
return tokens
|
63
63
|
end
|
64
64
|
|
65
65
|
let(:sentence_tokens) do
|
@@ -73,11 +73,11 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
73
73
|
end
|
74
74
|
|
75
75
|
# Emit a text representation of the current path.
|
76
|
-
def path_to_s
|
76
|
+
def path_to_s
|
77
77
|
text_parts = subject.curr_path.map do |path_element|
|
78
78
|
path_element.to_string(0)
|
79
79
|
end
|
80
|
-
|
80
|
+
text_parts.join('/')
|
81
81
|
end
|
82
82
|
|
83
83
|
def next_event(eventType, anEntryText)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative '../../spec_helper'
|
2
4
|
|
3
5
|
require_relative '../../../lib/rley/parser/gfg_earley_parser'
|
@@ -24,12 +26,12 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
24
26
|
builder = Syntax::GrammarBuilder.new do
|
25
27
|
add_terminals('a', 'b')
|
26
28
|
rule 'Phi' => 'S'
|
27
|
-
rule 'S' =>
|
28
|
-
rule 'S' =>
|
29
|
+
rule 'S' => 'A T'
|
30
|
+
rule 'S' => 'a T'
|
29
31
|
rule 'A' => 'a'
|
30
|
-
rule 'A' =>
|
32
|
+
rule 'A' => 'B A'
|
31
33
|
rule 'B' => []
|
32
|
-
rule 'T' =>
|
34
|
+
rule 'T' => 'b b b'
|
33
35
|
end
|
34
36
|
builder.grammar
|
35
37
|
end
|
@@ -46,11 +48,11 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
46
48
|
subject { ParseForestBuilder.new(sample_tokens) }
|
47
49
|
|
48
50
|
# Emit a text representation of the current path.
|
49
|
-
def path_to_s
|
51
|
+
def path_to_s
|
50
52
|
text_parts = subject.curr_path.map do |path_element|
|
51
53
|
path_element.to_string(0)
|
52
54
|
end
|
53
|
-
|
55
|
+
text_parts.join('/')
|
54
56
|
end
|
55
57
|
|
56
58
|
def next_event(eventType, anEntryText)
|
@@ -207,7 +209,7 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
207
209
|
path_prefix = 'Phi[0, 4]/S[0, 4]/Alt(S => A T .)[0, 4]/A[0, 1]/'
|
208
210
|
|
209
211
|
next_event(:visit, 'A => a . | 0') # Event 21
|
210
|
-
expected_curr_path(path_prefix
|
212
|
+
expected_curr_path("#{path_prefix}Alt(A => a .)[0, 1]")
|
211
213
|
expect(subject.curr_path[-2].refinement).to eq(:or)
|
212
214
|
|
213
215
|
next_event(:visit, 'A => . a | 0') # Event 22
|
@@ -242,24 +244,24 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
242
244
|
path_prefix = 'Phi[0, 4]/S[0, 4]/Alt(S => A T .)[0, 4]/A[0, 1]/'
|
243
245
|
|
244
246
|
next_event(:visit, 'A => B A . | 0') # Event 29
|
245
|
-
expected_curr_path(path_prefix
|
247
|
+
expected_curr_path("#{path_prefix}Alt(A => B A .)[0, 1]")
|
246
248
|
|
247
249
|
next_event(:revisit, 'A. | 0') # REVISIT Event 30
|
248
|
-
expected_curr_path(path_prefix
|
250
|
+
expected_curr_path("#{path_prefix}Alt(A => B A .)[0, 1]")
|
249
251
|
|
250
252
|
next_event(:visit, 'A => B . A | 0') # Event 31
|
251
|
-
expected_curr_path(path_prefix
|
253
|
+
expected_curr_path("#{path_prefix}Alt(A => B A .)[0, 1]")
|
252
254
|
|
253
255
|
next_event(:visit, 'B. | 0') # Event 32
|
254
|
-
expected_curr_path(path_prefix
|
256
|
+
expected_curr_path("#{path_prefix}Alt(A => B A .)[0, 1]/B[0, 0]")
|
255
257
|
|
256
258
|
# Entry with empty production!
|
257
259
|
next_event(:visit, 'B => . | 0') # Event 33
|
258
|
-
expected_curr_path(path_prefix
|
260
|
+
expected_curr_path("#{path_prefix}Alt(A => B A .)[0, 1]/B[0, 0]")
|
259
261
|
expected_first_child('_[0, 0]')
|
260
262
|
|
261
263
|
next_event(:visit, '.B | 0') # Event 34
|
262
|
-
expected_curr_path(path_prefix
|
264
|
+
expected_curr_path("#{path_prefix}Alt(A => B A .)[0, 1]")
|
263
265
|
|
264
266
|
next_event(:visit, 'A => . B A | 0') # Event 35
|
265
267
|
expected_curr_path('Phi[0, 4]/S[0, 4]/Alt(S => A T .)[0, 4]/A[0, 1]')
|
@@ -358,46 +360,46 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
358
360
|
next_event(:revisit, '.Nominal | 3') # REVISIT Event 15
|
359
361
|
expected_curr_path('S[0, 5]/VP[1, 5]/NP[2, 5]')
|
360
362
|
|
361
|
-
next_event(:visit, 'NP => Determiner . Nominal | 2') # Event 16
|
363
|
+
next_event(:visit, 'NP => Determiner . Nominal | 2') # Event 16
|
362
364
|
expected_curr_path('S[0, 5]/VP[1, 5]/NP[2, 5]')
|
363
365
|
expected_first_child('Determiner[2, 3]')
|
364
366
|
|
365
|
-
next_event(:visit, 'NP => . Determiner Nominal | 2') # Event 17
|
367
|
+
next_event(:visit, 'NP => . Determiner Nominal | 2') # Event 17
|
366
368
|
expected_curr_path('S[0, 5]/VP[1, 5]/NP[2, 5]')
|
367
369
|
|
368
|
-
next_event(:visit, '.NP | 2') # Event 18
|
370
|
+
next_event(:visit, '.NP | 2') # Event 18
|
369
371
|
expected_curr_path('S[0, 5]/VP[1, 5]')
|
370
372
|
|
371
|
-
next_event(:visit, 'VP => Verb . NP | 1') # Event 19
|
373
|
+
next_event(:visit, 'VP => Verb . NP | 1') # Event 19
|
372
374
|
expected_curr_path('S[0, 5]/VP[1, 5]')
|
373
375
|
expected_first_child('Verb[1, 2]')
|
374
376
|
|
375
|
-
next_event(:visit, 'VP => . Verb NP | 1') # Event 20
|
377
|
+
next_event(:visit, 'VP => . Verb NP | 1') # Event 20
|
376
378
|
expected_curr_path('S[0, 5]/VP[1, 5]')
|
377
379
|
|
378
|
-
next_event(:visit, '.VP | 1') # Event 21
|
380
|
+
next_event(:visit, '.VP | 1') # Event 21
|
379
381
|
expected_curr_path('S[0, 5]')
|
380
382
|
|
381
|
-
next_event(:visit, 'S => NP . VP | 0') # Event22
|
383
|
+
next_event(:visit, 'S => NP . VP | 0') # Event22
|
382
384
|
expected_curr_path('S[0, 5]')
|
383
385
|
|
384
|
-
next_event(:visit, 'NP. | 0') # Event 23
|
386
|
+
next_event(:visit, 'NP. | 0') # Event 23
|
385
387
|
expected_curr_path('S[0, 5]/NP[0, 1]')
|
386
388
|
|
387
|
-
next_event(:visit, 'NP => Pronoun . | 0') # Event 24
|
389
|
+
next_event(:visit, 'NP => Pronoun . | 0') # Event 24
|
388
390
|
expected_curr_path('S[0, 5]/NP[0, 1]')
|
389
391
|
expected_first_child('Pronoun[0, 1]')
|
390
392
|
|
391
|
-
next_event(:visit, 'NP => . Pronoun | 0') # Event 25
|
393
|
+
next_event(:visit, 'NP => . Pronoun | 0') # Event 25
|
392
394
|
expected_curr_path('S[0, 5]/NP[0, 1]')
|
393
395
|
|
394
|
-
next_event(:visit, '.NP | 0') # Event 26
|
396
|
+
next_event(:visit, '.NP | 0') # Event 26
|
395
397
|
expected_curr_path('S[0, 5]')
|
396
398
|
|
397
|
-
next_event(:visit, 'S => . NP VP | 0') # Event 27
|
399
|
+
next_event(:visit, 'S => . NP VP | 0') # Event 27
|
398
400
|
expected_curr_path('S[0, 5]')
|
399
401
|
|
400
|
-
next_event(:visit, '.S | 0') # Event28
|
402
|
+
next_event(:visit, '.S | 0') # Event28
|
401
403
|
expected_curr_path('')
|
402
404
|
end
|
403
405
|
end # context
|