[Pharo-dev] petit parser longest match

Chris Cunningham cunningham.cb at gmail.com
Wed Nov 20 16:35:08 EST 2013


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 <norbert at 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.pharo.org/pipermail/pharo-dev_lists.pharo.org/attachments/20131120/0f439d54/attachment-0002.html>


More information about the Pharo-dev mailing list