From: Eric Mahurin Date: 2005-04-16T23:23:26+09:00 Subject: Re: BNF-like grammar specified DIRECTLY in Ruby Would it be better to put it on rubyforge after renaming? Also, is it best rubygems? Is this the ruby equivalent of cpan for perl? --- Jamis Buck wrote: > Very nice! One quibble: any chance you could change the name? > > http://rubyforge.org/projects/syntax > > :) Might get confusing if someone wants to install both libs. > > - Jamis > > On Apr 15, 2005, at 10:25 PM, Eric Mahurin wrote: > > > Here is my first contribution to Ruby: > > > > http://raa.ruby-lang.org/project/syntax/ > > > > There is still plenty missing in here and it is a work in > > progress, but I think it is ready for some of you to try it > out > > if you like it. > > > > To get an idea of what this is, there is a simple > expression > > evaluator example below. This is pure Ruby code - no yacc > type > > compiling necessary. That's what I love about it. > > > > Eric > > > > > > #!/usr/bin/ruby -d > > > > require "syntax" > > > > NULL = Syntax::NULL > > INF = +1.0/0 > > LOOP0 = (0..INF) > > LOOP1 = (1..INF) > > > > int = (("0".."9")*LOOP1).qualify { |m| m.to_s.to_i } > > > > number = ( > > int + > > (("."+int)|NULL) + > > ((("e"|"E")+("+"|"-"|NULL)+int)|NULL) > > ).qualify { |m| > > if (m.length>1) > > m.to_s.to_f > > else > > m[0] > > end > > } > > > > ws = ((" "|"\t"|"\n")*LOOP0).qualify { TRUE } # skipped > with > > TRUE > > > > expr = Syntax::Pass.new # need to predefine object for > > recursion > > > > atom = > > (number+ws).qualify{|m|m[0]} | > > ("(" + expr + ")" + ws).qualify{|m|m[1]} > > > > term = ( > > atom + ( ("*"|"/"|"%") + ws + atom )*LOOP0 > > ).qualify { |m| > > product = m[0] > > m[1].each { |m| > > case m[0] > > when "*" then product *= m[1] > > when "/" then product /= m[1] > > when "%" then product %= m[1] > > end > > } > > product > > } > > > > expr << ( > > ws + term + ( ("+"|"-") + ws + term )*LOOP0 > > ).qualify { |m| > > sum = m[0] > > m[1].each { |m| > > case m[0] > > when "+" then sum += m[1] > > when "-" then sum -= m[1] > > end > > } > > sum > > } > > > > while (gets) > > p(expr===RandomAccessStream.new($_)) > > end __________________________________ Do you Yahoo!? Plan great trips with Yahoo! Travel: Now over 17,000 guides! http://travel.yahoo.com/p-travelguide