Simple parsing questions using PEG.js - newbie warning!
I'm a newbie at Stackoverflow as well as PEG (http://en.wikipedia.org/wiki/Parsing_expression_grammar), so please be gentle! [As a newbie, I was only allowed one hyperlink. Sorry!]

I'm trying to wrap my head around PEG by entering simple grammars into the [PEG.js playground](http://pegjs.majda.cz/online).

Example 1:
-
 - Input: `"abcdef1234567ghijklmn8901opqrs"`
 - Desired output: `["abcdef", "1234567",
       "ghijklmn", "8901", "opqrs"]`

 - Actual output: `["abcdef", ["1234567", ["ghijklmn", ["8901", ["opqrs", ""]]]]]`

This example pretty much works, but can I get PEG.js to not nest the resulting array to a million levels? I assume the trick is to use concat() instead of join() somewhere, but I can't find the spot.

    start
      = Text
    
    Text
      = Numbers Text
      / Characters Text
      / EOF
    
    Numbers
      = numbers: [0-9]+ {return numbers.join("")}
    
    Characters
      = text: [a-z]+ {return text.join("")}
    
    EOF
      = !.

Example 2:
-
Same problem and code as Example 1, but change the Characters rule to the following, which I expected would produce the same result.

    Characters
      = text: (!Numbers .)+ {return text.join("")}

The resulting output is: 

    [",a,b,c,d,e,f", ["1234567", [",g,h,i,j,k,l,m,n", ["8901", [",o,p,q,r,s", ""]]]]]

Why do I get all these empty matches?

Example 3:
-
Last question. This doesn't work at all. How can I make it work? And for bonus points, any pointers on efficiency? For example, should I avoid recursion if possible?

I'd also appreciate a link to a good PEG tutorial. I've read (http://www.codeproject.com/KB/recipes/grammar_support_1.aspx), but as you can see I need more help ...

 - Input:
   `'abcdefghijklmnop"qrstuvwxyz"abcdefg'`
 - Desired output: `["abcdefghijklmnop", "qrstuvwxyz",
       "abcdefg"]`
 - Actual output: `"abcdefghijklmnop\"qrstuvwxyz\"abcdefg"`

<pre><code>start
  = Words

Words
  = Quote
  / Text
  / EOF

Quote
  = quote: ('"' .* '"') Words {return quote.join("")}

Text
  = text: (!Quote . Words) {return text.join("")}

EOF
  = !.</code></pre>
Thanks for any help!
Simple parsing questions using PEG.js - newbie warning!
===

I'm a newbie at Stackoverflow as well as PEG (http://en.wikipedia.org/wiki/Parsing_expression_grammar), so please be gentle! [As a newbie, I was only allowed one hyperlink. Sorry!]

I'm trying to wrap my head around PEG by entering simple grammars into the [PEG.js playground](http://pegjs.majda.cz/online).

Example 1:
-
 - Input: `"abcdef1234567ghijklmn8901opqrs"`
 - Desired output: `["abcdef", "1234567",
       "ghijklmn", "8901", "opqrs"]`

 - Actual output: `["abcdef", ["1234567", ["ghijklmn", ["8901", ["opqrs", ""]]]]]`

This example pretty much works, but can I get PEG.js to not nest the resulting array to a million levels? I assume the trick is to use concat() instead of join() somewhere, but I can't find the spot.

    start
      = Text
    
    Text
      = Numbers Text
      / Characters Text
      / EOF
    
    Numbers
      = numbers: [0-9]+ {return numbers.join("")}
    
    Characters
      = text: [a-z]+ {return text.join("")}
    
    EOF
      = !.

Example 2:
-
Same problem and code as Example 1, but change the Characters rule to the following, which I expected would produce the same result.

    Characters
      = text: (!Numbers .)+ {return text.join("")}

The resulting output is: 

    [",a,b,c,d,e,f", ["1234567", [",g,h,i,j,k,l,m,n", ["8901", [",o,p,q,r,s", ""]]]]]

Why do I get all these empty matches?

Example 3:
-
Last question. This doesn't work at all. How can I make it work? And for bonus points, any pointers on efficiency? For example, should I avoid recursion if possible?

I'd also appreciate a link to a good PEG tutorial. I've read (http://www.codeproject.com/KB/recipes/grammar_support_1.aspx), but as you can see I need more help ...

 - Input:
   `'abcdefghijklmnop"qrstuvwxyz"abcdefg'`
 - Desired output: `["abcdefghijklmnop", "qrstuvwxyz",
       "abcdefg"]`
 - Actual output: `"abcdefghijklmnop\"qrstuvwxyz\"abcdefg"`

<pre><code>start
  = Words

Words
  = Quote
  / Text
  / EOF

Quote
  = quote: ('"' .* '"') Words {return quote.join("")}

Text
  = text: (!Quote . Words) {return text.join("")}

EOF
  = !.</code></pre>
Thanks for any help!