From 307800a3e53ea587b3d544b3044be9f2b4b9f323 Mon Sep 17 00:00:00 2001 From: Gears JS Date: Mon, 13 Feb 2023 11:51:45 +0000 Subject: [PATCH] feat: Add coroutine parser --- Gemfile.lock | 38 +++++++++++++++++++------------------- lib/parsby.rb | 4 ++++ lib/parsby/combinators.rb | 13 +++++++++++++ parsby.gemspec | 2 +- 4 files changed, 37 insertions(+), 20 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 87400e7..ff34371 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,41 +1,41 @@ PATH remote: . specs: - parsby (1.0.0) + parsby (1.1.1) GEM remote: https://rubygems.org/ specs: - coderay (1.1.2) - diff-lcs (1.3) + coderay (1.1.3) + diff-lcs (1.5.0) method_source (1.0.0) - pry (0.13.1) + pry (0.14.2) coderay (~> 1.1) method_source (~> 1.0) rake (10.5.0) - rspec (3.9.0) - rspec-core (~> 3.9.0) - rspec-expectations (~> 3.9.0) - rspec-mocks (~> 3.9.0) - rspec-core (3.9.2) - rspec-support (~> 3.9.3) - rspec-expectations (3.9.2) + rspec (3.12.0) + rspec-core (~> 3.12.0) + rspec-expectations (~> 3.12.0) + rspec-mocks (~> 3.12.0) + rspec-core (3.12.1) + rspec-support (~> 3.12.0) + rspec-expectations (3.12.2) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.9.0) - rspec-mocks (3.9.1) + rspec-support (~> 3.12.0) + rspec-mocks (3.12.3) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.9.0) - rspec-support (3.9.3) + rspec-support (~> 3.12.0) + rspec-support (3.12.0) PLATFORMS - ruby + x86_64-linux DEPENDENCIES - bundler (~> 1.17) + bundler (~> 2.4) parsby! - pry + pry (~> 0) rake (~> 10.0) rspec (~> 3.0) BUNDLED WITH - 1.17.1 + 2.4.6 diff --git a/lib/parsby.rb b/lib/parsby.rb index ac5f1e2..5c3fcb0 100644 --- a/lib/parsby.rb +++ b/lib/parsby.rb @@ -609,6 +609,10 @@ def initialize(label = nil, &b) @parser = b end + def parser + @parser + end + # Parse a String or IO object. def parse(src) ctx = src.is_a?(Context) ? src : Context.new(src) diff --git a/lib/parsby/combinators.rb b/lib/parsby/combinators.rb index d90cb77..d1bbc0e 100644 --- a/lib/parsby/combinators.rb +++ b/lib/parsby/combinators.rb @@ -395,5 +395,18 @@ def splicer end end end + + # Takes a block which can run multiple parsers + # and use control flow to adapt itself. + define_combinator :coroutine do |&block| + Parsby.new do |target| + + parse = Proc.new do |parsby| + parsby.parser.call target + end + + block.call(parse) + end + end end end diff --git a/parsby.gemspec b/parsby.gemspec index 977d67b..86f6995 100644 --- a/parsby.gemspec +++ b/parsby.gemspec @@ -36,7 +36,7 @@ Gem::Specification.new do |spec| spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } spec.require_paths = ["lib"] - spec.add_development_dependency "bundler", "~> 1.17" + spec.add_development_dependency "bundler", "~> 2.4" spec.add_development_dependency "rake", "~> 10.0" spec.add_development_dependency "rspec", "~> 3.0" spec.add_development_dependency "pry", "~> 0"