0

我正在为使用语法的 DSL 编写解析器(nodeHead: nodeBody)。问题是nodeBody在某些情况下可能包含括号。JParsec的betweenoperator 应该是一个很好的解决方案,但是下面的代码失败了:

public void testSample() {
    Parser<Pair<String,String>> sut = Parsers.tuple(Scanners.IDENTIFIER.followedBy(Scanners.among(":")),
            Scanners.ANY_CHAR.many().source()
            ).between(Scanners.among("("), Scanners.among(")"));
    sut.parse("(hello:world)");
}

ANY_CHAR当我更改为时它不会失败IDENTIFIER,所以我认为这里的问题是元组中的第二个解析器过于贪婪。或者,我可以让 JParsec 在应用正文之前应用解析器之间吗?

任何想法都非常受欢迎。

4

2 回答 2

0

在我问的时候,似乎没有办法做到这一点。然而,一个github fork-and-pull后,有:reluctantBetween().

非常感谢@abailly 的快速响应。

于 2014-01-05T20:31:27.753 回答
-1

如果语法规则是最后一个字符总是“)”,你可能会这样做:

static <T> Parser<T> reluctantBetween(
    Parser<?> begin, Parser<T> parser, Parser<?> end) {
  Parser<?> terminator = end.followedBy(eof());
  return between(begin, terminator.not().next(parser).many(), terminator);
}
于 2013-12-21T16:28:23.457 回答