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 +4 -4
- data/lib/grammaphone.rb +14 -4
- data/lib/grammaphone/tokens.rb +24 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d20b285443cbec1d2e058d0cefb9abf7fe5c2505393622dcab78af9d8a9ee6c3
|
4
|
+
data.tar.gz: b3bb5615dbb530129c88a2e7d6dd105329889a216673cb9811135cb1f9fef46a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32b1def2c467a1e65cffaa804f9a44c4b25a6c68b6ab351759e8a83ae5bb2553e99a989183a07ded0e309c863954ecf838a054abcecd5b96a95911328829f946
|
7
|
+
data.tar.gz: bf8c0745fa89f141347c9ac2d6c97af66b9797df01f533a520ae528daccb90b18a1faf9270f6c1c95006d917d9a163ede24dc6d30816a25064c21ebb913a31be
|
data/lib/grammaphone.rb
CHANGED
@@ -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
|
-
|
196
|
-
|
197
|
-
|
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
|
data/lib/grammaphone/tokens.rb
CHANGED
@@ -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
|