1

groovy の上に構築された式エンジンをエンド ユーザーに公開しようとしています。私はいくつかのExcelスタイルのキーワードを持っており、ユーザーは評価のためにそれらのキーワード(実行時に置き換える必要がある)内の変数を使用できます。たとえば、静的キーワード FIRSTCHAR(varName) は文字列の最初の文字を返します。私はこれをある意味で機能させました。

現在の実装 Groovy クラス ローダーをオーバーライドして、次のようなオーバーライドされた PrimaryClassNodeOperation を持つコンパイル ユニットを作成しました。

class MyGroovyClassLoader extends GroovyClassLoader {
    protected CompilationUnit createCompilationUnit(
            CompilerConfiguration config, CodeSource source) {
        CompilationUnit cu = super.createCompilationUnit(config, source);
        cu.addPhaseOperation(new PrimaryClassNodeOperation(){

            @Override
            public void call(SourceUnit source, GeneratorContext context, ClassNode classNode)
                    throws CompilationFailedException {
               source.getAST().getStatementBlock().visit(visitor);
            }
        }, Phases.SEMANTIC_ANALYSIS);
        return cu;
    }
}

次に、訪問者は静的式と変数式を認識します。ただし、このアプローチを使用すると、私は困難を抱えています

1) ドットはプロパティ式と見なされるため、ドット (.) を含む変数名をサポートします。この段階で、プロパティ式を変数式として保持できますか?

2) また、 (left(name,1)=='S' && right(name,1)=='n') [name の最初の文字は s で、最後の文字は n] のような式の場合 - 等号が必要ですダブルイコールではなくシングルイコールであることを確認し、&& または .and() の代わりに /AND を使用して (left(name,1)='S' and right(name,1)='n') のようにします。

このようなカスタマイズを実現する最善の方法は何ですか?

4

1 に答える 1

1

最善のアプローチは、カスタムパーサーを使用して(ユーザーにgroovyを記述させたくないため)、次にgroovyを使用して実際にバックエンドを実装することです。

例:非常にわかりやすい、実装は異なる場合があります

(left(name,1)='S')

上記のスニペットの場合、トークンはmethod:left、args:((var:name)、(val:1))、exp:EQUALS、val:'S'のようになります。

次に、解析されたトークンをGroovyクラスに対して起動できます。もちろん、メソッドと引数は存在しません。いくつかのGroovyトリックを使用して、実際の実装に変換します1

于 2012-11-29T12:05:19.600 に答える