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!?
> Make Yahoo! your home page
> http://www.yahoo.com/r/hs
>