Skip to content

Instantly share code, notes, and snippets.

@teliosdev
Last active August 29, 2015 14:04
Show Gist options
  • Save teliosdev/643a270bf291f1b41b57 to your computer and use it in GitHub Desktop.
Save teliosdev/643a270bf291f1b41b57 to your computer and use it in GitHub Desktop.
module Liquidscript
class Parser
module PredictMatch
# Makes a prediction based on a set of actions. If the peek token
# doesn't have an action, it will try the special action `:_`, and
# then give up. If it finds a corresponding action either time, it
# will run the action.
#
# @param actions [Hash<Symbol => Symbol>]
# @return [Object] the result of the compiliation.
def predict(*params, actions)
action = actions.fetch(peek) do
actions.fetch(:_)
end
if action.respond_to?(:call)
action.call(*params)
else
send(:"compile_#{action}", *params)
end
end
# Matches the next token of the input. If it is not of the
# expected type, it raises a SyntaxError. Otherwise, it returns
# the token.
#
# @param name [Symbol] the token to match.
# @return [Array] the token.
# @raise SyntaxError if the peeked token is invalid.
def match(name)
if name == peek
input.next
else
raise SyntaxError, "Unexpected token #{peek}"
end
end
# Returns the type of the next token.
#
# @return [Symbol] the type of the next token.
def peek
input.peek[0]
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment