我正在为使用语法(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在应用主体之前应用解析器吗?
任何想法都非常受欢迎。
答案 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);
}