I'm not sure what you are trying to improve. It works quite well :) Norbert
> Am 20.11.2013 um 22:59 schrieb Chris Cunningham <cunningham...@gmail.com>: > > ehh, ignore this for now. Neither is working well enough. If I get > something working well, I'll post back. > > >> On Wed, Nov 20, 2013 at 1:45 PM, Chris Cunningham <cunningham...@gmail.com> >> wrote: >> Actually, do this [the #( 0 nil ) meant it was shared with ALL choice >> parsers forever - not a good choice]. >> >> parseOn: aStream >> "This is optimized code that avoids unnecessary block activations, do >> not change. When all choices fail, the last failure is answered." >> >> | element longest | >> longest := Array with: 0 with: nil. >> 1 to: parsers size do: [ :index | >> element := (parsers at: index) >> parseOn: aStream. >> element isPetitFailure >> ifTrue: [ aStream position > longest first ifTrue: [ >> longest at: 1 put: aStream position; at: 2 put: element ] ] >> ifFalse: [ ^ element ] ]. >> aStream position: longest first. >> ^ element >> >> >>> On Wed, Nov 20, 2013 at 1:35 PM, Chris Cunningham <cunningham...@gmail.com> >>> wrote: >>> Ho about this (replacement for yours, or just replace in PPChoiceParser - >>> but it will result in different behavior for that method outside of your >>> particular parser, so beware): >>> >>> parseOn: aStream >>> "This is optimized code that avoids unnecessary block activations, do >>> not change. When all choices fail, the last failure is answered." >>> >>> | element longest | >>> longest := #( 0 nil ). >>> 1 to: parsers size do: [ :index | >>> element := (parsers at: index) >>> parseOn: aStream. >>> element isPetitFailure >>> ifTrue: [ aStream position > longest first ifTrue: [ >>> longest at: 1 put: aStream position; at: 2 put: element ] ] >>> ifFalse: [ ^ element ] ]. >>> aStream position: longest first. >>> ^ element >>> >>> I had a need for it in the past (and, just now, in fact - so minimally >>> tested just now). >>> >>> -cbc >>> >>> >>>> On Wed, Nov 20, 2013 at 2:15 AM, Norbert Hartl <norb...@hartl.name> wrote: >>>> I talked to Lukas two years ago about parsing the longest match [1]. He >>>> committed it to PetitBeta back then. Now I need it and I had a look at the >>>> current parsers but didn’t find one that can do the same. Is there a >>>> parser that can do longest match? >>>> >>>> If not I would propose adding that to the default petit parser package. >>>> Lukas’ proposal back then was >>>> >>>> LongestChoiceParser>>parseOn: aStream >>>> | start element longestEnd longestElement | >>>> start := aStream position. >>>> 1 to: parsers size do: [ :index | >>>> element := (parsers at: index) >>>> parseOn: aStream. >>>> (longestEnd isNil or: [ longestEnd < aStream position ]) >>>> ifTrue: [ >>>> longestEnd := aStream position. >>>> longestElement := element ]. >>>> aStream position: start ]. >>>> aStream position: longestEnd. >>>> ^ longestElement >>>> >>>> Norbert >>>> >>>> [1] http://www.iam.unibe.ch/pipermail/moose-dev/2011-July/009365.html >