Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * generated by Xtext 2.9.1
- */
- package org.xtext.example.tim.generator
- import org.eclipse.emf.ecore.resource.Resource
- import org.eclipse.xtext.generator.AbstractGenerator
- import org.eclipse.xtext.generator.IFileSystemAccess2
- import org.eclipse.xtext.generator.IGeneratorContext
- import org.xtext.example.tim.timlang.AbstractElement
- import org.xtext.example.tim.timlang.AssignmentExpression
- import org.xtext.example.tim.timlang.Conditional
- import org.xtext.example.tim.timlang.CreationExpression
- import org.xtext.example.tim.timlang.ForLoop
- import org.xtext.example.tim.timlang.Model
- import org.xtext.example.tim.timlang.PrintExpression
- import org.xtext.example.tim.timlang.UnaryExpression
- import org.xtext.example.tim.timlang.impl.AssignmentExpressionImpl
- import org.xtext.example.tim.timlang.impl.ConditionalImpl
- import org.xtext.example.tim.timlang.impl.CreationExpressionImpl
- import org.xtext.example.tim.timlang.impl.ForLoopImpl
- import org.xtext.example.tim.timlang.impl.PrintExpressionImpl
- import org.xtext.example.tim.timlang.impl.UnaryExpressionImpl
- import org.xtext.example.tim.timlang.ExprBody
- import org.xtext.example.tim.timlang.FactorExpr
- import org.xtext.example.tim.timlang.FunctionCall
- import org.xtext.example.tim.timlang.FunctionReturn
- import org.xtext.example.tim.timlang.impl.FunctionParameterImpl
- import org.xtext.example.tim.timlang.impl.ParameterLiteralImpl
- import org.xtext.example.tim.timlang.ParameterLiteral
- import org.xtext.example.tim.timlang.impl.FunctionCallLiteralImpl
- import org.xtext.example.tim.timlang.FunctionCallLiteral
- import org.xtext.example.tim.timlang.impl.FunctionCallImpl
- import org.xtext.example.tim.timlang.FunctionDeclaration
- import org.xtext.example.tim.timlang.impl.FunctionDeclarationImpl
- import org.xtext.example.tim.timlang.FunctionParameter
- /**
- * Generates code from your model files on save.
- *
- * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#code-generation
- */
- class TimlangGenerator extends AbstractGenerator {
- override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) {
- fsa.generateFile(resource.className+".java", toJavaCode(resource.contents.head as Model))
- }
- def className(Resource res) {
- var name = res.URI.lastSegment
- name.substring(0, name.indexOf('.'))
- }
- def toJavaCode(Model m) '''
- public class «m.eResource.className» {
- «FOR be : m.elements»
- «compileFunctionDeclaration(be)»
- «ENDFOR»
- public static void main(String[] args) {
- «FOR ae : m.elements»
- «compileAbstractElement(ae)»
- «ENDFOR»
- }
- }
- '''
- def compileFunctionDeclaration(AbstractElement ae) '''
- «IF ae.class == FunctionDeclarationImpl»
- «compileFuncDeclaration(ae as FunctionDeclaration)»
- «ENDIF»
- '''
- def compileAbstractElement(AbstractElement ae) '''
- «IF ae.class == UnaryExpressionImpl»
- «compileUnaryExpression(ae as UnaryExpression, true)»
- «ELSEIF ae.class == CreationExpressionImpl»
- «compileCreationExpression(ae as CreationExpression)»
- «ELSEIF ae.class == AssignmentExpressionImpl»
- «compileAssignmentExpression(ae as AssignmentExpression)»
- «ELSEIF ae.class == ConditionalImpl»
- «compileCondition(ae as Conditional)»
- «ELSEIF ae.class == ForLoopImpl»
- «compileForLoop(ae as ForLoop)»
- «ELSEIF ae.class == PrintExpressionImpl»
- «compilePrintExpression(ae as PrintExpression)»
- «ELSEIF ae.class == FunctionCallLiteral»
- «compileFunctionCall(ae as FunctionCall)»
- «ELSEIF ae.class == FunctionCallLiteralImpl»
- «compileFunctionCallLiteral(ae as FunctionCallLiteral)»
- «ELSEIF ae.class == FunctionParameterImpl»
- «compileFuncParam(ae as FunctionParameter)»
- «ELSEIF ae.class == FunctionCallImpl»
- «compileFunctionCall(ae as FunctionCall)»
- «ENDIF»
- '''
- def compileFuncDeclaration(FunctionDeclaration func)
- ''' public static «func.type» «func.name» («FOR arg : func.parameters SEPARATOR ','»«arg.type» «arg.name»«ENDFOR»){
- «FOR ae: func.statements»
- «compileAbstractElement(ae)»
- «ENDFOR»
- «func.returnStatement.compileReturn»
- }; '''
- def compileReturn(FunctionReturn returnSt)
- '''return «returnSt.expression.compileAbstractElement»'''
- def compileFuncParam(FunctionParameter param)
- '''«param.name»'''
- def compileFunctionCallLiteral(FunctionCallLiteral func)
- '''«func.value.compileFunctionCall»'''
- def compileFunctionCall(FunctionCall call)
- '''«call.name»(«FOR argument : call.arguments»«argument.name»«ENDFOR»);'''
- def compilePrintExpression(PrintExpression pe) '''
- System.out.println(«IF pe.what.^var != null»«pe.what.^var.name»«ELSE»«pe.what.^val»«ENDIF»);
- '''
- def compileAssignmentExpression(AssignmentExpression ae)
- '''«ae.name.name» = «compileExprBody(ae.^val)»;'''
- def compileUnaryExpression(UnaryExpression ue, boolean solo) '''«IF solo && ue.^val.^var == null»//[int]++ or [int]-- needs to be assigned to variable«ELSE»«IF ue.up != null»«ue.up»«ENDIF»«IF ue.^val.^var != null»«ue.^val.^var.name»«ELSE»«ue.^val.^val»«ENDIF»«IF ue.us != null»«IF ue.^val.^val != null»«IF ue.us == "++"»+ 1 «ELSE»- 1«ENDIF»«ELSE»«ue.us» «ENDIF»«ENDIF»«IF solo»;«ENDIF»«ENDIF»'''
- def compileCreationExpression(CreationExpression ce) '''«IF ce.type == 'string'»String«ELSE»«ce.type»«ENDIF» «ce.name.name»«IF ce.^val != null» = «compileExprBody(ce.^val)»«ENDIF»;'''
- def compileExprBody(ExprBody eb)'''«FOR ex : eb.expr»«compileFactorExpr(ex)»«ENDFOR»'''
- def compileFactorExpr(FactorExpr fe)'''«IF fe.l.class == UnaryExpressionImpl»«compileUnaryExpression(fe.l as UnaryExpression, false)»«ELSE»(«compileFactorExpr(fe.l as FactorExpr)»)«ENDIF»«FOR ar : fe.a»«IF ar.r.class == UnaryExpressionImpl»«ar.m»«compileUnaryExpression(ar.r as UnaryExpression, false)»«ELSE»«ar.m»(«compileFactorExpr(ar.r as FactorExpr)»)«ENDIF»«ENDFOR»'''
- def compileForLoop(ForLoop fp) '''
- for(«IF fp.start != null» «compileAssignmentExpression(fp.start)»«ELSE»;«ENDIF» «compileExprBody(fp.end.left)» «fp.end.op» «compileExprBody(fp.end.right)»;«IF fp.iteration != null»«IF fp.class == AssignmentExpressionImpl»«compileAssignmentExpression(fp.iteration as AssignmentExpression)»«ELSE»«compileUnaryExpression(fp.iteration as UnaryExpression, false)»«ENDIF»«ENDIF») {
- «FOR ae: fp.loop»
- «compileAbstractElement(ae)»
- «ENDFOR»}
- '''
- def compileCondition(Conditional c) '''
- if(«compileExprBody(c.cond.left)» «c.cond.op» «compileExprBody(c.cond.right)») {
- «FOR ae: c.then»
- «compileAbstractElement(ae)»
- «ENDFOR»
- }
- «IF !c.^else.isEmpty»
- else {
- «FOR ae: c.^else»
- «compileAbstractElement(ae)»
- «ENDFOR»
- }
- «ENDIF»
- '''
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement