Child pages
  • Model Transformation with Xtend

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  1. Add a new plug-in project de.cau.cs.rtprak.login.compiler to your workspace. Be sure to uncheck the option This plug-in will make contributions to the UI. Add dependencies to the two projects containing the Turing Machine metamodel and the programming language metamodel.
  2. Add an Xtend Class to your project. The class should be placed in a subpackage where all the transformation code will go, such as de.cau.cs.rtprak.login.compiler.transform.
  3. You will notice that your new class is marked with an error marker because of a missing dependency of the new plug-in project to org.eclipse.xtext.xbase.lib. If you hover over the error with your mouse, you can have Eclipse add all libraries required by Xtend to your project.
  4. Define an entry method for the transformation that takes a TuringMachine instance as an argument and returns a Program. You can use the following definition as a starting point:

    Code Block
    languagejava
    /**
     * Transforms a given Turing Machine into an imperative program model.
     * 
     * @param machine the Turing Machine to transform into an imperative
     *                program.
     * @return a program model that implements the Turing Machine. 
     */
    def Program transformTuringToImperative(TuringMachine machine) {
        // Create the program we will transform the Turing Machine into
        val program = ImperativeFactory::eINSTANCE.createProgram()
    
        // TODO: Initialize program appropriately
    
        // TODO: Call methods that generate the Program model
    
        // Return the transformed program
        program
    } 

    There's a few points to note here:

    • Lines in Xtend code don't have to and with a semicolon.
    • We have been explicit about the method's return type, but we could have easily omitted it, letting Xtend infer the return type.
    • The keyword val declares a constant, while var declares a variable. Try to make do with constants where possible.
    • The methods you call should be declared as def private since they are implementation details and shouldn't be called by other classes.
    • You may be tempted to add a few global variables that hold things like a global input variable or a pointer to the current state. While you could to that, def create methods might offer a better alternative...
  5. Add code to transform the Turing Machine to an imperative program model. The imperative program metamodel contains enough stuff to implement Turing Machines.

...