2

我正在尝试使用 JParsec 3 为版本号编写一个简单的解析器。版本号如下所示:

123
1.2.3
123.4

规则是:

最多三个非负整数,由.

我有Version class三个工厂方法:

Version.of(int major)
Version.of(int major, int minor)
Version.of(int major, int minor, int patch)

我想为这三种类型中的任何一种编写一个解析器。

这是我到目前为止所拥有的:

static final Parser<Integer> integerParser = Scanners.INTEGER
        .map(x -> Integer.parseUnsignedInt(x));

static final Parser<Version> versionParser1 =
        integerParser.map(x -> Version.of(x));

static final Parser<Version> versionParser2 =
        Parsers.sequence(
                integerParser.followedBy(Scanners.isChar('.')), 
                integerParser)
                .map(x -> Version.of(x.get(0), x.get(1)));

static final Parser<Version> versionParser3 =
        Parsers.sequence(
                integerParser.followedBy(Scanners.isChar('.')),
                integerParser.followedBy(Scanners.isChar('.')), 
                integerParser)
                .map(x -> Version.of(x.get(0), x.get(1), x.get(2)));

public static final Parser<Version> versionParser =
    versionParser1.or(versionParser2).or(versionParser3); 

这实际上并没有编译,因为我有x.get(0),x是一个Integer.

我应该如何在这里使用 JParsec?

4

1 回答 1

2

您可以改用这些Parsers.sequence(p1,p2,...,map)功能。Parsers.sequence(p1...).map(f)行为是删除所有解析器的输出,但最后一个。然后使用不同的组合器组合所有解析器,or()因为如果解析器使用输入但不成功,它将失败。一个可能的解决方案是

public static final Parser<Version> versionParser = Parsers.longest(versionParser1, versionParser2, versionParser3);

于 2017-02-08T18:19:28.140 回答