我一直在尝试使用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>
。我怀疑在解析器遇到另一个“&lt;”之后在第一个</a>
之后,它尝试应用最后一个规则ifTagClose + elseIfTagBlock的第二个生成,因此期望<b a='i'>
。我很确定问题在于启动“&lt;”,因为当我从所有终端的启动中删除它时,它会按预期工作。
除自定义解析操作外,是否有任何解决方法?或者c#的任何其他解析引擎都知道如何处理这个?