Java 使用JParsec解析parens中的文本

Java 使用JParsec解析parens中的文本,java,parsing,dsl,jparsec,Java,Parsing,Dsl,Jparsec,我正在为使用语法(nodeHead:nodeBody)的DSL编写解析器。问题是在某些情况下,nodeBody可能包含paren。 JParsec的between操作符应该是一个很好的解决方案,但以下代码失败: public void testSample() { Parser<Pair<String,String>> sut = Parsers.tuple(Scanners.IDENTIFIER.followedBy(Scanners.among(":")),

我正在为使用语法
(nodeHead:nodeBody)
的DSL编写解析器。问题是在某些情况下,
nodeBody
可能包含paren。 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)");
}
public void testSample(){
Parser sut=Parsers.tuple(Scanners.IDENTIFIER.followerby(Scanners.interferen(“:”)),
Scanners.ANY_CHAR.many().source()
).between(Scanners.between(“”),Scanners.between(“”);
sut.parse(“(hello:world)”);
}
当我将
ANY_CHAR
更改为
IDENTIFIER
时,它不会失败,因此我假设这里的问题是元组中的第二个解析器太贪婪了。或者,我可以让JParsec在应用主体之前在解析器之间应用


任何想法都非常可取。

如果语法规则是最后一个字符始终为“)”,您可能会:

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);
}
静态解析器不情愿(
解析器开始、解析器、解析器结束){
解析器终止符=end.followerby(eof());
返回between(begin,terminator.not().next(parser.many(),terminator);
}

在我询问的时候,似乎没有办法做到这一点。但是,后面还有:
reluctantBetween()


非常感谢@abaily的快速回复。

请不要用问题来回答问题,将其作为评论。规则是最后一个字符必须是“)”。谢谢。用代码片段更新了答案。我没有证实,但这是我的想法。