1

我一直在尝试使用 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'>after </a>。我怀疑在解析器在第一个之后遇到另一个“<”之后,</a>它会尝试应用最后一条规则 ifTagClose + elseIfTagBlock 的第二个产生,因此期望<b a='i'>. 我很确定问题出在开头的“<”上,因为当我从所有终端的开头删除它时,它会按预期工作。

除了自定义解析操作之外,是否有任何解决方法?或者任何其他 c# 解析引擎知道如何处理这个问题?

4

0 回答 0