Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.ruby > #3191

Re: Making a simple parser

From Felipe Balbi <balbif@gmail.com>
Newsgroups comp.lang.ruby
Subject Re: Making a simple parser
Date 2011-04-19 16:03 -0500
Organization Service de news de lacave.net
Message-ID <ce32238c179ca9dec47c6270e291f92c@ruby-forum.com> (permalink)
References <87adbac7061a00a72e282c160ed42414@ruby-forum.com> <BANLkTi=4eHATM9H902di1y5mjcbRS5dO-g@mail.gmail.com>

Show all headers | View raw


Hi,

"Jesús Gabriel y Galán" <jgabrielygalan@gmail.com> wrote in post 
#993452:
> On Sat, Apr 16, 2011 at 9:52 PM, Felipe Balbi <balbif@gmail.com> wrote:
>>
>>  @children.each { |child|
>> def supported?
>>
>> input = InputFormat.new(ARGV[0])
>> input.parse
>>
>> As it turns out, this isn't working because AInputFormat will only
>> inherit from InputFormat at the time I actually use it, am I right ? Any
>> tips you guys could give me to achieve what I want ? (from several
>> possible input formats generate one output format)
>
> The above doesn't work, because the @children inside the instance
> method "parse" is not the same as the @children inside the class
> method "self.inherited". You have to give access to the class instance
> variable, and then use that one from the parse method (the you will

aaa, you're right :-) Good point.

> see the next problem):
>
> class InputFormat
>   class << self
>     attr_accessor :children
>   end
>
>   def initialize(input)
>     @input = input
>   end
>
>   def parse
>     self.class.children.each {|child| child.parse(@input) if
> child.supported?(@input)}
>   end
>
>   def self.inherited(child)
>     (@children ||= []) << child
>   end
> end
>
> class AInputFormat < InputFormat
>  def supported?
>    # check if we can parse this type of file
>  end
>
>  def parse
>    # parse and generate array of hashes in known format
>  end
> end
>
> ruby-1.8.7-p334 :028 > input = InputFormat.new("test")
>  => #<InputFormat:0xb738bf50 @input="test">
> ruby-1.8.7-p334 :029 > input.parse
> NoMethodError: undefined method `supported?' for AInputFormat:Class
>   from (irb):11:in `parse'
>   from (irb):11:in `each'
>   from (irb):11:in `parse'
>   from (irb):29
>
> The next problem, as you see, is that you are defining instance
> methods in the subclasses, but are calling them on the class. Maybe
> the methods parse and supported? in the children could be class
> methods, or maybe what you store in @children could be an instance of
> the class.

I'm not instantiating AInputFormat in any part of the code... so making 
those
class methods is the way to go for me :-) Thanks for the tip :-)

--
balbi

-- 
Posted via http://www.ruby-forum.com/.

Back to comp.lang.ruby | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

Making a simple parser Felipe Balbi <balbif@gmail.com> - 2011-04-16 14:52 -0500
  Re: Making a simple parser 7stud -- <bbxx789_05ss@yahoo.com> - 2011-04-16 22:31 -0500
  Re: Making a simple parser jake kaiden <jakekaiden@yahoo.com> - 2011-04-17 12:01 -0500
    Re: Making a simple parser Felipe Balbi <balbif@gmail.com> - 2011-04-17 15:22 -0500
      Re: Making a simple parser jake kaiden <jakekaiden@yahoo.com> - 2011-04-17 21:10 -0500
  Re: Making a simple parser Jesús Gabriel y Galán <jgabrielygalan@gmail.com> - 2011-04-18 02:22 -0500
    Re: Making a simple parser Felipe Balbi <balbif@gmail.com> - 2011-04-19 16:03 -0500
  Re: Making a simple parser 7stud -- <bbxx789_05ss@yahoo.com> - 2011-04-18 13:24 -0500
    Re: Making a simple parser 7stud -- <bbxx789_05ss@yahoo.com> - 2011-04-18 15:22 -0500

csiph-web