diff --git a/src/bindings/ruby/lib/hammer/parser_builder.rb b/src/bindings/ruby/lib/hammer/parser_builder.rb index 95dd4c9f28448c51c46746bf7ad2c8c3b9705f4a..9547c6e3fb1db1c51bd39356622eb5d04e62f750 100644 --- a/src/bindings/ruby/lib/hammer/parser_builder.rb +++ b/src/bindings/ruby/lib/hammer/parser_builder.rb @@ -20,10 +20,6 @@ module Hammer def initialize @parsers = [] - # TODO: Store an aggregator, e.g.: - # @aggregator = Hammer::Parser::Sequence - # Sequence is the default, set to Hammer::Parser::Choice for choice() calls - # In the build method, use @aggregator.new(*@parsers) to build the final parser. end def build @@ -35,23 +31,6 @@ module Hammer end - # TODO: Need to check if that's really needed - def call(parser) - @parsers << parser - return self - end - - - def token(str) - @parsers << Hammer::Parser.token(str) - return self - end - - def ch(char) - @parsers << Hammer::Parser.ch(char) - return self - end - # can call it either as ParserBuiler.new.sequence(parser1, parser2, parser3) # or as Parser.build { sequence { call parser1; call parser2; call parser3 } } def sequence(*parsers, &block) @@ -67,6 +46,42 @@ module Hammer @parsers << Hammer::Parser.choice(*parsers) return self end - end -end + def call(parser) + @parsers << parser + return self + end + + # Defines a parser constructor with the given name. + def self.define_parser(name, options = {}) + define_method name do |*args| + @parsers << Hammer::Parser.send(name, *args) + return self + end + end + private_class_method :define_parser + + define_parser :token + define_parser :ch + define_parser :int64 + define_parser :int32 + define_parser :int16 + define_parser :int8 + define_parser :uint64 + define_parser :uint32 + define_parser :uint16 + define_parser :uint8 + define_parser :whitespace + define_parser :left + define_parser :right + define_parser :middle + define_parser :end + define_parser :nothing + define_parser :butnot + define_parser :difference + define_parser :xor + define_parser :many + define_parser :many1 + end # class ParserBuilder + +end # module Hammer