コンパレータのリストを含むバリデーター要素で構成される非常に単純なDSLがあります。
Validator:
'validator' name = ID '{'
comparisons+=Comparison*
'}'
;
Comparison:
LessThan | GreaterThan | EqualTo
;
LessThan:
'lt' value = INT
;
これで私はCコードを生成しようとしています。各バリデーターをループする場所で、(バリデーターの名前に基づいて)Cファイルを作成し、コンパレーターを3項条件ステートメントに配置します。各コンパレータをループすると、ステートメントComparison
を出力するクラスの定義が呼び出されます。if
削減例(CPPUNITに似たものを出力します):
int
main(int argc, char **argv)
{
// parse argv[1] if it exists -> place into i
printf("%c", i < (comparator_value_1) ? '.' : 'F');
printf("%c", i > (comparator_value_2) ? '.' : 'F');
printf("\n");
return 0;
}
私はこれらすべてをうまく機能させることができます。ただし、私が抱えている問題は、Comparison
ジェネレーター内で条件の選択を行わなければならないように見えることです。LessThanのハンドラーを追加してジェネレーターをオーバーライドできないようです。
def compile(Comparison c) '''
printf("%c",
i «IF c.eClass.name.equals("LessThan")»...«ENDIF» «c.value»
? '.' : 'F');
'''
オーバーロードしようとすると:
def compile(LessThan lt) '''
printf("%c", i < «c.value» ? '.' : 'F');
...
'''
オーバーロードされたルーチンは呼び出されませんが、これはせいぜい残念なことです。
これが何らかの違いをもたらす場合、それはによって呼び出されます:
«FOR c:v.comparisons»
«c.compile»
«ENDFOR»
ここで、「v」はバリデーターです。
Xtextにはこの機能がありますか?