rley 0.3.05 → 0.3.06
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 +1 -1
- data/CHANGELOG.md +8 -0
- data/Gemfile +1 -1
- data/lib/rley/constants.rb +1 -1
- data/lib/rley/parser/parse_walker_factory.rb +24 -7
- data/spec/rley/parser/ambiguous_parse_spec.rb +276 -0
- data/spec/rley/parser/parse_forest_builder_spec.rb +230 -526
- data/spec/rley/parser/parse_walker_factory_spec.rb +29 -17
- data/spec/rley/support/grammar_ambig01_helper.rb +41 -0
- metadata +5 -2
@@ -194,60 +194,72 @@ module Rley # Open this namespace to avoid module qualifier prefixes
|
|
194
194
|
event25 = walker.next
|
195
195
|
expectations = [:revisit, '.S | 0', 0]
|
196
196
|
event_expectations(event25, expectations)
|
197
|
-
|
197
|
+
|
198
198
|
event26 = walker.next
|
199
|
-
expectations = [:revisit, '
|
199
|
+
expectations = [:revisit, 'Phi => . S | 0', 0]
|
200
200
|
event_expectations(event26, expectations)
|
201
201
|
|
202
|
-
# Backtracking is occurring
|
203
202
|
event27 = walker.next
|
204
|
-
expectations = [:
|
203
|
+
expectations = [:revisit, '.Phi | 0', 0]
|
205
204
|
event_expectations(event27, expectations)
|
206
205
|
|
206
|
+
# Backtracking is occurring
|
207
207
|
event28 = walker.next
|
208
|
-
expectations = [:
|
208
|
+
expectations = [:backtrack, 'A. | 0', 1]
|
209
209
|
event_expectations(event28, expectations)
|
210
210
|
|
211
211
|
event29 = walker.next
|
212
|
-
expectations = [:
|
212
|
+
expectations = [:visit, 'A => B A . | 0', 1]
|
213
213
|
event_expectations(event29, expectations)
|
214
214
|
|
215
215
|
event30 = walker.next
|
216
|
-
expectations = [:
|
216
|
+
expectations = [:revisit, 'A. | 0', 1]
|
217
217
|
event_expectations(event30, expectations)
|
218
218
|
|
219
219
|
event31 = walker.next
|
220
|
-
expectations = [:visit, 'B. | 0', 0]
|
220
|
+
expectations = [:visit, 'A => B . A | 0', 0]
|
221
221
|
event_expectations(event31, expectations)
|
222
222
|
|
223
223
|
event32 = walker.next
|
224
|
-
expectations = [:visit, 'B
|
224
|
+
expectations = [:visit, 'B. | 0', 0]
|
225
225
|
event_expectations(event32, expectations)
|
226
226
|
|
227
227
|
event33 = walker.next
|
228
|
-
expectations = [:visit, '
|
228
|
+
expectations = [:visit, 'B => . | 0', 0]
|
229
229
|
event_expectations(event33, expectations)
|
230
230
|
|
231
231
|
event34 = walker.next
|
232
|
-
expectations = [:visit, '
|
232
|
+
expectations = [:visit, '.B | 0', 0]
|
233
233
|
event_expectations(event34, expectations)
|
234
|
-
|
234
|
+
|
235
235
|
event35 = walker.next
|
236
|
-
expectations = [:
|
236
|
+
expectations = [:visit, 'A => . B A | 0', 0]
|
237
237
|
event_expectations(event35, expectations)
|
238
|
-
|
238
|
+
|
239
239
|
event36 = walker.next
|
240
|
-
expectations = [:revisit, '.
|
240
|
+
expectations = [:revisit, '.A | 0', 0]
|
241
241
|
event_expectations(event36, expectations)
|
242
242
|
|
243
243
|
event37 = walker.next
|
244
|
-
expectations = [:revisit, '.
|
244
|
+
expectations = [:revisit, 'S => . A T | 0', 0]
|
245
245
|
event_expectations(event37, expectations)
|
246
|
+
|
247
|
+
event38 = walker.next
|
248
|
+
expectations = [:revisit, '.S | 0', 0]
|
249
|
+
event_expectations(event38, expectations)
|
250
|
+
|
251
|
+
event39 = walker.next
|
252
|
+
expectations = [:revisit, 'Phi => . S | 0', 0]
|
253
|
+
event_expectations(event39, expectations)
|
254
|
+
|
255
|
+
event40 = walker.next
|
256
|
+
expectations = [:revisit, '.Phi | 0', 0]
|
257
|
+
event_expectations(event40, expectations)
|
246
258
|
end
|
247
259
|
|
248
260
|
it 'should raise an exception at end of visit' do
|
249
261
|
walker = subject.build_walker(accept_entry, accept_index)
|
250
|
-
|
262
|
+
40.times { walker.next }
|
251
263
|
|
252
264
|
expect { walker.next }.to raise_error(StopIteration)
|
253
265
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Load the builder class
|
2
|
+
require_relative '../../../lib/rley/syntax/grammar_builder'
|
3
|
+
require_relative '../../../lib/rley/parser/token'
|
4
|
+
|
5
|
+
|
6
|
+
module GrammarAmbig01Helper
|
7
|
+
########################################
|
8
|
+
# Factory method. Define a grammar for a very simple language
|
9
|
+
# Grammar 3: An ambiguous arithmetic expression language
|
10
|
+
# (based on example in article on Earley's algorithm in Wikipedia)
|
11
|
+
def grammar_ambig01_builder()
|
12
|
+
builder = Rley::Syntax::GrammarBuilder.new
|
13
|
+
builder.add_terminals('integer', '+', '*')
|
14
|
+
builder.add_production('P' => 'S')
|
15
|
+
builder.add_production('S' => %w(S + S))
|
16
|
+
builder.add_production('S' => %w(S * S))
|
17
|
+
builder.add_production('S' => 'L')
|
18
|
+
builder.add_production('L' => 'integer')
|
19
|
+
builder
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
# Highly simplified tokenizer implementation.
|
24
|
+
def tokenizer_ambig01(aText, aGrammar)
|
25
|
+
tokens = aText.scan(/\S+/).map do |lexeme|
|
26
|
+
case lexeme
|
27
|
+
when '+', '*'
|
28
|
+
terminal = aGrammar.name2symbol[lexeme]
|
29
|
+
when /^[-+]?\d+$/
|
30
|
+
terminal = aGrammar.name2symbol['integer']
|
31
|
+
else
|
32
|
+
msg = "Unknown input text '#{lexeme}'"
|
33
|
+
raise StandardError, msg
|
34
|
+
end
|
35
|
+
Rley::Parser::Token.new(lexeme, terminal)
|
36
|
+
end
|
37
|
+
|
38
|
+
return tokens
|
39
|
+
end
|
40
|
+
end # module
|
41
|
+
# End of file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rley
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.06
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dimitri Geshef
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-11-
|
11
|
+
date: 2016-11-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -225,6 +225,7 @@ files:
|
|
225
225
|
- spec/rley/gfg/vertex_spec.rb
|
226
226
|
- spec/rley/parse_forest_visitor_spec.rb
|
227
227
|
- spec/rley/parse_tree_visitor_spec.rb
|
228
|
+
- spec/rley/parser/ambiguous_parse_spec.rb
|
228
229
|
- spec/rley/parser/chart_spec.rb
|
229
230
|
- spec/rley/parser/dotted_item_spec.rb
|
230
231
|
- spec/rley/parser/earley_parser_spec.rb
|
@@ -253,6 +254,7 @@ files:
|
|
253
254
|
- spec/rley/support/ambiguous_grammar_helper.rb
|
254
255
|
- spec/rley/support/expectation_helper.rb
|
255
256
|
- spec/rley/support/grammar_abc_helper.rb
|
257
|
+
- spec/rley/support/grammar_ambig01_helper.rb
|
256
258
|
- spec/rley/support/grammar_b_expr_helper.rb
|
257
259
|
- spec/rley/support/grammar_helper.rb
|
258
260
|
- spec/rley/support/grammar_l0_helper.rb
|
@@ -310,6 +312,7 @@ test_files:
|
|
310
312
|
- spec/rley/gfg/shortcut_edge_spec.rb
|
311
313
|
- spec/rley/gfg/start_vertex_spec.rb
|
312
314
|
- spec/rley/gfg/vertex_spec.rb
|
315
|
+
- spec/rley/parser/ambiguous_parse_spec.rb
|
313
316
|
- spec/rley/parser/chart_spec.rb
|
314
317
|
- spec/rley/parser/dotted_item_spec.rb
|
315
318
|
- spec/rley/parser/earley_parser_spec.rb
|