- From: Norm Tovey-Walsh <norm@saxonica.com>
- Date: Sat, 05 Feb 2022 16:52:13 +0000
- To: "C. M. Sperberg-McQueen" <cmsmcq@blackmesatech.com>
- Cc: public-ixml@w3.org
- Message-ID: <m2leypnteg.fsf@saxonica.com>
I’m repeating Michael’s summary mostly to make it likely that my solution appears “below the fold” in case you’re still thinking about it yourself. It took me a little bit of trial and error, but I arrived at a solution. Curiously, at no point did I construct a solution that appeared to give ambiguous results. Steven, can you share some examples of grammars that succeed but are ambiguous? > The challenge as I interpreted it: Write a grammar such that > > (1) The following are all accepted as comments: > > <test-input>(**)</test-input> > <test-input>(***)</test-input> > <test-input>(****)</test-input> > <test-input>(*****)</test-input> > <test-input>(*abc*)</test-input> > <test-input>(**abc*)</test-input> > <test-input>(*abc**)</test-input> > <test-input>(*abc*abc*)</test-input> > <test-input>(**abc*abc*)</test-input> > <test-input>(*abc**abc*)</test-input> > <test-input>(*abc*abc**)</test-input> > <test-input>(*abc* )(*abc*)</test-input> > <test-input>(***a*)</test-input> > <test-input>(**a*)</test-input> > <test-input>(**a*a*)</test-input> > <test-input>(**aa*)</test-input> > <test-input>(*a*)</test-input> > > (2) The following are all rejected as comments: > > <test-input>(*abc*)(*abc*)</test-input> > <test-input>(</test-input> > <test-input>(*</test-input> > <test-input>(**</test-input> > <test-input>(***</test-input> > <test-input>(**a</test-input> > <test-input>(**a*</test-input> > <test-input>(**aa</test-input> > <test-input>(*a</test-input> > <test-input>(*a*</test-input> > <test-input>(*aa</test-input> > <test-input>a</test-input> > <test-input>)</test-input> > <test-input>*)</test-input> > <test-input>**)</test-input> > > The first item on this list is Steven's last example. I made it a > negative case because it is not one comment, and I did not want to > bother trying to write a grammar for a series of comments interspersed > with non-comment data. If you wish to solve this challenge independently, stop reading now; spoiler alert. > My first solution is fairly straightforward: > > comment = '(*', comment-element, '*)'. > -comment-element = (nonstar | ssbnsc)*, star*. > -nonstar = ~['*']. > -star = '*'. > { star-something, but not star-closeparen } > -ssbnsc = '*'+, ~['*)']. I came up with: comment: -'(*', body, -'*)' . -body: ~[")"]* ; ~['*'], [")"] . Which I think works. Be seeing you, norm -- Norm Tovey-Walsh Saxonica
Received on Saturday, 5 February 2022 16:57:31 UTC