grammaphone 0.1.1 → 0.2.0

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
  SHA256:
3
- metadata.gz: e243f173f31ceddb840bd5e1c166f2f5aae6574e79f44bcc8edab86f397e6b6e
4
- data.tar.gz: 2c3a92d6ecfcccf67b8f3330bceae184df8a64dc4b1a0f3765085f69d57abf51
3
+ metadata.gz: d20b285443cbec1d2e058d0cefb9abf7fe5c2505393622dcab78af9d8a9ee6c3
4
+ data.tar.gz: b3bb5615dbb530129c88a2e7d6dd105329889a216673cb9811135cb1f9fef46a
5
5
  SHA512:
6
- metadata.gz: 867e6191b314ea4a1c1bda97c053fc910ddb44fcea1d8dc24248307676277298066d40390741a48f8337a457283cf84baf92d4a67e03c30e5d90cb7fdbb964e2
7
- data.tar.gz: 5fac8bfa0ec133c8fdc1e94cb9d673dd11a902487de46bb941262e33bdc6cd4475e15f4fa03947bf3a2a039eed01cef5c832f29131652a7af022ec7c12fd87d0
6
+ metadata.gz: 32b1def2c467a1e65cffaa804f9a44c4b25a6c68b6ab351759e8a83ae5bb2553e99a989183a07ded0e309c863954ecf838a054abcecd5b96a95911328829f946
7
+ data.tar.gz: bf8c0745fa89f141347c9ac2d6c97af66b9797df01f533a520ae528daccb90b18a1faf9270f6c1c95006d917d9a163ede24dc6d30816a25064c21ebb913a31be
@@ -184,7 +184,7 @@ class Grammaphone
184
184
  matches << token
185
185
  result << token
186
186
  tokens.next # might as well be tokens.skip
187
- elsif Token.pattern?(element)
187
+ elsif Token.pattern?(element) # only matches empty tokens at the end
188
188
  unless Token.matches_pattern?(element, token)
189
189
  matches = nil
190
190
  matched = false
@@ -192,10 +192,19 @@ class Grammaphone
192
192
  end
193
193
 
194
194
  matches ||= []
195
- unless token.nil?
196
- matches << token
197
- result << token
195
+ matches << token
196
+ result << token unless token.nil?
197
+ tokens.next
198
+ elsif Token.backref?(element) # exists but buggy as hell
199
+ unless Token.matches_backref?(element, token, matches)
200
+ matches = nil
201
+ matched = false
202
+ break
198
203
  end
204
+
205
+ matches ||= []
206
+ matches << token
207
+ result << token unless token.nil?
199
208
  tokens.next
200
209
  else
201
210
  raise TokenError.new("Can't have empty patterns") if element.empty?
@@ -214,6 +223,7 @@ class Grammaphone
214
223
  end
215
224
  end
216
225
 
226
+ matches&.keep_if {|m| !m.nil?}
217
227
  if matched
218
228
  result = r.trigger(result)
219
229
  break
@@ -170,5 +170,29 @@ class Grammaphone
170
170
  pattern?(element) && (token =~ clean_pattern(element)) ||
171
171
  token.nil? && "" =~ clean_pattern(element)
172
172
  end
173
+
174
+ # Checks if an element expects a backreference. A backreference is prefixed
175
+ # by an equals sign ("=")
176
+ def self.backref?(element)
177
+ element[0] == "="
178
+ end
179
+
180
+ # Removes the denotative marks of a backreference, and returns a literal
181
+ # token that references a previous element referenced. The token is the
182
+ # exact token matched, regardless of if the original element was a literal
183
+ # or pattern.
184
+ def self.clean_backref(element, matches)
185
+ matches[element[1..].to_i - 1]
186
+ end
187
+
188
+ # Returns whether the token is described by the element and that the
189
+ # element is a backreference. A token is described by a backreference if
190
+ # it matches the element at the 1-indexed position exactly.
191
+ #
192
+ # A backreference cannot describe a rule, even if that rule describes 1 or
193
+ # fewer tokens.
194
+ def self.matches_backref?(element, token, matches)
195
+ !token.nil? && backref?(element) && token == clean_backref(element, matches)
196
+ end
173
197
  end
174
198
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grammaphone
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kellen Watt