1

我用PetitParserDart定义了一些规则:

def("start", ref("rule").separatedBy(char('\n'), includeSeparators: false);
def("rule", char('(').seq(word().plus()).seq(char(')')));

因此将匹配以下文本:

(aaa)
(bbbbbb)

但是如果有一些行不能匹配:

(aaaa)
bbbbb
(cccccccc

如何定义语法让它失败并在线抛出异常(ccccccccc,但不在线bbbbb

我的意思是它只在规则不完全匹配时抛出异常。如果没有匹配,它不会抛出异常。

4

1 回答 1

1

在语法中的任何一点,您都可以引入失败的解析器:

failure('This parser always fails at this point');

通常 PetitParser 在解析期间不使用异常,成功和失败由各自的SuccessFailure响应上下文指示。

也就是说,可能会抛出异常,但通常不建议使用,除非您的语法用户可以处理它。例如,您可以像这样定义一个抛出解析器工厂:

Parser thrower(String message) {
  return epsilon().map((value) => throw new IllegalStateException(message));
}

使用普通的合成器,您可以生成非常精确的错误消息:

char('(')
  .seq(word().plus())
  .seq(char(')')
    // causes the parser to continue trying to parse the input
    .or(failure('something bad happened')))

或者使用上面的助手:

char('(')
  .seq(word().plus())
  .seq(char(')')
     // stops parsing altogether and throws an exception
    .or(thrower('something bad happened')))
于 2013-07-11T05:04:33.450 回答