require "./satisfy" module Parcom # `Token` is a `Parser` that tries to parse a specific token # from the input stream. class Token(T) < Parser(T, T) # Accepts the token that this parser will try to parse. def initialize(@expected : T) @p = Satisfy(T).new { |x| x == @expected } end # Tries to parse the specified token from the input stream. def parse(tokens : Tokens(T)) : Result(T, T) @p.parse(tokens) rescue ex : ParserFail raise ParserFail.new("Token <#{@expected}>: #{ex.message}") end end end