rley 0.3.07 → 0.3.08
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/lib/rley/constants.rb +1 -1
- data/lib/rley/parser/parse_forest_builder.rb +70 -29
- data/lib/rley/parser/parse_walker_factory.rb +10 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38c77acd3a3831519aa9511c02ab2aaa7f99c962
|
4
|
+
data.tar.gz: bd84fe47221a72d195a92e40e8c5a62fafed562b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a36a172143025e47b03022dc2db7be6bcb990b21834ea51288afe9158c3fe97eaafce70cbcd36ea64841da03036a0e98e446454b4e6f8e2170e60e9fa2c0697
|
7
|
+
data.tar.gz: 716aa238f7f40e07118b11eb3d7c38c5a3f2cc8583c516818d1d5bcb11267a7c52b7849e049de4ecf93729f23746b1569adfbdd1d297947e787f9c82a5a0b94e
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
### 0.3.08 / 2016-11-17
|
2
|
+
* [FIX] Method `ParseWalkerFactory#select_antecedent` did not support alternative nodes creation when visiting an item entry for highly ambiguous parse.
|
3
|
+
* [FIX] Method `ParseWalkerFactory#select_antecedent` did not manage properly call/return stack for alternative nodes created when visiting an item entry for highly ambiguous parse.
|
4
|
+
|
5
|
+
|
1
6
|
### 0.3.07 / 2016-11-08
|
2
7
|
* [FIX] The sharing a of forest node could be repeated in a production in a revisit event.
|
3
8
|
* [CHANGE] Method `ParseWalkerFactory#process_end_entry`. Added a guard condition to avoid repeated node sharing
|
data/lib/rley/constants.rb
CHANGED
@@ -82,7 +82,7 @@ module Rley # This module is used as a namespace
|
|
82
82
|
when :backtrack
|
83
83
|
# Restore path
|
84
84
|
@curr_path = entry2path_to_alt[anEntry].dup
|
85
|
-
# puts "Restore path #{curr_path.join(', ')}]"
|
85
|
+
# puts "Restore path [#{curr_path.map{|e|e.to_string(0)}.join(', ')}]"
|
86
86
|
antecedent_index = curr_parent.subnodes.size
|
87
87
|
# puts "Current parent #{curr_parent.to_string(0)}"
|
88
88
|
# puts "Antecedent index #{antecedent_index}"
|
@@ -103,35 +103,76 @@ module Rley # This module is used as a namespace
|
|
103
103
|
end
|
104
104
|
|
105
105
|
|
106
|
-
def process_item_entry(
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
# Retrieve the grammar symbol before the dot (if any)
|
122
|
-
prev_symbol = anEntry.prev_symbol
|
123
|
-
case prev_symbol
|
124
|
-
when Syntax::Terminal
|
125
|
-
# Add node without changing current path
|
126
|
-
create_token_node(anEntry, anIndex)
|
127
|
-
|
128
|
-
when NilClass # Dot at the beginning of production
|
129
|
-
if anEntry.vertex.dotted_item.production.empty?
|
130
|
-
# Empty rhs => create an epsilon node ...
|
131
|
-
# ... without changing current path
|
132
|
-
create_epsilon_node(anEntry, anIndex)
|
106
|
+
def process_item_entry(anEvent, anEntry, anIndex)
|
107
|
+
case anEvent
|
108
|
+
when :visit
|
109
|
+
if anEntry.exit_entry?
|
110
|
+
# Previous entry was an end entry (X. pattern)
|
111
|
+
# Does the previous entry have multiple antecedent?
|
112
|
+
if last_visitee.end_entry? && last_visitee.antecedents.size > 1
|
113
|
+
# Store current path for later backtracking
|
114
|
+
# puts "Store backtrack context #{last_visitee}"
|
115
|
+
# puts "path [#{curr_path.map{|e|e.to_string(0)}.join(', ')}]"
|
116
|
+
entry2path_to_alt[last_visitee] = curr_path.dup
|
117
|
+
curr_parent.refinement = :or
|
118
|
+
|
119
|
+
create_alternative_node(anEntry)
|
120
|
+
end
|
133
121
|
end
|
134
|
-
|
122
|
+
|
123
|
+
# Does this entry have multiple antecedent?
|
124
|
+
if anEntry.antecedents.size > 1
|
125
|
+
# Store current path for later backtracking
|
126
|
+
# puts "Store backtrack context #{anEntry}"
|
127
|
+
# puts "path [#{curr_path.map{|e|e.to_string(0)}.join(', ')}]"
|
128
|
+
entry2path_to_alt[anEntry] = curr_path.dup
|
129
|
+
# curr_parent.refinement = :or
|
130
|
+
|
131
|
+
create_alternative_node(anEntry)
|
132
|
+
end
|
133
|
+
|
134
|
+
# Retrieve the grammar symbol before the dot (if any)
|
135
|
+
prev_symbol = anEntry.prev_symbol
|
136
|
+
case prev_symbol
|
137
|
+
when Syntax::Terminal
|
138
|
+
# Add node without changing current path
|
139
|
+
create_token_node(anEntry, anIndex)
|
140
|
+
|
141
|
+
when NilClass # Dot at the beginning of production
|
142
|
+
if anEntry.vertex.dotted_item.production.empty?
|
143
|
+
# Empty rhs => create an epsilon node ...
|
144
|
+
# ... without changing current path
|
145
|
+
create_epsilon_node(anEntry, anIndex)
|
146
|
+
end
|
147
|
+
curr_path.pop if curr_parent.kind_of?(SPPF::AlternativeNode)
|
148
|
+
end
|
149
|
+
|
150
|
+
when :backtrack
|
151
|
+
# Restore path
|
152
|
+
@curr_path = entry2path_to_alt[anEntry].dup
|
153
|
+
# puts "Special restore path [#{curr_path.map{|e|e.to_string(0)}.join(', ')}]"
|
154
|
+
antecedent_index = curr_parent.subnodes.size
|
155
|
+
# puts "Current parent #{curr_parent.to_string(0)}"
|
156
|
+
# puts "Antecedent index #{antecedent_index}"
|
157
|
+
|
158
|
+
create_alternative_node(anEntry)
|
159
|
+
|
160
|
+
when :revisit
|
161
|
+
# Retrieve the grammar symbol before the dot (if any)
|
162
|
+
prev_symbol = anEntry.prev_symbol
|
163
|
+
case prev_symbol
|
164
|
+
when Syntax::Terminal
|
165
|
+
# Add node without changing current path
|
166
|
+
create_token_node(anEntry, anIndex)
|
167
|
+
|
168
|
+
when NilClass # Dot at the beginning of production
|
169
|
+
if anEntry.vertex.dotted_item.production.empty?
|
170
|
+
# Empty rhs => create an epsilon node ...
|
171
|
+
# ... without changing current path
|
172
|
+
create_epsilon_node(anEntry, anIndex)
|
173
|
+
end
|
174
|
+
curr_path.pop if curr_parent.kind_of?(SPPF::AlternativeNode)
|
175
|
+
end
|
135
176
|
end
|
136
177
|
end
|
137
178
|
|
@@ -168,6 +168,7 @@ module Rley # This module is used as a namespace
|
|
168
168
|
aContext.return_stack << aContext.curr_entry
|
169
169
|
elsif traversed_edge.kind_of?(GFG::CallEdge)
|
170
170
|
# Pop top of stack
|
171
|
+
fail ScriptError, "Return stack empty!" if aContext.return_stack.empty?
|
171
172
|
aContext.return_stack.pop
|
172
173
|
# puts "Pop from return stack matching entry #{new_entry}"
|
173
174
|
elsif traversed_edge.kind_of?(GFG::ScanEdge)
|
@@ -187,13 +188,19 @@ module Rley # This module is used as a namespace
|
|
187
188
|
case aContext.curr_entry.vertex
|
188
189
|
when GFG::EndVertex
|
189
190
|
# puts "Add backtrack point stack #{aContext.curr_entry}"
|
190
|
-
# An end vertex with multiple antecedents requires
|
191
|
-
# a backtrack point for a correct graph traversal
|
192
191
|
bp = add_backtrack_point(aContext)
|
193
192
|
new_entry = bp.visitee.antecedents[bp.antecedent_index]
|
194
193
|
|
195
194
|
when GFG::StartVertex
|
196
195
|
new_entry = select_calling_entry(aContext)
|
196
|
+
|
197
|
+
when GFG::ItemVertex
|
198
|
+
# Push current entry onto stack
|
199
|
+
# puts "Special push on return stack #{aContext.curr_entry}"
|
200
|
+
aContext.return_stack << aContext.curr_entry
|
201
|
+
# puts "Add special backtrack point stack #{aContext.curr_entry}"
|
202
|
+
bp = add_backtrack_point(aContext)
|
203
|
+
new_entry = bp.visitee.antecedents[bp.antecedent_index]
|
197
204
|
else
|
198
205
|
raise StandardError, 'Internal error'
|
199
206
|
end
|
@@ -239,6 +246,7 @@ module Rley # This module is used as a namespace
|
|
239
246
|
# Observation: calling parse entry is an parse entry linked
|
240
247
|
# to a item vertex
|
241
248
|
def select_calling_entry(aContext)
|
249
|
+
fail ScriptError, "Empty return stack" if aContext.return_stack.empty?
|
242
250
|
# Retrieve top of stack
|
243
251
|
tos = aContext.return_stack.pop
|
244
252
|
tos_dotted_item = tos.vertex.dotted_item
|
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.08
|
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-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|