Hi Konrad, A somewhat similar issue is present in an XML grammar: the closing element must match the opening element. In PPXmlGrammar, you have a condition that matches it and throws a failure otherwise: element "[39] element ::= EmptyElemTag | STag content ETag" ^ $< asParser , qualified , attributes , whitespace optional , ('/>' asParser / ($> asParser , content , [ :stream | stream position ] asParser , '</' asParser , qualified , whitespace optional , $> asParser)) ==> [ :nodes | nodes fifth = '/>' ifTrue: [ Array with: nodes second with: nodes third with: #() ] ifFalse: [ nodes second = nodes fifth fifth ifTrue: [ Array with: nodes second with: nodes third with: nodes fifth second ] ifFalse: [ PPFailure message: 'Expected </' , nodes second qualifiedName , '>' context: nil at: nodes fifth third ] ] ] Cheers, Doru
On Jan 27, 2019, at 4:38 PM, Konrad Hinsen <konrad.hinsen@fastmail.net> wrote:
Dear Tomo,
This post might help you. In case of PetitParser2, it's PP2Failure instead of PPFailure. https://stackoverflow.com/questions/15371334/how-can-a-petitparser-parse-rul...
That's indeed a possible solution: parse for arbitrary operators, and then add a test for equality that can make everything fail in the end. I will try it out!
Thanks, Konrad.
-- www.feenk.com "Not knowing how to do something is not an argument for how it cannot be done."