On Apr 17, 2006, at 6:50 AM, Bil Kleb wrote:

> Hello,
>
> Can someone please point me at a simple recipe for
> parsing a parameter list with embedded parentheses
> and commas, e.g.,

I think StringScanner makes this kind of work fairly simple:

require "strscan"

class String
   def get_args
     scanner     = StringScanner.new(self)
     result      = scanner.eos? ? Array.new : [""]
     paren_depth = 0

     until scanner.eos?
       if scanner.scan(/[^(),]+/)
         # do nothing--we found the part of the argument we need to add
       elsif scanner.scan(/\(/)
         paren_depth += 1
       elsif scanner.scan(/\)/)
         paren_depth -= 1
       elsif scanner.scan(/,\s*/) and paren_depth.zero?
         result << ""
         next
       end

       result.last << scanner.matched
     end

     result
   end
end

require 'test/unit'

class TestArgumentParser < Test::Unit::TestCase
   def test_simple_cases
     assert_equal %w[ a b ],         'a,b'.get_args
     assert_equal %w[ a_frog b25 ],  'a_frog, b25'.get_args
   end
   def test_embedded_parens
     assert_equal %w[ a(1) b ],      'a(1), b'.get_args
     assert_equal %w[ a b(i) ],      'a, b(i)'.get_args
   end
   def test_embedded_parens_with_commas
     assert_equal %w[ a(0,j) b ],    'a(0,j),b'.get_args
     assert_equal %w[ a() b(j,k) ],  'a(),b(j,k)'.get_args
     assert_equal %w[ c(i,j,t(1)) ], 'c(i,j,t(1))'.get_args
   end
end

__END__

Hope that helps.

James Edward Gray II