rley 0.6.04 → 0.6.05

Sign up to get free protection for your applications and to get access to all the features.
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