2

コンポーネントのレイアウトを記述しているxml構成ファイルを使用するアプリケーションがあります。現在、グリッド、水平、垂直の3つのレイアウトがあります。この3つを使ったレイアウトを作りたいです。

最後に、これを行う方法を見つけました。レイアウトクラスごとに、そのレイアウトクラスの保護されたパッケージ保護フィールドを定義し、宣言でそれらを初期化します。私の一般的なルールはそれらのフィールドを使用します。覚えておくべき唯一のことは、それらすべてに独自のスタックがあることです。これは、次のようなコードを呼び出すことができるため、問題ではありませんpush(gridLayoutParser.pop())

1つのパーサーの使用例を次に示します。

最初の子パーサー:

 public static class P1 extends BaseParser<String> {
    public Rule FullContent() {
        return Sequence(Content(), EOI);
    }

    public Rule Content() {
        return Sequence(
                push(""),
                String("STRING1"),
                swap() && push(pop() + " fromParser1 "),
                String(" SOMESTRING1 ")
        );
    }
}

2番目は同じです:

public static class P2 extends BaseParser<String> {
    public Rule FullContent() {
        return Sequence(Content(), EOI);
    }

    public Rule Content() {
        return Sequence(
                push(""),
                String("STRING2"),
                swap() && push(pop() + " fromParser2 "),
                String(" SOMESTRING2 ")
        );
    }
}

そして、ここでそれらの両方を使用するパーサー:

パブリッククラスOPはBaseParserを拡張します{

protected P1 bool1 = Parboiled.createParser(P1.class);
protected P2 bool2 = Parboiled.createParser(P2.class);

public Rule FullContent() {
    return Sequence(
            push(""),
            OneOrMore(
                    FirstOf(
                            Sequence(
                                    bool1.Content(),
                                    swap() && push(pop() + bool1.pop())
                                    ),
                            Sequence(
                                    bool2.Content(),
                                    swap() && push(pop() + bool2.pop())
                            )
                    )

            )
    );
}

}

私にとってはうまくいきます。しかし、より複雑な文法でも問題ありませんか?

4

2 に答える 2

1

答えはパーボイルドの作者、マティアスによって与えられました。

http://users.parboiled.org/A-way-of-using-multiple-parsers-in-one-is-this-a-safe-code-td3512129.html#a3518992

一般に、次のようにメソッドsetContext()をオーバーライドすると、共有コンテキストを使用することも可能です(push(p1.pop())を使用する必要はありません)。

    public void setContext(Context<V> context) { 
       P1.setContext(context); 
       P2.setContext(context);
       super.setContext(context); 
    } 
于 2011-11-18T16:28:38.480 に答える
0

はい、パーサーが同じタイプの値を生成する限り、問題はまったくありません。

生成された値のタイプが異なっていても、このアプローチは機能しますが、結果の値を変換またはキャストするには、いくつかのフープをジャンプする必要がありますが、確かに可能です。

于 2013-10-04T09:47:20.913 に答える