sccdc.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import argparse
  2. import os
  3. from python_generator import PythonGenerator
  4. from csharp_generator import CSharpGenerator
  5. from javascript_generator import JavascriptGenerator
  6. from utils import Logger
  7. from code_generation import Languages, Platforms
  8. from state_linker import StateLinker
  9. from path_calculator import PathCalculator
  10. from constructs import ClassDiagram
  11. from compiler_exceptions import CompilerException
  12. def generate(input_file, output_file, target_language, platform):
  13. class_diagram = createAST(input_file)
  14. generateFromAST(class_diagram, output_file, target_language, platform)
  15. def createAST(input_file):
  16. cd = ClassDiagram(input_file) #create AST
  17. StateLinker().visit(cd) #visitor fixing state references
  18. PathCalculator().visit(cd) #visitor calculating paths
  19. return cd
  20. def generateFromAST(class_diagram, output_file, target_language, platform):
  21. succesfull_generation = False
  22. if target_language == Languages.Python :
  23. succesfull_generation = PythonGenerator().generate(class_diagram, output_file, platform)
  24. elif target_language == Languages.CSharp:
  25. succesfull_generation = CSharpGenerator().generate(class_diagram, output_file, platform)
  26. elif target_language == Languages.Javascript:
  27. succesfull_generation = JavascriptGenerator().generate(class_diagram, output_file, platform)
  28. # let user know ALL classes have been processed and loaded
  29. if succesfull_generation :
  30. Logger.showInfo("The following classes <" + ", ".join(class_diagram.class_names) + "> have been exported to the following file: " + output_file)
  31. def main():
  32. parser = argparse.ArgumentParser()
  33. parser.add_argument('input', help='The path to the XML file to be compiled.')
  34. 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.')
  35. 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)
  36. parser.add_argument('-p', '--platform', type=str, help="Let the compiled code run on top of threads or gameloop. The default is threads.")
  37. parser.add_argument('-l', '--language', type=str, help='Target language, either "csharp" or "python". Defaults to the latter.')
  38. args = vars(parser.parse_args())
  39. #Set verbose
  40. if args['verbose'] is not None:
  41. if args['verbose'] in [-1, 0,1,2] :
  42. Logger.verbose = args['verbose']
  43. else :
  44. Logger.showError("Invalid verbose argument.")
  45. else :
  46. Logger.verbose = 2
  47. #Set source file
  48. source = args['input']
  49. if not source.endswith(".xml") :
  50. Logger.showError("Input file not valid.")
  51. return
  52. #Set target language
  53. if args['language'] :
  54. args['language'] = args['language'].lower()
  55. if args['language'] == "csharp" or args['language'] == "c#" :
  56. target_language = Languages.CSharp
  57. elif args['language'] == "python" :
  58. target_language = Languages.Python
  59. elif args['language'] == "javascript" :
  60. target_language = Languages.Javascript
  61. else :
  62. Logger.showError("Invalid language.")
  63. else :
  64. target_language = Languages.Python
  65. #Set output file
  66. if args['output'] :
  67. output = args['output']
  68. if target_language == Languages.Python and not output.endswith(".py") :
  69. Logger.showError('Output file should end in ".py".')
  70. return
  71. elif target_language == Languages.CSharp and not output.endswith(".cs") :
  72. Logger.showError('Output file should end in ".cs".')
  73. return
  74. else :
  75. output = os.path.splitext(os.path.split(source)[1])[0]
  76. if target_language == Languages.Python :
  77. output += ".py"
  78. elif target_language == Languages.CSharp :
  79. output += ".cs"
  80. #Set platform
  81. if args['platform'] :
  82. args['platform'] = args['platform'].lower()
  83. if args['platform'] == "threads" :
  84. platform = Platforms.Threads
  85. elif args['platform'] == "gameloop" :
  86. platform = Platforms.GameLoop
  87. else :
  88. Logger.showError("Invalid platform.")
  89. return
  90. else :
  91. platform = Platforms.Threads
  92. #Compile
  93. try :
  94. generate(source, output, target_language, platform)
  95. except CompilerException as exception :
  96. Logger.showError(str(exception));
  97. if __name__ == "__main__":
  98. main()