我有一个非常简单的 DSL,它由一个包含比较器列表的验证器元素组成:
Validator:
'validator' name = ID '{'
comparisons+=Comparison*
'}'
;
Comparison:
LessThan | GreaterThan | EqualTo
;
LessThan:
'lt' value = INT
;
有了这个,我正在尝试生成 C 代码。在我遍历每个验证器的地方,创建一个 C 文件(基于验证器的名称)并将比较器放入三元条件语句中。当我遍历每个比较器时,它会调用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有这个能力吗?