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
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. 
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>