From: Jamis Buck Date: 2005-04-17T00:54:51+09:00 Subject: Re: BNF-like grammar specified DIRECTLY in Ruby On Apr 16, 2005, at 8:23 AM, Eric Mahurin wrote: > Would it be better to put it on rubyforge after renaming? > That's not necessary, but it's nice if you need a CVS repository, or a home page, or a wiki for your project. It also gives you bug and feature request tracking, mailing lists, forums, and more. If any of that sounds appealing, you may want to apply for a new project there. If you have those things all hosted elsewhere, or you don't want/need them, then you probably won't gain anything by a RubyForge project (except, perhaps, better project visibility). > Also, is it best rubygems? Is this the ruby equivalent of cpan > for perl? Currently RubyGems is the de facto standard for Ruby libraries. There really isn't a CPAN equivalent for Ruby, yet--we've got RAA and RubyForge, with RubyGems as the package manager. (Another nice thing about RubyForge--when you add a gem file to your project file list, it will automatically be added to the RubyGems package list.) - Jamis > > --- Jamis Buck wrote: >> 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!? > Plan great trips with Yahoo! Travel: Now over 17,000 guides! > http://travel.yahoo.com/p-travelguide >