From: Eric Mahurin Date: 2005-04-16T13:25:29+09:00 Subject: BNF-like grammar specified DIRECTLY in Ruby 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!? Make Yahoo! your home page http://www.yahoo.com/r/hs