From 905183cddc5557da45387e99dac1f5134d975efb Mon Sep 17 00:00:00 2001 From: Jakob Rath <git@jakobrath.eu> Date: Tue, 17 Dec 2013 00:06:29 +0100 Subject: [PATCH] Implement h_attr_bool. --- src/bindings/ruby/lib/hammer.rb | 5 +++++ src/bindings/ruby/lib/hammer/internal.rb | 4 +++- src/bindings/ruby/lib/hammer/parser.rb | 9 +++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/bindings/ruby/lib/hammer.rb b/src/bindings/ruby/lib/hammer.rb index 18c693a4..ebc75be3 100644 --- a/src/bindings/ruby/lib/hammer.rb +++ b/src/bindings/ruby/lib/hammer.rb @@ -46,3 +46,8 @@ $r = parser.parse 'abcdefgh' p $r[:ast][:data][:seq].elements.map {|e| e[:data][:uint]} # or: p $r.ast.data.map(&:data) + + +h = Hammer::Parser +parser = h.many(h.attr_bool(h.uint8) { |r| r.ast.data <= 100 }) +p parser.parse('abcdefgh').ast.data.map(&:data) diff --git a/src/bindings/ruby/lib/hammer/internal.rb b/src/bindings/ruby/lib/hammer/internal.rb index 214145a9..e799b275 100644 --- a/src/bindings/ruby/lib/hammer/internal.rb +++ b/src/bindings/ruby/lib/hammer/internal.rb @@ -169,7 +169,9 @@ module Hammer callback :HAction, [HParseResult.by_ref], HParsedToken.by_ref attach_function :h_action, [:h_parser, :HAction], :h_parser - #attach_function :h_attr_bool, [:h_parser, ...], :h_parser + + callback :HPredicate, [HParseResult.by_ref], :bool + attach_function :h_attr_bool, [:h_parser, :HPredicate], :h_parser # free the parse result attach_function :h_parse_result_free, [HParseResult.by_ref], :void diff --git a/src/bindings/ruby/lib/hammer/parser.rb b/src/bindings/ruby/lib/hammer/parser.rb index f9ff4c70..b496558f 100644 --- a/src/bindings/ruby/lib/hammer/parser.rb +++ b/src/bindings/ruby/lib/hammer/parser.rb @@ -54,6 +54,15 @@ module Hammer return Hammer::Parser.new(:action, h_parser, [parser, action]) end + # Can pass the predicate either as a Proc in second parameter, or as block. + def self.attr_bool(parser, predicate=nil, &block) + predicate = block if predicate.nil? + raise ArgumentError, 'no predicate' if predicate.nil? + + h_parser = Hammer::Internal.h_attr_bool(parser.h_parser, predicate) + return Hammer::Parser.new(:attr_bool, h_parser, [parser, predicate]) + end + def self.token(string) # Need to copy string to a memory buffer (not just string.dup) # * Original string might be modified, this must not affect existing tokens -- GitLab