sccdtnc.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import argparse
  2. import os
  3. from shell import Shell
  4. from code_generation import Languages, Platforms
  5. from utils import Logger
  6. from compiler_exceptions import CompilerException
  7. from python_generator import PythonGenerator
  8. from javascript_generator import JavascriptGenerator
  9. from sccd_asg_mapper import SCCD_ASG_Mapper
  10. pathname = os.path.dirname(os.path.realpath(__file__))
  11. from sccd_to_xml_JS import XML2JavaScriptRules
  12. from sccd_to_xml_PY import XML2PythonRules
  13. from mvk_loader import MvKLoader
  14. from sccd_to_xml import SCCD_to_XML
  15. from state_linker import StateLinker
  16. from path_calculator import PathCalculator
  17. from constructs import ClassDiagram
  18. def createAST(input_file):
  19. cd = ClassDiagram(input_file) #create AST
  20. StateLinker().visit(cd) #visitor fixing state references
  21. PathCalculator().visit(cd) #visitor calculating paths
  22. return cd
  23. def generateFromAST(class_diagram, output_file, target_language, platform):
  24. succesfull_generation = False
  25. if target_language == Languages.Python :
  26. succesfull_generation = PythonGenerator().generate(class_diagram, output_file, platform)
  27. elif target_language == Languages.Javascript:
  28. succesfull_generation = JavascriptGenerator().generate(class_diagram, output_file, platform)
  29. # let user know ALL classes have been processed and loaded
  30. if succesfull_generation :
  31. Logger.showInfo("The following classes <" + ", ".join(class_diagram.class_names) + "> have been exported to the following file: " + output_file)
  32. def main():
  33. mapper = SCCD_ASG_Mapper()
  34. parser = argparse.ArgumentParser()
  35. parser.add_argument('input', help='The path to the XML file to be compiled.')
  36. parser.add_argument('-o', '--output', type=str, help='The path to the generated code. Defaults to the same name as the input file but with matching extension.')
  37. parser.add_argument('-v', '--verbose', type=int, help='2 = all output; 1 = only warnings and errors; 0 = only errors; -1 = no output. Defaults to 2.', default = 2)
  38. parser.add_argument('-p', '--platform', type=str, help="Let the compiled code run on top of threads or gameloop. The default is threads.")
  39. parser.add_argument('-l', '--language', type=str, help='Target language, either "csharp" or "python". Defaults to the latter.')
  40. parser.add_argument('-m', '--mvklocation', type=str, help='Location in the Modelverse. After compilation the modelverse shell is opened.')
  41. args = vars(parser.parse_args())
  42. #Set verbose
  43. if args['verbose'] is not None:
  44. if args['verbose'] in [-1, 0,1,2] :
  45. Logger.verbose = args['verbose']
  46. else :
  47. Logger.showError("Invalid verbose argument.")
  48. else :
  49. Logger.verbose = 2
  50. #Set source file
  51. source = args['input'].lower()
  52. if not source.endswith(".sccd") :
  53. Logger.showError("Input file not valid.")
  54. return
  55. #Set target language
  56. if args['language'] :
  57. args['language'] = args['language'].lower()
  58. if args['language'] == "python" :
  59. target_language = Languages.Python
  60. elif args['language'] == "javascript" :
  61. target_language = Languages.Javascript
  62. else :
  63. Logger.showError("Invalid language.")
  64. else :
  65. target_language = Languages.Python
  66. #Set output file
  67. if args['output'] :
  68. output = args['output'].lower()
  69. if target_language == Languages.Python and not output.endswith(".py") :
  70. Logger.showError('Output file should end in ".py".')
  71. return
  72. else :
  73. output = os.path.splitext(os.path.split(source)[1])[0]
  74. if target_language == Languages.Python :
  75. output += ".py"
  76. #Set platform
  77. if args['platform'] :
  78. args['platform'] = args['platform'].lower()
  79. if args['platform'] == "threads" :
  80. platform = Platforms.Threads
  81. elif args['platform'] == "gameloop" :
  82. platform = Platforms.GameLoop
  83. else :
  84. Logger.showError("Invalid platform.")
  85. return
  86. else :
  87. platform = Platforms.Threads
  88. if args['mvklocation'] :
  89. mvklocation = args['mvklocation']
  90. modelverseshell = True
  91. else:
  92. mvklocation = 'temporaryLocation'
  93. modelverseshell = False
  94. context = MvKLoader(mapper.rules, mapper.metamodel_location, mapper.metamodel_path, mvklocation).load(source)
  95. if(target_language == Languages.Javascript):
  96. compiler = SCCD_to_XML(XML2JavaScriptRules().rules, context.mvk)
  97. else:
  98. compiler = SCCD_to_XML(XML2PythonRules().rules, context.mvk)
  99. compiler.compile(context.target+'.'+context.modelname)
  100. if os.path.exists(output+'.xml'):
  101. os.remove(output+'.xml')
  102. compiler.outputTo(output+'.xml')
  103. #Compile
  104. try :
  105. class_diagram = createAST(output+'.xml')
  106. generateFromAST(class_diagram, output, target_language, platform)
  107. except CompilerException as exception :
  108. Logger.showError(str(exception));
  109. if(modelverseshell):
  110. shell = Shell()
  111. shell.mvk = context.mvk
  112. shell.setupCommandLine()
  113. if __name__ == "__main__":
  114. main()