使用JParsec解析parens中的文本

时间:2013-12-20 05:25:43

标签: java parsing dsl jparsec

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

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在应用主体之前应用解析器吗?

任何想法都非常受欢迎。

2 个答案:

答案 0 :(得分:0)

在我问的时候,似乎没有办法做到这一点。但是,github fork-and-pull之后会有:reluctantBetween()

非常感谢@abailly快速响应。

答案 1 :(得分:-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);
}