如何解决如何编写可以在输入为XML的情况下以不同目标语言生成源代码的编译器/解释器?
如果我在错误的地方提问,请原谅并将我定向到更合适的地方
所以我有这样的XML
<range>
unconstrained
<span>
<rttype>
String
</range>
<range>
x type
<span>
<rttype>
int
<assert>
$ > 0
</range>
<range>
Simple class reference
<span>
<rttype>
SimpleClass
</range>
<range>
Simple class set
<span>
<rttype>
ArrayList<SimpleClass>
</range>
<class>
Simple class
<attribute>
x
<range>
x type
</attribute>
<attribute>
state
</attribute>
<action>
initializer
<guarantees>
x has been set to zero
</guarantees>
<pimaction>
.@a x @ = 0
</pimaction>
</action>
<action>
update x
<parameter>
new x
x type
<guarantees>
x has been set to new x
</guarantees>
<pimaction>
.@a x @ = @i new x @
</pimaction>
</action>
<state>
Exists
</state>
<state>
Doesn't exist
</state>
<event>
<<new>>
</event>
<event>
<<destroy>>
</event>
<event>
update
</event>
<transition>
Doesn't exist
<<new>>
Exists
<transitionaction>
initializer
</transition>
<transition>
Exists
<<destroy>>
Doesn't exist
</transition>
<transition>
Exists
update
Exists
<transitionaction>
update x
</transition>
我有一个Java编译器(我们称为ToJavaCompiler),它将把它编译成Java类
还有另一个Java编译器(我们将其称为ToPythonCompiler),也将其编译为Python类。
class SimpleClass:
# State Enum Declaration
# see MMClass.ruleStateEnumDeclaration for implementation
SimpleClass_states = Enum("SimpleClass_states","EXISTS DOESNTEXIST")
# Attribute instance variables
# see MMClass.ruleAttributeInstVarList for implementation
_x: int
_state: SimpleClass_states
# Class level attribute
# All class members accessor
SimpleClassSet: ClassVar[List[SimpleClass]] = []
# Constructor
# See MMClass.ruleConstructorOperation
# See constructEvent.ruleConstructorOperation
def __init__(self):
# requires
# none
# guarantees
# --> x has been set to zero and state == Exists
self._initializer()
self._state = SimpleClass.SimpleClass_states.EXISTS
SimpleClass.SimpleClassSet.append(self)
# Attribute getters
@property
def x(self) -> int:
# requires
# none
# guarantees
# returns the x
return self._x
@property
def state(self) -> SimpleClass_states:
# requires
# none
# guarantees
# returns the state
return self._state
# Pushed events
def destroy(self) -> None:
# requires
# none
# guarantees
# state was Exists --> state == Doesn't exist
if self._state == SimpleClass.SimpleClass_states.EXISTS:
self._state = SimpleClass.SimpleClass_states.DOESNTEXIST
SimpleClass.SimpleClassSet.remove(self)
def update(self,new_x: int) -> None:
# requires
# none
# guarantees
# state was Exists --> x has been set to new x
if self._state == SimpleClass.SimpleClass_states.EXISTS:
self._update_x(new_x)
# Private transition actions
def _initializer(self):
# requires
# none
# guarantees
# x has been set to zero
self._x = 0
def _update_x(self,new_x: int):
# requires
# none
# guarantees
# x has been set to new x
self._x = new_x
问题是我的生产规则需要访问他们正在编译的模型对象中的实例变量数据。
例如,要生成instance variables declarations
,我需要一条用Java这样的代码编写的生产规则,该规则需要访问Context.model()
上的基础模型本身
public void ruleAttributeInstVarList() {
// description
// this rule emits the set of (private) instance variable declarations,if any
//
// Class.#ATTRIBUTE_INST_VAR_LIST -->
// foreach anAttribute in class
// anAttribute.#DEFINE_INST_VAR
//
// requires
// none
// guarantees
// all attributes of this class have been declared as instance variable of the
// PIM Overlay run-time type
if (Context.model().isVerbose()) {
Context.codeOutput().indent();
Context.codeOutput().println("# Attribute instance variables");
Context.codeOutput().println("# see MMClass.ruleAttributeInstVarList for implementation");
Context.codeOutput().println("");
if (!attributeSet.isEmpty()) {
for (Attribute anAttribute : attributeSet) {
anAttribute.ruleDefineInstVarAsPrivate();
}
} else {
if (Context.model().isVerbose()) {
Context.codeOutput().indent();
Context.codeOutput().println("# none");
}
}
Context.codeOutput().indentLess();
} else {
for (Attribute anAttribute : attributeSet) {
anAttribute.ruleDefineInstVarAsPrivate();
}
}
Context.codeOutput().println("");
Context.codeOutput().println("");
}
我想知道是否有一种更简单的方法来添加目标语言或框架,而无需为每种目标语言创建单独的代码库。
例如我现在有一个ToJavaCompiler和ToPythonCompiler两个单独的代码库
所以我在这里问是否有办法创建适合我需要的抽象生产规则解释器/编译器。我的目标是最终通过单一代码库以目标语言或框架(例如Django或Rails)生成模型类,从而允许对不同目标语言/框架进行扩展
如果有一种更适合我尝试的语言,我可以放弃Java。
我想到的其他想法:
- 也许我需要用目标语言编写预期类的模板?
- 也许我需要编写一些与XML输入配合使用的自定义DSL?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。