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') のようにします。
このようなカスタマイズを実現する最善の方法は何ですか?