diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/parcom/parser.cr | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/parcom/parser.cr b/src/parcom/parser.cr index 0b09e95..95a2e21 100644 --- a/src/parcom/parser.cr +++ b/src/parcom/parser.cr @@ -112,6 +112,27 @@ module Parcom Parser(T, T).sequence(ps).named("Token Sequence: #{ts}") end + # TODO: Allow support for Iterable(Parser(T, U)) + def self.first_of(ps : Array(Parser(T, U))) : Parser(T, U) + if ps.empty? + raise ArgumentError.new("first_of requires at least one parser") + end + + Parser(T, U).new("First of: #{ps.map(&.name)}") do |tokens| + result = nil + ps.each do |p| + break unless result.nil? + result = result || p.parse?(tokens) + end + + if result.nil? + raise ParserFail.new("No successes from any provided parsers.") + else + result + end + end + end + # Creates a new parser from a `Proc`. # The `Proc` should have the properties outlined above. def initialize(@name : String, @f : Tokens(T) -> Result(T, U)) |
