用于版本号的 JParsec
JParsec for version numbers
我正在尝试使用 JParsec 3 为版本号编写一个简单的解析器。版本号如下所示:
123
1.2.3
123.4
规则是:
Up to three non-negative integers, separated by .
我有一个 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?
您可以改用 Parsers.sequence(p1,p2,...,map)
函数。 Parsers.sequence(p1...).map(f)
行为是丢弃除最后一个之外的所有解析器的输出。然后使用与 or()
不同的组合器组合所有解析器,因为如果解析器消耗输入但不成功,它将失败。一个可能的解决方案是
public static final Parser<Version> versionParser =
Parsers.longest(versionParser1, versionParser2, versionParser3);
我正在尝试使用 JParsec 3 为版本号编写一个简单的解析器。版本号如下所示:
123
1.2.3
123.4
规则是:
Up to three non-negative integers, separated by
.
我有一个 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?
您可以改用 Parsers.sequence(p1,p2,...,map)
函数。 Parsers.sequence(p1...).map(f)
行为是丢弃除最后一个之外的所有解析器的输出。然后使用与 or()
不同的组合器组合所有解析器,因为如果解析器消耗输入但不成功,它将失败。一个可能的解决方案是
public static final Parser<Version> versionParser =
Parsers.longest(versionParser1, versionParser2, versionParser3);