如何编写可以在输入为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。

我想到的其他想法:

  1. 也许我需要用目标语言编写预期类的模板?
  2. 也许我需要编写一些与XML输入配合使用的自定义DSL?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)