rley 0.6.04 → 0.6.05

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7dde019f49699000c53d19d500ccf1e5497ab155
4
- data.tar.gz: 967a24d5da4566776c5d011971801aec07e0dbc8
3
+ metadata.gz: 3083af262074f545ce6cdb9afed83c0d8a5cd255
4
+ data.tar.gz: d99c85423dde12c232681524dc9f8692bbd1d0ce
5
5
  SHA512:
6
- metadata.gz: 6415d986dd8296c28f7af9d32b8329a03c8861386830eb915ffa196de311848420cd35a171d661a7ce68948d428b224f1a8c2f009aa2b734477eecb9bf32a679
7
- data.tar.gz: a0453cd6917b6658d549053216cfb9134ec5dc3e7de7e6cf0e2f3240502532077897264d456be748c7bdd8a5adeb9104f266b8004f7d19fef0e9fe9db3ade1c9
6
+ metadata.gz: 27b474bb46b84aad4cfa74f72cdadc4d7da99bb0a80e5d6f8e4176716a6297a5be9495adac0202f2c5791ddbeb728ef7a35a5f0dd0e22504cb3d934c2d4446c9
7
+ data.tar.gz: 296215d53be774b54bff3b1b4ee316afab8ea86282d507cb72fac36f55b810c694e45554b2758a4b18c9008cb75030147129b20b730ce1b8cd1077ff582438df
@@ -1,3 +1,8 @@
1
+ ### 0.6.05 / 2018-04-02
2
+ * [CHANGE] Method `ParseTreeBuilder#process_end_entry`: added an explicit message in case of ambiguous parse.
3
+ * [CHANGE] Method `ParseTreeBuilder#process_item_entry`: added an explicit message in case of ambiguous parse.
4
+ * [FIX] Method `ParseEntry#add_antecedent` now checks for the unicity of antecedent entries.
5
+
1
6
  ### 0.6.04 / 2018-03-30
2
7
  * [CHANGE] Method `GrammarBuilder#add_production` Simplified rule entry syntax
3
8
  * [CHANGE] File `examples/NML/pico_en_demo.rb` updated to reflect the simplified rule syntax.
@@ -3,7 +3,7 @@
3
3
 
4
4
  module Rley # Module used as a namespace
5
5
  # The version number of the gem.
6
- Version = '0.6.04'.freeze
6
+ Version = '0.6.05'.freeze
7
7
 
8
8
  # Brief description of the gem.
9
9
  Description = "Ruby implementation of the Earley's parsing algorithm".freeze
@@ -61,7 +61,10 @@ module Rley # This module is used as a namespace
61
61
  end
62
62
  parser = build_parser(grammar)
63
63
  parser.gf_graph.diagnose if configuration.diagnose
64
- return parser.parse(tokens)
64
+ result = parser.parse(tokens)
65
+ result.tidy_up!
66
+
67
+ return result
65
68
  end
66
69
 
67
70
  # Convert raw parse result into a more convenient representation
@@ -101,8 +101,11 @@ module Rley # This module is used as a namespace
101
101
  non_terminal = entry2nonterm(anEntry)
102
102
  # Create raw node and push onto stack
103
103
  push_raw_node(range, non_terminal)
104
- # when :revisit
105
- # # TODO: design specification
104
+
105
+ when :backtrack
106
+ msg_prefix = 'Ambiguous parse detected at '
107
+ msg_suffix = "entry: #{anEntry}, index: #{anIndex}"
108
+ raise StandardError, msg_prefix + msg_suffix
106
109
  else
107
110
  raise NotImplementedError, "Cannot handle event #{anEvent}"
108
111
  end
@@ -135,10 +138,14 @@ module Rley # This module is used as a namespace
135
138
  # (pattern: N => alpha+ . beta+)
136
139
  process_middle_entry(anEntry, anIndex)
137
140
  end
141
+ when :backtrack
142
+ msg_prefix = 'Ambiguous parse detected at '
143
+ msg_suffix = "entry: #{anEntry}, index: #{anIndex}"
144
+ raise StandardError, msg_prefix + msg_suffix
138
145
  else
139
146
  msg_prefix = "Internal Error '#{anEvent}', "
140
- $stderr.puts msg_prefix + "entry: #{anEntry}, index: #{anIndex}"
141
- raise NotImplementedError
147
+ msg_suffix = "entry: #{anEntry}, index: #{anIndex}"
148
+ raise NotImplementedError, msg_prefix + msg_suffix
142
149
  end
143
150
  end
144
151
 
@@ -78,7 +78,6 @@ module Rley # This module is used as a namespace
78
78
  start_entry = apply_rule(anEntry, start, pos, pos, :nullable_rule)
79
79
 
80
80
  end_vertex = gf_graph.end_vertex_for[next_symbol]
81
- end_entry = push_entry(end_vertex, pos, pos, :nullable_rule)
82
81
 
83
82
  start.edges.each do |edge|
84
83
  succ = edge.successor # succ always an ItemVertex
@@ -89,6 +88,7 @@ module Rley # This module is used as a namespace
89
88
 
90
89
  curr_vertex = anEntry.vertex
91
90
  next_vertex = curr_vertex.shortcut.successor
91
+ end_entry = push_entry(end_vertex, pos, pos, :nullable_rule)
92
92
  apply_rule(end_entry, next_vertex, anEntry.origin, pos, :nullable_rule)
93
93
  end
94
94
 
@@ -190,7 +190,7 @@ module Rley # This module is used as a namespace
190
190
  def parse_forest()
191
191
  msg = <<-END_MSG
192
192
  Method Rley::Parser::GFGParsing.parse_forest is deprecated, call
193
- Rley::Engine::to_pforest. It will be removed April 1st
193
+ Rley::Engine::to_pforest. It will be removed June 1st
194
194
  or version 0.6.1 (whichever is first)
195
195
  END_MSG
196
196
  # warn(msg)
@@ -240,6 +240,15 @@ END_MSG
240
240
  premature_end unless success? || failure_reason
241
241
  end
242
242
 
243
+ # Clean and normalize the object.
244
+ # Call this method when the parsing is complete.
245
+ def tidy_up!()
246
+ antecedence.each_key do |entry|
247
+ antecedence[entry].uniq!
248
+ end
249
+ end
250
+
251
+
243
252
  private
244
253
 
245
254
  # Parse error detected: all input tokens were consumed and
@@ -266,8 +275,42 @@ END_MSG
266
275
 
267
276
  def apply_rule(antecedentEntry, aVertex, anOrigin, aPosition, aRuleId)
268
277
  consequent = push_entry(aVertex, anOrigin, aPosition, aRuleId)
278
+
269
279
  antecedence[consequent] << antecedentEntry
280
+
281
+ # Invariant checks
282
+ antecedents = antecedence[consequent]
283
+ case aVertex
284
+ when Rley::GFG::EndVertex
285
+ # Rule: has 1..* antecedents, all of them are exit items
286
+ antecedents.each do |antec|
287
+ next if antec.exit_entry?
288
+ msg_prefix = "Parse entry #{consequent}"
289
+ msg_suffix = " has for antecedent #{antec}"
290
+ raise StandardError, msg_prefix + msg_suffix
291
+ end
292
+
293
+ when Rley::GFG::ItemVertex
294
+ # Rule: has exactly one antecedent
295
+ # if antecedents.size > 1
296
+ # msg_prefix = "Parse entry #{consequent} | #{aPosition}"
297
+ # msg = " has more than one antecedent:\n"
298
+ # msg_suffix = antecedents.map(&:to_s).join("\n")
299
+ # raise(StandardError, msg_prefix + msg + msg_suffix)
300
+ # end
301
+
302
+ when Rley::GFG::StartVertex
303
+ # Rule: has 0..* antecedents, all of them are item vertices but not exit items
304
+ antecedents.each do |antec|
305
+ next if antec.dotted_entry? && !antec.end_entry?
306
+ msg_prefix = "Parse entry #{consequent}"
307
+ msg_suffix = " has for antecedent #{antec}"
308
+ raise StandardError, msg_prefix + msg_suffix
309
+ end
310
+ end
311
+
270
312
  consequent.add_antecedent(antecedentEntry)
313
+ return consequent
271
314
  end
272
315
 
273
316
  # Push a parse entry (vertex + origin) to the
@@ -43,7 +43,7 @@ module Rley # This module is used as a namespace
43
43
 
44
44
  # Add a link to an antecedent parse entry
45
45
  def add_antecedent(anAntecedent)
46
- antecedents << anAntecedent
46
+ antecedents << anAntecedent unless antecedents.include?(anAntecedent)
47
47
  end
48
48
 
49
49
  # Equality comparison. A parse entry behaves as a value object.
@@ -254,7 +254,7 @@ SNIPPET
254
254
  end_entry = subject.chart[1].last
255
255
  expect(end_entry.vertex.label).to eq('S => A .')
256
256
  expect(end_entry.origin).to eq(0)
257
- expect(subject.antecedence.fetch(end_entry)).to eq([exit_entry])
257
+ expect(subject.antecedence.fetch(end_entry)).to eq([exit_entry])
258
258
  end
259
259
  =begin
260
260
 
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.6.04
4
+ version: 0.6.05
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dimitri Geshef
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-30 00:00:00.000000000 Z
11
+ date: 2018-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: coveralls