A bug in 'many': coffeescript's automatic accumulator isn't fun with try/catch blocks.
This commit is contained in:
parent
7339526d15
commit
c6aa50fc11
|
@ -61,6 +61,25 @@ exports.ReParse = class ReParse
|
|||
throw err if err isnt @fail
|
||||
throw new Error("Could not parse '" + @input + "'.")
|
||||
|
||||
# The core: Match a regular expression against the input,
|
||||
# returning the first captured group. If no group is captured,
|
||||
# return the matched string. This can result in surprises, if you
|
||||
# don't wrap your groups exactly right, which is common in ()?
|
||||
# regexps. Note that this is where the input consumption happens:
|
||||
# upon a match, the input is reduced to whatever did not match.
|
||||
#
|
||||
# Note that as the tree of productions is followed, backups of
|
||||
# existing input are kept and restored when a possible parse
|
||||
# fails. If your source is very large, this can become
|
||||
# problematic in both time and space.
|
||||
#
|
||||
# Note that the `return fail()` call eventually leads to a throw.
|
||||
|
||||
match: (pattern) =>
|
||||
probe = @input.match pattern
|
||||
return @fail() unless probe
|
||||
@input = @input.substr probe[0].length
|
||||
if probe[1] is `undefined` then probe[0] else probe[1]
|
||||
|
||||
# Attempts to apply the method and produce a value. If it fails,
|
||||
# restores the input to the previous state.
|
||||
|
@ -100,23 +119,6 @@ exports.ReParse = class ReParse
|
|||
throw err if err isnt @fail
|
||||
@fail input
|
||||
|
||||
# Match a regular expression against the input, returning the
|
||||
# first captured group. If no group is captured, return the
|
||||
# matched string. This can result in surprises, if you don't wrap
|
||||
# your groups exactly right, which is common in ()? regexps. Note
|
||||
# that this is where the input consumption happens: upon a match,
|
||||
# the input is reduced to whatever did not match. (Note that as
|
||||
# the tree of productions is followed, backups of existing input
|
||||
# are kept and restored when a possible parse fails. If your
|
||||
# source is very large, this can become problematic in both time
|
||||
# and space.)
|
||||
|
||||
match: (pattern) =>
|
||||
probe = @input.match pattern
|
||||
return @fail() unless probe
|
||||
@input = @input.substr probe[0].length
|
||||
if probe[1] is `undefined` then probe[0] else probe[1]
|
||||
|
||||
# Returns the first production among arguments for which the
|
||||
# production does not fail.
|
||||
|
||||
|
@ -186,9 +188,10 @@ exports.ReParse = class ReParse
|
|||
|
||||
many: (method, min = null) =>
|
||||
input = @input
|
||||
result = until @eof()
|
||||
result = []
|
||||
until @eof()
|
||||
try
|
||||
@maybe(method)
|
||||
result.push @maybe method
|
||||
catch err
|
||||
throw err if err isnt @fail
|
||||
break
|
||||
|
|
Loading…
Reference in New Issue