ruby code generation question

Chuck Remes cremes.devl... at mac.com
Thu Oct 4 15:14:34 UTC 2007


I'm writing a scanner using Ragel and Ruby, but I'm coming up against  
a problem that I can't seem to figure out. If I try to wrap the  
machine in a class, I get a peculiar error that it can't figure out.  
Here's a bit of sample code to illustrate.

#
# @LANG: ruby
#


%%{
     machine orcscanner;

     letters = [a-zA-Z]+;
     numbers = [0-9]+;
     spaces = [ \t\n]+;
     other = [\[:\.\]\-=|]+;

     main := |*

             ( numbers | letters | spaces | '{' | '}' | other );

     *|;

}%%

%% write data;


   def parse_line(data)
     p = 0;
     pe = data.length;
     cs = 0;
     tokstart = 0;
     tokend = 0;
     act = 0;

     %% write init;
     %% write exec;
     %% write eof;

     if cs == orcscanner_error
       puts "SCANNER_ERROR"
     end

   end



inp = [
                 "76 } sadf",
                 "Oct  1 09:50:33.37204 [29193]: {test text}"
]

inp.each { |str|
                 puts "input = #{str}"
                 parse_line(str)
         }

This all works just fine (though it does nothing). If I wrap it in a  
class I get an error:

class SomeClass

<code listed above>

inp = [
                 "76 } sadf",
                 "Oct  1 09:50:33.37204 [29193]: {test text}"
]

t = SomeClass.new

inp.each { |str|
                 puts "input = #{str}"
                 t.parse_line(str)
         }

end

Here's the error I get:

t.rb:146:in `parse_line': undefined local variable or method  
`orcscanner_start' for #<SomeClass:0x1cac0> (NameError)
         from t.rb:322
         from t.rb:320:in `each'
         from t.rb:320

Looking at the ruby code I see that orcscanner_start is defined like so:

class << self
         attr_accessor :orcscanner_start
end
self.orcscanner_start = 1;

This is adding a class method #orcscanner_start to the current class  
(self). I guess it works fine when adding to Object (the default  
class) but not my custom class. Why? What am I doing wrong?

The reason I want to do this is so my ragel actions can call methods  
or access variables that are part of my custom class. I have things  
nicely encapsulated.

Thanks for any help or pointers.

cr



More information about the ragel-users mailing list