Java JParsec版本号

Java JParsec版本号,java,jparsec,Java,Jparsec,我正在尝试使用JPARSEC3为版本号编写一个简单的解析器。版本号如下所示: 123 1.2.3 123.4 规则是: 最多三个非负整数,由分隔 我有一个版本类,有三种工厂方法: Version.of(int major) Version.of(int major, int minor) Version.of(int major, int minor, int patch) 我想为这三种类型的任何版本编写一个解析器 以下是我到目前为止的情况: static final Parser<I

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

123
1.2.3
123.4
规则是:

最多三个非负整数,由
分隔

我有一个
版本
,有三种工厂方法:

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); 
static final Parser integerParser=Scanners.INTEGER
.map(x->Integer.parseUnsignedInt(x));
静态最终解析器版本Parser1=
integerParser.map(x->Version.of(x));
静态最终解析器版本Parser2=
语法分析器.序列(
integerParser.followerby(Scanners.isChar('.'),
积分parser)
.map(x->Version.of(x.get(0),x.get(1));
静态最终解析器版本Parser3=
语法分析器.序列(
integerParser.followerby(Scanners.isChar('.'),
integerParser.followerby(Scanners.isChar('.'),
积分parser)
.map(x->Version.of(x.get(0)、x.get(1)、x.get(2));
公共静态最终解析器versionParser=
versionParser1.or(versionParser2.or)(versionParser3);
这实际上并没有编译,因为我有
x.get(0)
x
是一个
整数


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

您可以使用
解析器.sequence(p1,p2,…,map)
函数。
Parsers.sequence(p1…).map(f)
行为是除去最后一个解析器之外的所有解析器的输出。然后使用与
或()
不同的组合符组合所有解析器,因为如果解析器使用输入但未成功,则会失败。一个可能的解决办法是


公共静态最终解析器versionParser=
最长的(versionParser1,versionParser2,versionParser3);

谢谢,
最长的
正是我想要的。