I only played a little with PetitParser but I think the answer is in PetitXml&gt;&gt;#element. You see in the action block that it compares the &quot;qualified&quot; of the open and close tags and if they&#39;re different it returns a PPFailure. It also takes care of the inlineTag in the same block by asking if the fifth node is &#39;/&gt;&#39;.<div>

<br></div><div><div>element</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>&quot;[39]   <span class="Apple-tab-span" style="white-space:pre">        </span>element<span class="Apple-tab-span" style="white-space:pre">        </span>   ::=   <span class="Apple-tab-span" style="white-space:pre">        </span> EmptyElemTag | STag content ETag&quot;</div>

<div><span class="Apple-tab-span" style="white-space:pre">        </span></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>^ $&lt; asParser , qualified , attributes , whitespace optional , (&#39;/&gt;&#39; asParser / ($&gt; asParser , content , [ :stream | stream position ] asParser , &#39;&lt;/&#39; asParser , qualified , whitespace optional , $&gt; asParser)) ==&gt; [ :nodes | </div>

<div><span class="Apple-tab-span" style="white-space:pre">                </span><b>nodes fifth = &#39;/&gt;&#39;</b></div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>ifTrue: [ Array with: nodes second with: nodes third with: #() ]</div>

<div><span class="Apple-tab-span" style="white-space:pre">                        </span>ifFalse: [</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span><b>nodes second = nodes fifth fifth</b></div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>ifTrue: [ Array with: nodes second with: nodes third with: nodes fifth second ]</div>

<div><span class="Apple-tab-span" style="white-space:pre">                                        </span>ifFalse: [ PPFailure message: &#39;Expected &lt;/&#39; , nodes second qualifiedName , &#39;&gt;&#39; at: nodes fifth third ] ] ]</div><div><br></div><div>

I hope this helps.</div><div>Cheers,</div><div>Richo</div><br><div class="gmail_quote">On Mon, Apr 25, 2011 at 6:42 PM, Esteban Lorenzano <span dir="ltr">&lt;<a href="mailto:estebanlm@gmail.com">estebanlm@gmail.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Hi Lukas, all<br>
I&#39;m finally working on a HTML petit parser (a very basic one, based on XML petit parser) and I have a serious problem (well... besides my complete ignorance about petit parser, he...)<br>
I need to match this pattern:<br>
<br>
openTag, contents, closeTag     (that will be something like &quot;&lt;html&gt; ... &lt;/html&gt;&quot;)<br>
inlineTag                                       (that will be something like &quot;&lt;br/&gt;&quot;)<br>
openTag                                         (that will be something like &quot;&lt;link ...&gt;&quot; or &quot;&lt;img src=&#39;anUrl&#39;&gt;&quot;)<br>
<br>
so, after try some variants... I came with this construct:<br>
<br>
element<br>
        &quot;[39]           element    ::=           EmptyElemTag | STag content ETag&quot;<br>
<br>
        ^(self inlineTag / (self openTag, content, self closeTag) / self openTag)<br>
                ==&gt; [ :nodes | ].<br>
<br>
openTag<br>
        ^ $&lt; asParser, qualified, whitespace optional, attributes, whitespace optional, $&gt; asParser<br>
<br>
inlineTag<br>
        ^ $&lt; asParser, qualified, whitespace optional, attributes, whitespace optional, &#39;/&gt;&#39; asParser<br>
<br>
closeTag<br>
        ^&#39;&lt;/&#39; asParser , qualified , whitespace optional , $&gt; asParser<br>
<br>
<br>
so... the problem here is that the statement<br>
<br>
self openTag, contents, self closeTag<br>
<br>
matchs with<br>
<br>
...<br>
        &lt;link ...&gt;<br>
&lt;/html&gt;<br>
<br>
and for that reason, the resulting tree is invalid.<br>
<br>
So, I need a way to ensure the openTag name is equal to the closeTag name.<br>
<br>
How can I do that?<br>
<br>
Cheers,<br>
<font color="#888888">Esteban<br>
</font></blockquote></div><br></div>