我正在尝试设计一个小 DSL 来检查变量的约束。我现在的语法是这样的:
Start:
varDeclarations += XVariableDeclaration*
rules+=Constraint*;
Constraint:
{Constraint}
'FOR' 'PAYLOAD' payload=PAYLOAD 'ELEMENT' element=ID 'CONSTRAINED BY' constraint=XExpression;
PAYLOAD:
"SimulationSessionEvents"
|"stacons"
|"any"
;
我想生成一个只包含一个方法的类的实例,该方法将一个值作为输入,将其映射到约束中包含的唯一变量(这也是声明的唯一变量),并检查约束是否得到满足。
然后这些实例将被另一个类使用,该类通过每个实例传递一个值,检查它的约束是否得到满足。
正如我所看到的,我有两个选择:
为约束类显式生成代码,在这种情况下,我可以只使用
XBaseCompiler
生成表达式评估代码。但是,如果有一种方法可以直接在内存中创建对象,那么我将不得不以某种方式加载这些类,这似乎很不优雅。使用
ModelInferrer
直接在内存中生成可以传递给其他类的对象,因此不需要加载类。在这种情况下,我不确定如何生成 xbase 表达式评估代码。
在阅读了所有 xtext 文档/教程并使用示例后,我留下了以下问题:
就可扩展性而言,哪个是“最佳”方法(我以后可能想扩展语法和/或他生成的类的功能)?如果我遵循 ModelInferrer 方法,我将如何处理事情?有没有其他方法可以做到这一点?
任何帮助将非常感激