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