私はIronyを使用していくつかのXMLコードを解析しようとしています。文法を次のように定義しました。
this.Root = tagList;
tagList.Rule = this.MakeStarRule(tagList, tag);
tag.Rule = conditionBlock;
ifTagOpen.Rule = < + "a" + "condition" + equals + "'i'" + >;
ifTagClose.Rule = < + slash + "a" + >;
elseIfTag.Rule = < + "b" + "a" + equals + "'i'" + >;
elseTagClose.Rule = < + slash + "a" + >;
conditionBlock.Rule = ifTagOpen + ifTagCloseElseIf | ifTagOpen + tag + ifTagCloseElseIf;
elseIfTagBlock.Rule = elseIfTag + elseTagClose;
ifTagCloseElseIf.Rule = ifTagClose | ifTagClose + elseIfTagBlock | Empty;
さて、私がこのようなものを解析しようとすると、
<a condition ='i'><a condition ='i'></a><b a='i'></b></a>
それは正常に機能します(期待どおり)。
しかし、私がこのようなことをしようとすると
<a condition ='i'><a condition ='i'></a></a>
、それは機能せず<b a='i'>
、最初の後に期待することを教えてくれ</a>
ます。
私が間違っている場合は訂正してください。ただし、これも解析可能ではありませんか?<b a='i'>
最後のルールの最初の生成は、後である必要はないことを明確に示しています</a>
。パーサーが最初の後に別の「<」に遭遇した後、</a>
最後のルールifTagClose + elseIfTagBlockの2番目の生成を適用しようとするため、が期待されると思い<b a='i'>
ます。すべての端末の先頭から削除すると、期待どおりに機能するため、「<」の先頭に問題があると確信しています。
カスタム解析アクションを除いて、これに対する回避策はありますか?または、これに対処する方法を知っているc#用の他の解析エンジンはありますか?