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 >
