From: Eric Mahurin Date: 2005-04-28T23:35:16+09:00 Subject: Re: I need a formula parser 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/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 --- Lyndon Samson wrote: > On 4/28/05, James Edward Gray II > 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.yahoo.com