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