# String splitting problem

**URL:** <https://rubytalk.org/t/string-splitting-problem/43014>\
**Category:** ruby-talk\
**Created:** [14 December 2007 14:03 UTC](https://rubytalk.org/t/string-splitting-problem/43014 "2007-12-14T14:03:06Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Saladin\_Mundi](https://avatars.discourse-cdn.com/v4/letter/s/bbce88/32.png) [@Saladin\_Mundi](https://rubytalk.org/u/Saladin_Mundi)\
**Post date:** [14 December 2007 14:03 UTC](https://rubytalk.org/t/string-splitting-problem/43014/1 "2007-12-14T14:03:06Z")

</div>

hey guys

I'm trying to split an string (which contains various method calls).  
The result of the splitting of the string should be an array (or  
something like that) which contains a sequence which an interpreter  
would have called the methods.  
Example

class X  
&nbsp;&nbsp;&nbsp;def test(input)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...  
&nbsp;&nbsp;&nbsp;end  
end

x.new.test("z.methodx(z.methody(),z.methodz(z.methodx))")

If I pass "z.methodx(z.methody(),z.methodz(z.methodx))" there should be  
afterwards an arry like this:

[0] -\> var1 = z.methody()  
[1] -\> var2 = z.methodx  
[2] -\> var3 = z.methodz(var2)  
[3] -\> z.methodx(var1,var3)

so the call(s on different methods) given by an input string shall be  
extracted into the real execution sequence like an interpreter would  
excecute this string it.

I hope you can help me with my problem.

> **···**
>
> --  
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).

---

<div class="post-metadata">

**Author:** ![Joe8](https://avatars.discourse-cdn.com/v4/letter/j/ee59a6/32.png) [@Joe8](https://rubytalk.org/u/Joe8)\
**Post date:** [15 December 2007 00:44 UTC](https://rubytalk.org/t/string-splitting-problem/43014/2 "2007-12-15T00:44:01Z")

</div>

hey,

I didn't test this too well, but it works for your string. I doubt  
it's the most clever way to do it, but it should get the job done.

stack = Array.new  
input = "z.methodx(z.methody(),z.methodz(z.methodx))"

last = 0  
count = 0

while last \< input.length  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur = input.index(/[\)\(,]/, last)  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if cur then  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b = input[cur,1]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (/[\(,]/.match(input[last-1,1]) &&  
/[\),]/.match(b)) && cur-last \> 1 then  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count += 1  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts count.to\_s + " " + input[last, cur-last]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack[-1] += count.to\_s  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case b  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when '('  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack.push(input[last, cur-last] + "(")  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when ')'  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count += 1  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts count.to\_s + " " + stack.pop + ")"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack[-1] += count.to\_s  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when ','  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack[-1] += ','  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last = cur+1  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
end

Joe

> **···**
>
> On Dec 14, 2007 9:03 AM, Saladin Mundi \<saladin.mundi@gmx.de\> wrote:
> 
> > hey guys
> > 
> > I'm trying to split an string (which contains various method calls).  
> > The result of the splitting of the string should be an array (or  
> > something like that) which contains a sequence which an interpreter  
> > would have called the methods.  
> > Example
> > 
> > class X  
> > &nbsp;&nbsp;&nbsp;def test(input)  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...  
> > &nbsp;&nbsp;&nbsp;end  
> > end
> > 
> > x.new.test("z.methodx(z.methody(),z.methodz(z.methodx))")
> > 
> > If I pass "z.methodx(z.methody(),z.methodz(z.methodx))" there should be  
> > afterwards an arry like this:
> > 
> > [0] -\> var1 = z.methody()  
> > [1] -\> var2 = z.methodx  
> > [2] -\> var3 = z.methodz(var2)  
> > [3] -\> z.methodx(var1,var3)
> > 
> > so the call(s on different methods) given by an input string shall be  
> > extracted into the real execution sequence like an interpreter would  
> > excecute this string it.
> > 
> > I hope you can help me with my problem.  
> > --  
> > Posted via [http://www.ruby-forum.com/\](http://www.ruby-forum.com/%5C).

---

<div class="post-metadata">

**Author:** ![Gavin\_Kistner3](https://avatars.discourse-cdn.com/v4/letter/g/dfb087/32.png) [@Gavin\_Kistner3](https://rubytalk.org/u/Gavin_Kistner3)\
**Post date:** [15 December 2007 04:55 UTC](https://rubytalk.org/t/string-splitting-problem/43014/3 "2007-12-15T04:55:02Z")

</div>

Wow, that was harder than I expected. The big issue was parsing nested  
commands; I couldn't use regexps, so I had to create a little stack-  
based parser. Thanks for the fun challenge.

In summary:

puts  
MethodMunger.variable\_stack( "z.methodx(z.methody(),z.methodz(z.methodx))" )  
#=\> var0 = z.methodx()  
#=\> var1 = z.methody()  
#=\> var2 = z.methodz( var0 )  
#=\> z.methodx( var1, var2 )

And now, the code, all unit tested:

# Put MWI in the core! enum\_for is retarded!  
module Enumerable  
&nbsp;&nbsp;def map\_with\_index  
&nbsp;&nbsp;&nbsp;&nbsp;idx = -1  
&nbsp;&nbsp;&nbsp;&nbsp;map{ |v| yield v,idx+=1 }  
&nbsp;&nbsp;end  
end

module MethodMunger  
&nbsp;&nbsp;require 'strscan'

&nbsp;&nbsp;# MethodMunger.parse\_method( "z.foo( bar( x ), y )" )  
&nbsp;&nbsp;# #=\> {  
&nbsp;&nbsp;# #=\> :name=\>"z.foo",  
&nbsp;&nbsp;# #=\> :args=\>[  
&nbsp;&nbsp;# #=\> {  
&nbsp;&nbsp;# #=\> :name=\>"bar",  
&nbsp;&nbsp;# #=\> :args=\>[  
&nbsp;&nbsp;# #=\> {:name=\>"x"}  
&nbsp;&nbsp;# #=\> ]  
&nbsp;&nbsp;# #=\> },  
&nbsp;&nbsp;# #=\> {:name=\>"y"}  
&nbsp;&nbsp;# #=\> ]  
&nbsp;&nbsp;# #=\> }  
&nbsp;&nbsp;def self.parse\_method( source )  
&nbsp;&nbsp;&nbsp;&nbsp;stack =   
&nbsp;&nbsp;&nbsp;&nbsp;current\_method = nil  
&nbsp;&nbsp;&nbsp;&nbsp;mode = :prepare\_method

&nbsp;&nbsp;&nbsp;&nbsp;scanner = StringScanner.new( source )  
&nbsp;&nbsp;&nbsp;&nbsp;until scanner.eos?  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case mode  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when :prepare\_method  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new\_method = {}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current\_method = new\_method  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mode = :find\_content

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when :add\_argument  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new\_method = {}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(current\_method[:args] ||= ) \<\< new\_method  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack \<\< current\_method  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current\_method = new\_method  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mode = :find\_content

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when :find\_content  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if chunk = scanner.scan( /[\w.]+/ )  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current\_method[:name] = chunk

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elsif chunk = scanner.scan( /\(\s\*/ )  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mode = :add\_argument

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elsif chunk = scanner.scan( /\s\*,\s\*/ )  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current\_method.delete(:args) if current\_method[:args] ==  
[{}]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current\_method = stack.pop  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mode = :add\_argument

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elsif chunk = scanner.scan( /\s\*\)/ )  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current\_method.delete(:args) if current\_method[:args] ==  
[{}]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current\_method = stack.pop

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;current\_method.delete(:args) if current\_method[:args] ==  
[{}]  
&nbsp;&nbsp;&nbsp;&nbsp;current\_method  
&nbsp;&nbsp;end

&nbsp;&nbsp;def self.variable\_stack( source )  
&nbsp;&nbsp;&nbsp;&nbsp;method = parse\_method( source )  
&nbsp;&nbsp;&nbsp;&nbsp;variable\_stack\_from\_parse( method )  
&nbsp;&nbsp;end

&nbsp;&nbsp;private  
&nbsp;&nbsp;&nbsp;&nbsp;def self.variable\_stack\_from\_parse( method )  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if method[:args]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lines =   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params = method[:args].map{ |arg|  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var\_lines = variable\_stack\_from\_parse( arg )  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arg\_close = var\_lines.pop  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lines.concat( var\_lines )  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arg\_close  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total\_lines = lines.length  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params.each\_with\_index{ |var,i|  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lines \<\< "var#{i+total\_lines} = #{var}"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lines \<\< "#{method[:name]}( #{  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params.map\_with\_index{ |v,i|  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"var#{i + total\_lines}"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}.join(', ')  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;["#{method[:name]}()"]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;end  
end

puts  
MethodMunger.variable\_stack( "z.methodx(z.methody(),z.methodz(z.methodx))" )  
#=\> var0 = z.methodx()  
#=\> var1 = z.methody()  
#=\> var2 = z.methodz( var0 )  
#=\> z.methodx( var1, var2 )

if \_\_FILE\_\_==$0  
&nbsp;&nbsp;require 'test/unit'  
&nbsp;&nbsp;class TestParser \< Test::Unit::TestCase  
&nbsp;&nbsp;&nbsp;&nbsp;def testa\_no\_arguments  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.parse\_method "z.go( )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( {  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:name=\>"z.go"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, result )

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.parse\_method "z.go()"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( {  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:name=\>"z.go"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, result )

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.parse\_method "z.go"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( {  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:name=\>"z.go"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, result )  
&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;def testb\_no\_nesting  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.parse\_method "z.go( x )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( {  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:name=\>"z.go",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:args=\>[  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ :name=\>"x" }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, result )

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.parse\_method "z.go( x, y )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( {  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:name=\>"z.go",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:args=\>[  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ :name=\>"x" },  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ :name=\>"y" },  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, result )

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.parse\_method "z.go( w, x, y )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( {  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:name=\>"z.go",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:args=\>[  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ :name=\>"w" },  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ :name=\>"x" },  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ :name=\>"y" },  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, result )  
&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;def testc\_nesting  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.parse\_method "z.go( x( y ) )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( {  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:name=\>"z.go",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:args=\>[  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:name=\>"x",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:args=\>[  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ :name=\>"y" }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, result )

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.parse\_method "z.go( x( y, w ) )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( {  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:name=\>"z.go",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:args=\>[  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:name=\>"x",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:args=\>[  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ :name=\>"y" },  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ :name=\>"w" },  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, result )

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.parse\_method "z.go( foo( bar ),x( y,  
w ) )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( {  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:name=\>"z.go",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:args=\>[  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:name=\>"foo",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:args=\>[  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ :name=\>"bar" },  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:name=\>"x",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:args=\>[  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ :name=\>"y" },  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ :name=\>"w" },  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, result )

&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;end  
&nbsp;&nbsp;class TestMunger \< Test::Unit::TestCase  
&nbsp;&nbsp;&nbsp;&nbsp;def test\_a\_no\_args  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.variable\_stack "z.go()"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( ["z.go()"], result )

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.variable\_stack "z.go( )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( ["z.go()"], result )

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.variable\_stack "z.go"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( ["z.go()"], result )  
&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;def test\_b\_one\_arg  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.variable\_stack "z.go(y.foo)"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( ["var0 = y.foo()","z.go( var0 )"], result )

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.variable\_stack "z.go( y.foo( ) )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( ["var0 = y.foo()","z.go( var0 )"], result )  
&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;def test\_c\_multi\_args  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.variable\_stack "z.go(y.foo,x.bar)"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( [  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"var0 = y.foo()",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"var1 = x.bar()",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"z.go( var0, var1 )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;], result )

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.variable\_stack "z.go( y.foo(), x.bar() )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( [  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"var0 = y.foo()",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"var1 = x.bar()",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"z.go( var0, var1 )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;], result )  
&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;def test\_d\_nest\_singles  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.variable\_stack "z.go( y.foo( x.bar ) )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( [  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"var0 = x.bar()",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"var1 = y.foo( var0 )",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"z.go( var1 )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;], result )

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.variable\_stack  
"z.go( y.foo( x.bar( w.jim ) ) )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( [  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"var0 = w.jim()",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"var1 = x.bar( var0 )",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"var2 = y.foo( var1 )",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"z.go( var2 )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;], result )  
&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;def test\_e\_nest\_more  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = MethodMunger.variable\_stack "z.go( y.foo( x.bar,  
w.jim ) )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert\_equal( [  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"var0 = x.bar()",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"var1 = w.jim()",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"var2 = y.foo( var0, var1 )",  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"z.go( var2 )"  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;], result )  
&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;end  
end

> **···**
>
> On Dec 14, 7:03 am, Saladin Mundi \<saladin.mu...@gmx.de\> wrote:
> 
> > hey guys
> > 
> > I'm trying to split an string (which contains various method calls).  
> > The result of the splitting of the string should be an array (or  
> > something like that) which contains a sequence which an interpreter  
> > would have called the methods.  
> > Example
> > 
> > class X  
> > &nbsp;&nbsp;&nbsp;def test(input)  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...  
> > &nbsp;&nbsp;&nbsp;end  
> > end
> > 
> > x.new.test("z.methodx(z.methody(),z.methodz(z.methodx))")
> > 
> > If I pass "z.methodx(z.methody(),z.methodz(z.methodx))" there should be  
> > afterwards an arry like this:
> > 
> > [0] -\> var1 = z.methody()  
> > [1] -\> var2 = z.methodx  
> > [2] -\> var3 = z.methodz(var2)  
> > [3] -\> z.methodx(var1,var3)
> > 
> > so the call(s on different methods) given by an input string shall be  
> > extracted into the real execution sequence like an interpreter would  
> > excecute this string it.
> 
> On Dec 14, 7:03 am, Saladin Mundi \<saladin.mu...@gmx.de\> wrote:
> 
> > hey guys
> > 
> > I'm trying to split an string (which contains various method calls).  
> > The result of the splitting of the string should be an array (or  
> > something like that) which contains a sequence which an interpreter  
> > would have called the methods.  
> > Example
> > 
> > class X  
> > &nbsp;&nbsp;&nbsp;def test(input)  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...  
> > &nbsp;&nbsp;&nbsp;end  
> > end
> > 
> > x.new.test("z.methodx(z.methody(),z.methodz(z.methodx))")
> > 
> > If I pass "z.methodx(z.methody(),z.methodz(z.methodx))" there should be  
> > afterwards an arry like this:
> > 
> > [0] -\> var1 = z.methody()  
> > [1] -\> var2 = z.methodx  
> > [2] -\> var3 = z.methodz(var2)  
> > [3] -\> z.methodx(var1,var3)
> > 
> > so the call(s on different methods) given by an input string shall be  
> > extracted into the real execution sequence like an interpreter would  
> > excecute this string it.
> > 
> > I hope you can help me with my problem.

---

<div class="post-metadata">

**Author:** ![Joe8](https://avatars.discourse-cdn.com/v4/letter/j/ee59a6/32.png) [@Joe8](https://rubytalk.org/u/Joe8)\
**Post date:** [15 December 2007 01:36 UTC](https://rubytalk.org/t/string-splitting-problem/43014/4 "2007-12-15T01:36:54Z")

</div>

I made a small mistake

change  
stack[-1] += count.to\_s  
to  
stack[-1] += count.to\_s if stack[-1]

> **···**
>
> On Dec 14, 2007 7:44 PM, Joe \<qbproger@gmail.com\> wrote:
> 
> > hey,
> > 
> > I didn't test this too well, but it works for your string. I doubt  
> > it's the most clever way to do it, but it should get the job done.
> > 
> > stack = Array.new  
> > input = "z.methodx(z.methody(),z.methodz(z.methodx))"
> > 
> > last = 0  
> > count = 0
> > 
> > while last \< input.length  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur = input.index(/[\)\(,]/, last)  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if cur then  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b = input[cur,1]  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (/[\(,]/.match(input[last-1,1]) &&  
> > /[\),]/.match(b)) && cur-last \> 1 then  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count += 1  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts count.to\_s + " " + input[last, cur-last]  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack[-1] += count.to\_s  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
> > 
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case b  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when '('  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack.push(input[last, cur-last] + "(")  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when ')'  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count += 1  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts count.to\_s + " " + stack.pop + ")"  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack[-1] += count.to\_s  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when ','  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack[-1] += ','  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
> > 
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last = cur+1  
> > &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
> > end
> > 
> > Joe
> > 
> > On Dec 14, 2007 9:03 AM, Saladin Mundi \<saladin.mundi@gmx.de\> wrote:
> > 
> > \> hey guys  
> > \>  
> > \> I'm trying to split an string (which contains various method calls).  
> > \> The result of the splitting of the string should be an array (or  
> > \> something like that) which contains a sequence which an interpreter  
> > \> would have called the methods.  
> > \> Example  
> > \>  
> > \> class X  
> > \> def test(input)  
> > \> ...  
> > \> end  
> > \> end  
> > \>  
> > \> x.new.test("z.methodx(z.methody(),z.methodz(z.methodx))")  
> > \>  
> > \>  
> > \> If I pass "z.methodx(z.methody(),z.methodz(z.methodx))" there should be  
> > \> afterwards an arry like this:  
> > \>  
> > \> [0] -\> var1 = z.methody()  
> > \> [1] -\> var2 = z.methodx  
> > \> [2] -\> var3 = z.methodz(var2)  
> > \> [3] -\> z.methodx(var1,var3)  
> > \>  
> > \> so the call(s on different methods) given by an input string shall be  
> > \> extracted into the real execution sequence like an interpreter would  
> > \> excecute this string it.  
> > \>  
> > \> I hope you can help me with my problem.  
> > \> --  
> > \> Posted via [http://www.ruby-forum.com/\](http://www.ruby-forum.com/%5C).  
> > \>  
> > \>

---

<div class="post-metadata">

**Author:** ![Saladin\_Mundi](https://avatars.discourse-cdn.com/v4/letter/s/bbce88/32.png) [@Saladin\_Mundi](https://rubytalk.org/u/Saladin_Mundi)\
**Post date:** [17 December 2007 12:29 UTC](https://rubytalk.org/t/string-splitting-problem/43014/5 "2007-12-17T12:29:46Z")

</div>

thank you for all of your great code. I'll have a close look on it and  
check if its similar to what I had thought of 🙂

thanks again!

> **···**
>
> --  
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).
