From: Eleanor McHugh Date: 2008-03-16T10:30:26+09:00 Subject: Re: Looking for an appropiate parser generator On 15 Mar 2008, at 23:21, Iņaki Baz Castillo wrote: > Hi, I'm new in this maillist so hello to all. > > I want to do a SIP protocol parser in Ruby (SIP protocol is very > similar to > HTTP) so I'm looking for the most appropiate parser in Ruby. Also, > it's the > first time I try to do something like this so I need first lot of > doc reading > (yacc, lex, LARL, LL, BNF...). > > I'd just like to know with parser is a good option for my purpose > since I've > found "too much" of them: > > - rex > - ruby-lex > - racc > - ruby-yacc > - coco-rb > - TreeTop > - Ragel > > For now I don't look for the fastest and most efficient parser, > maybe just for > the easiest one. I will read those days about Yacc and Lex since I > assume > they are the base of all of them, and I know that typically Yacc is > used in > conjunction with Lex so: > If I choose Racc, will I need Rex? > If I choose Ruby-Yacc, will I need Ruby-Lex? > Note that I want to get Ruby code, not C, C++ or others. > > My purpose is just receiving SIP requests (similar to HTTP requests) > and parse > them (maybe into Ruby objects) to work with them (implement a SIP > stack). > > They are lots of options and I'm getting a little "lost" with so > many doc to > read. Any orientation please? The SIP protocol is in principle simple enough that you could probably get by rolling your own custom parser by hand. My colleague implemented a console-driven SIP stack this way and whilst the code is inefficient compared to a table-driven parser it's eminently more readable. However if you do want to go down the parser-generator route for performance reasons then look at the Ragel parser in Mongrel as that's very efficient and highly conformant with the HTTP RFC specs (given some of the boundary cases in SIP conformance is probably high on your list of priorities). As far as I'm aware Ragel produces parsers in C, but the Mongrel code will show you how to turn that into a Ruby native extension. Ellie Eleanor McHugh Games With Brains ---- raise ArgumentError unless @reality.responds_to? :reason