Asp Forum
Home
|
Login
|
Register
|
Search
Forums
>
comp.lang.ruby
Re: I need a formula parser
Eric Mahurin
4/28/2005 2:35:00 PM
I posted this message a couple weeks ago. The example contains
a simple expression parser - just +, -, *, /, %, and (), but
you should get the idea.
Bear in mind that the API is not frozen. Right now, I'm
working on the API to the file, string, or even token stream
(Cursor - like Iterator but more geared toward files). I'll
also make it easier to make make lexers (they aren't necessary)
and add a few more goodies. In the example below, I will
likely change how recursion is done and defintely the
Stream/Cursor interface.
Eric
-----------
Here is my first contribution to Ruby:
http://raa.ruby-lang.org/proje...
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
--- Lyndon Samson <lyndon.samson@gmail.com> wrote:
> On 4/28/05, James Edward Gray II <james@grayproductions.net>
> wrote:
> > On Apr 28, 2005, at 2:18 AM, Lyndon Samson wrote:
> >
> > > Sounds like another fine RubyQuiz!!!
> >
> > I miss Parse::RecDescent myself, but porting it is not
> exactly a quiz
> > size task. Or perhaps I didn't understand what you
> meant...
> >
> I meant a generic formula parser
>
> ie.
> "(1+2)*pow(2,2)", block callback for function execution
> "(1+2)*pow($a,2)", passed in hash lookup for variable sub
>
> etc
>
>
>
> > James Edward Gray II
> >
> >
>
>
> --
> Into RFID? www.rfidnewsupdate.com Simple, fast, news.
>
>
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail...
Servizio di avviso nuovi messaggi
Ricevi direttamente nella tua mail i nuovi messaggi per
Re: I need a formula parser
Inserendo la tua e-mail nella casella sotto, riceverai un avviso tramite posta elettronica ogni volta che il motore di ricerca troverà un nuovo messaggio per te
Il servizio è completamente GRATUITO!
x
Login to ForumsZone
Login with Google
Login with E-Mail & Password