1

パーボイルド Java ライブラリを使用して単純な XML パーサーを作成しようとしています。

次のコードでは、変数を使用して、終了タグに開始タグと同じ識別子が含まれていることを確認しようとしています。

class SimpleXmlParser2 extends BaseParser<Object> {
    Rule Expression() {
        StringVar id = new StringVar();
        return Sequence(OpenElement(id), ElementContent(), CloseElement(id));
    }

    Rule OpenElement(StringVar id) {        
        return Sequence('<', Identifier(), ACTION(id.set(match())), '>');
    }

    Rule CloseElement(StringVar id) {    
        return Sequence("</", id.get(), '>');                               
    }

    Rule ElementContent() {
        return ZeroOrMore(NoneOf("<>"));
    }

    Rule Identifier() {
        return OneOrMore(CharRange('A', 'z'));
    }    
}

org.parboiled.errors.GrammarException: 'null' cannot be automatically converted to a parser Ruleただし、 ParseRunner を作成すると、上記はエラー メッセージで失敗します。

変数がパーボイルドでどのように使用されるべきかについて、私は基本的な誤解をしているようです。誰でもこれを解決するのを手伝ってもらえますか?

4

1 に答える 1

1

答えが出ました。同じ問題に苦しんでいる可能性のある他のパーボイルド初心者のために、ここにそれを含めてください.

問題は、変数のコンテンツへのアクセスは、ルール構築フェーズではなく、解析フェーズで行われることを保証するパーサー アクションで発生する必要があることでした。

上記のプログラムに対する次の変更により、要素識別子が一致しない場合に解析が失敗することが保証されます。

Rule CloseElement(StringVar id) {    
    return Sequence("</", Identifier(), matchStringVar(id), '>');                               
}

Action matchStringVar(final StringVar var) {
    return new Action() {
        public boolean run(Context ctx) {
            String match = ctx.getMatch();
            return match.equals(var.get());
        }
    };
}
于 2015-02-22T21:25:34.993 に答える