Source code for slacm.parser

'''
Created on Sep 18, 2020

@author: esdev
'''

from os.path import join
from textx.metamodel import metamodel_from_file
from textx.export import metamodel_export, model_export
from textx.exceptions import TextXSemanticError, TextXSyntaxError
import textx.model

import sys
import json
import os
import argparse

[docs] class LangError(Exception): ''' Parser language exception class ''' def __init__(self, message): super(LangError, self).__init__(message)
[docs] class App(object): ''' Internal 'App' class representing an application model. Holds the relevant content of the model. ''' def __init__(self,name,messages,libraries,components,actors,deploys): self.name = name self.messages = messages self.libraries = libraries self.components = components self.actors = actors self.deploys = deploys
[docs] def parse_model(modelName,verbose=False,debug=False,export=False): ''' Parse model file and construct a model object (using textX). :param modelName: name of model file :param verbose: verbose operation :param debug: debug mode for parser :param export: if true meta and model will be experted into a dot file. ''' dir_path = os.path.dirname(os.path.abspath(__file__)) this_folder = os.getcwd() meta = metamodel_from_file(join(dir_path,'slacm.tx'), classes=[App], debug=debug) if export: metamodel_export(meta, join(this_folder, 'slacm_meta.dot')) try: model = meta.model_from_file(join(os.getcwd(),modelName)) except IOError as e: errMsg = "I/O error({0}): {1}".format(e.errno, e.strerror) if verbose: print (errMsg) raise LangError(errMsg) except TextXSyntaxError as e: errMsg = "Syntax error: %s" % e.args if verbose: print (errMsg) raise LangError(errMsg) except TextXSemanticError as e: errMsg = "Semantic error: %s" % e.args if verbose: print (errMsg) raise LangError(errMsg) except Exception as e: errMsg = "Unexpected error %s:%s" % (sys.exc_info()[0],e.args()) if verbose: print (errMsg) raise LangError(errMsg) if export: model_export(model, join(this_folder, 'slacm_model.dot')) return model
if __name__ == '__main__': pass