Left recursion will be a problem. I can't visualize your "phrase" rules
yet... so I can't reason about them.

Design your parser to always consume something before recursing.

This may help:
http://stackoverflow.com/questions/13374121/non-left-recursive-peg-grammar-for-an-expression


---
"No man is an island... except Philip"


On Mon, Mar 25, 2013 at 11:50 AM, Thomas Ingram <[email protected]>wrote:

> I just covered this with a test and fixed the csv method.
>
>
> On Sun, Mar 24, 2013 at 8:21 PM, Nigel Thorne <[email protected]>wrote:
>
>>
>>  def csv(value)
>>
>>
>>       (value >> (whitespaces? >> comma >> whitespaces? >> 
>> value).repeat).repeat
>>
>>
>>  end
>>
>>  seems odd..
>>
>>
>>
>>  csv(str("x")) matches "", "x" and "x ,x".. fine.. but also "xx" and 
>> "x,xx,x" which seems odd.
>>
>>
>>
>>  ---
>> "No man is an island... except Philip"
>>
>>
>> On Mon, Mar 25, 2013 at 10:38 AM, Nigel Thorne <[email protected]>wrote:
>>
>>> I would change it to be
>>> ((interpolation_end.absent? >> phrase.repeat*(1)*).repeat(0).as(
>>> :interpolation))
>>>
>>> Inside the repeat(0) you have something that has to consume something.
>>> However.. the repeat(0) lets the inside be optional.
>>>
>>>
>>> ---
>>> "No man is an island... except Philip"
>>>
>>>
>>> On Mon, Mar 25, 2013 at 10:16 AM, Thomas Ingram <[email protected]
>>> > wrote:
>>>
>>>> Thanks for the feedback. I'll reply inline....
>>>>
>>>>
>>>> On Sun, Mar 24, 2013 at 6:16 PM, Nigel Thorne <[email protected]>wrote:
>>>>
>>>>> Just looking at the grammar, the alarm bells for me are ...
>>>>>
>>>>> rule(:line_breaks) { *< /u>line_break.repeat } # SMELL: repeat
>>>>> default 0, so this rules can consume nothing.... puts a '?' on the end of
>>>>> the name by convention. Or change to repeat(1). *
>>>>>
>>>> Fixed this. I'm not sure how I missed it.
>>>>
>>>>
>>>>>
>>>>>
>>>>> rule(:comment) { * *pound < /span>>> (line_break.absent? >> any).
>>>>> repeat& lt; span
>>>>> style="line-height:16px;color:rgb(51,51,51);font-size:12px;white-space:pre-wrap;font-family:Consolas,'Liberation
>>>>> Mono',Courier,monospace;margin:0px;font-weight:bold;border:0px;padding:0px">.
>>>>> as(:comment) > > line_break.maybe } # T he 'maybe' on line_break I
>>>>> assume is to allow the file to end at this point.... change this to be
>>>>> line_break | eof where eof is defined as rule(:eof) { any.absent? }
>>>>>
>>>> You assume correctly. I made this change.
>>>>
>>>>
>>>>>
>>>>> ((interpolation_end.absent? >> phr ase.repeat).repeat.as(
>>>>> :interpolation)) ## This can loop for ever. absent? and repeat don't
>>>>> have to consume anything.
>>>>>
>>>> I adapted this rule from my string rule (see def string_parser at
>>>> bottom of file). What if I do this?
>>>>
>>>> rule(:interpolation) { interpolation_start >> interpolation_end.absent?
>>>> >> lines.as(:interpolation) >> interpolation_end }
>>>>
>>>> Also do I have an issue with string_parser? I seem to recall seeing the
>>>> pattern in string_parser somewhere on the parslet website, and I've adapted
>>>> it for comment, string, regular expression and interpolation.
>>>>
>>>>
>>>>> ---
>>>>> "No man is an island... except Philip"
>>>>>
>>>>
>>>> --
>>>> Thomas Ingram
>>>>
>>>
>>>
>>
>
>
> --
> Thomas Ingram
>

Reply via email to