blob: 2b6f657d4b06e60032e84ac0f0d76c9d67c36bc7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
require "./parser.cr"
module Parcom
# `Peek` is a `Parser` that runs another `Parser` while
# leaving the input stream unmodified.
class Peek(T, V) < Parser(T, V)
# Accepts the parser to run.
def initialize(@p : Parser(T, V))
end
# Runs the parser it was initialized with, and returns
# that parser's result along with the original input.
#
# Re-raises a `ParserFail` exception if the other parser fails.
def parse(tokens : Tokens(T)) : Result(T, V)
result = @p.parse(tokens)
Result.new(tokens, result.value)
rescue ex : ParserFail
raise ParserFail.new("Peek: #{ex.message}")
end
end
end
|