2

JParsec 3 を使用してバージョン番号の単純なパーサーを作成しようとしています。バージョン番号は次のようになります。

123
1.2.3
123.4

ルールは次のとおりです。

で区切られた最大 3 つの負でない整数.

私はVersion class3つのファクトリメソッドを持っています:

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

3 つのタイプのいずれかのバージョンのパーサーを書きたいと思います。

これが私がこれまでに持っているものです:

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)場所xInteger.

ここで 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 に答える