Help with "grammar"


#1

Hi

I’m looking into creating a parser that understands a very limited
subset of RTF (Rich Text Format).

I started with Treetop parser generator [1], and was able to get a
parser that analysed RTF syntax working in less than an hour. Brill.
Unfortunately the parser was way too slow for use in a real-time app.

Grammar [2] claims it generates much faster parsers. However, having
looked at the tests and tried to emulate them, I can’t get a basic
parser up and running that works sensibly. The super-simple parser (code
below) is just meant to parse a group of digits and end.

  • The version below does nothing
  • If I set it to compile gram[0], it crashes out because (I think) it
    only uses the digit rule, so dies when it meets EOF

I’d be grateful if anyone could say what I’m missing, or even better,
point me to a straightforward example of using grammar, as the
documentation is pretty sparse.

thanks
alex

[1] http://treetop.rubyforge.org/
[2] http://rubyforge.org/projects/grammar/


require ‘grammar’
require ‘stringio’
include Grammar::Molecules

gram = Grammar.new do
digit = E(?0…?9)

(digit.repeat0).group("") + EOF
end

require ‘grammar/ruby0’
rgram = Grammar::Ruby0.compile(gram[0])

class Output
def <<(token)
p token
end
end

rgram.call(Output.new, StringIO.new(‘1234’).method(:getc) )