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

Very nice! One quibble: any chance you could change the name?

http://rubyforge.org/projects/syntax

:slight_smile: 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

Eric Mahurin wrote:

Here is my first contribution to Ruby:
http://raa.ruby-lang.org/project/syntax/

Let me inform you that I'm also developing similar library TDP4R. :slight_smile:
   http://rubyforge.org/projects/tdp4r
Some examples are available at:
   http://rubyforge.org/cgi-bin/viewcvs.cgi/tdp4r/samples/?cvsroot=tdp4r

Thanks,

···

--
Takaaki Tateishi <ttate@ttsky.net>