反语中的简单语法并不像预期的那样有效

时间:2013-03-14 14:23:24

标签: c# xml-parsing irony

我一直在尝试使用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#的任何其他解析引擎都知道如何处理这个?

0 个答案:

没有答案