Hi,

> On Jan 29, 2019, at 7:04 PM, Konrad Hinsen <konrad.hin...@fastmail.net> wrote:
> 
> Tudor Girba <tu...@tudorgirba.com> writes:
> 
>> But, does it solve your problem?
> 
> Not yet. Not sure it will.

Would this not work:

p := (#digit asPParser separatedBy: ($+ asPParser / $- asPParser) trim) ==> 
[:tokens | 
        | result |
        result := tokens.
        2 to: tokens size - 1 by: 2 do: [ :index | 
                (tokens at: index) = (tokens at: 2)
                        ifFalse: [result := PP2Failure message: 'expected ', 
(tokens at: 2) asString, ' but got ', (tokens at: index) asString ]].
        result ].


p end parse: '1+3+2 - 6' "a PP2Failure: 'expected + but got -‘"
p end parse: '1+3+2 + 6'  "#($1 $+ $3 $+ $2 $+ $6)”

?

Please note that I used PetitParser2 for this one because it also addresses the 
failure message issue you raised below. However, the logic would work in PP1 as 
well.


Cheers,
Doru



>>> More generally, there seems to be a bug in how PetitParser handles
>>> PPFailure return values. The actually reported error is always different
>>> from what is passed to PPFailure. I love software ;-)
>> 
>> What do you mean?
> 
> If I return
> 
>    PPFailure message: 'whatever' at: 0
> 
> from my parser, then it does fail but it reports a different error.
> 
> After some more experiments, it looks like this is perhaps not a bug,
> but a feature that makes returning failures not so useful after all. I
> suspect that PetitParser simply backtracks after my failure and tries a
> different rule that then fails as well.
> 
> A simple example:
> 
>   | p |
>   p := #digit asParser plus flatten
>               ==> [ :value | value asSet size = 1 ifTrue: [ value ] ifFalse: 
> [ PPFailure message: 'not equal' at: 0 ]].
>   p parse: '22233'
> 
> The reported failure is "digit expected at 5".
> 
> On the other hand, if there is no path for backtracking, the reported
> failure is the expected one:
> 
>   | p |
>   p := (#digit asParser, #digit asParser) flatten
>               ==> [ :value | value first = value second ifTrue: [ value ] 
> ifFalse: [ PPFailure message: 'not equal' at: 0 ]].
>   p parse: '23'
> 
> Konrad.

--
www.feenk.com

"Quality cannot be an afterthought."


Reply via email to