Ejemplo n.º 1
0
    def parse_string(self, strinput):
        lines = []
        pstring = self.parser.parseString(strinput, parseAll=True)

        hts = HTS("STS")
        invar_props = []
        ltl_props = []

        modules = []
        modulesdic = {}

        name = MAIN
        mainmodule = None

        for psts in pstring.stss:

            var_str = []
            state_str = []
            input_str = []
            output_str = []
            sub_str = []
            par_str = []
            init_str = []
            trans_str = []
            invar_str = []

            if len(psts.moduledef) > 0:
                name = psts.moduledef[1]

            if len(psts.pardef) > 0:
                vardefs = psts.pardef

                for vardef in self._split_list(vardefs, T_CM):
                    varname = vardef[0]
                    vartype = vardef[2]

                    try:
                        vartype = parse_typestr(vartype)
                        par_str.append((varname, vartype))
                    except UndefinedSymbolError:
                        varpar = vardef[4:-1]
                        par_str.append((varname, vartype, varpar))

            dpsts = dict(psts)

            if P_VARDEFS in dpsts:
                if self.pyparsing_version == PYPARSING_220:
                    vardefs = list(dict(psts.var)[P_VARDEFS])
                else:
                    vardefs = list(dpsts[P_VARDEFS])

                for vardef in self._split_list(vardefs, T_SC):
                    varname = vardef[0]
                    if varname[0] == "'":
                        varname = varname[1:-1]

                    vartype = vardef[2]
                    try:
                        vartype = parse_typestr(vartype)
                        var_str.append((varname, vartype))
                    except UndefinedSymbolError:
                        varpar = vardef[4:-1]
                        sub_str.append(
                            (varname, vartype, self._split_list(varpar, T_CM)))

            if P_STATEDEFS in dpsts:
                if self.pyparsing_version == PYPARSING_220:
                    statedefs = list(dict(psts.state)[P_STATEDEFS])
                else:
                    statedefs = list(dpsts[P_STATEDEFS])

                for statedef in self._split_list(statedefs, T_SC):
                    statename = statedef[0]
                    if statename[0] == "'":
                        statename = statename[1:-1]

                    statetype = parse_typestr(statedef[2])
                    state_str.append((statename, statetype))

            if P_INPUTDEFS in dpsts:
                if self.pyparsing_version == PYPARSING_220:
                    inputdefs = list(dict(psts.input)[P_INPUTDEFS])
                else:
                    inputdefs = list(dpsts[P_INPUTDEFS])

                for inputdef in self._split_list(inputdefs, T_SC):
                    inputname = inputdef[0]
                    if inputname[0] == "'":
                        inputname = inputname[1:-1]

                    inputtype = parse_typestr(inputdef[2])
                    input_str.append((inputname, inputtype))

            if P_OUTPUTDEFS in dpsts:
                if self.pyparsing_version == PYPARSING_220:
                    outputdefs = list(dict(psts.output)[P_OUTPUTDEFS])
                else:
                    outputdefs = list(dpsts[P_OUTPUTDEFS])

                for outputdef in self._split_list(outputdefs, T_SC):
                    outputname = outputdef[0]
                    if outputname[0] == "'":
                        outputname = outputname[1:-1]

                    outputtype = parse_typestr(outputdef[2])
                    output_str.append((outputname, outputtype))

            if P_INIT in dpsts:
                if self.pyparsing_version == PYPARSING_220:
                    inits = list(dict(psts.init)[P_FORMULAE])
                else:
                    inits = list(dpsts[P_INIT])[1:]

                for i in range(0, len(inits), 2):
                    init_str.append(inits[i])

            if P_TRANS in dpsts:
                if self.pyparsing_version == PYPARSING_220:
                    transs = list(dict(psts.trans)[P_FORMULAE])
                else:
                    transs = list(dpsts[P_TRANS])[1:]
                for i in range(0, len(transs), 2):
                    trans_str.append(transs[i])

            if P_INVAR in dpsts:
                if self.pyparsing_version == PYPARSING_220:
                    invars = list(dict(psts.invar)[P_FORMULAE])
                else:
                    invars = list(dpsts[P_INVAR])[1:]
                for i in range(0, len(invars), 2):
                    invar_str.append(invars[i])

            module = STSModule(name, var_str, state_str, input_str, output_str,
                               par_str, init_str, invar_str, trans_str,
                               sub_str)
            modules.append(module)

            if name == MAIN:
                mainmodule = module
            else:
                modulesdic[name] = module

        hts = self.generate_HTS(mainmodule, modulesdic)
        hts.flatten()
        return (hts, invar_props, ltl_props)
Ejemplo n.º 2
0
    def parse_string(self, strinput):
        lines = []
        pstring = self.parser.parseString(strinput, parseAll=True)

        hts = HTS("STS")
        invar_props = []
        ltl_props = []

        modules = []
        modulesdic = {}

        name = MAIN
        mainmodule = None

        for psts in pstring.stss:

            var_str = []
            state_str = []
            input_str = []
            output_str = []
            sub_str = []
            par_str = []
            init_str = []
            trans_str = []
            invar_str = []

            if len(psts.moduledef) > 0:
                name = psts.moduledef[1]

            if len(psts.pardef) > 0:
                vardefs = psts.pardef

                for vardef in self._split_list(vardefs, T_CM):
                    varname = vardef[0]
                    vartype = vardef[2]
                    varpar = vardef[4:-1] if vartype != T_BOOL else None

                    par_str.append((varname, vartype, varpar))

            if P_VARDEFS in dict(psts):
                vardefs = list(dict(psts.var)[P_VARDEFS])

                for vardef in self._split_list(vardefs, T_SC):
                    varname = vardef[0]
                    if varname[0] == "'":
                        varname = varname[1:-1]

                    vartype = vardef[2]
                    varpar = vardef[4:-1] if vartype != T_BOOL else None

                    if vartype in (T_BV, T_BOOL):
                        var_str.append((varname, vartype, varpar))
                    else:
                        sub_str.append(
                            (varname, vartype, self._split_list(varpar, T_CM)))

            if P_STATEDEFS in dict(psts):
                statedefs = list(dict(psts.state)[P_STATEDEFS])

                for statedef in self._split_list(statedefs, T_SC):
                    statename = statedef[0]
                    if statename[0] == "'":
                        statename = statename[1:-1]

                    statetype = statedef[2]
                    statepar = statedef[4:-1] if statetype != T_BOOL else None

                    state_str.append((statename, statetype, statepar))

            if P_INPUTDEFS in dict(psts):
                inputdefs = list(dict(psts.input)[P_INPUTDEFS])

                for inputdef in self._split_list(inputdefs, T_SC):
                    inputname = inputdef[0]
                    if inputname[0] == "'":
                        inputname = inputname[1:-1]

                    inputtype = inputdef[2]
                    inputpar = inputdef[4:-1] if inputtype != T_BOOL else None

                    input_str.append((inputname, inputtype, inputpar))

            if P_OUTPUTDEFS in dict(psts):
                outputdefs = list(dict(psts.output)[P_OUTPUTDEFS])

                for outputdef in self._split_list(outputdefs, T_SC):
                    outputname = outputdef[0]
                    if outputname[0] == "'":
                        outputname = outputname[1:-1]

                    outputtype = outputdef[2]
                    outputpar = outputdef[
                        4:-1] if outputtype != T_BOOL else None

                    output_str.append((outputname, outputtype, outputpar))

            if P_INIT in dict(psts):
                inits = list(dict(psts.init)[P_FORMULAE])
                for i in range(0, len(inits), 2):
                    init_str.append(inits[i])

            if P_TRANS in dict(psts):
                transs = list(dict(psts.trans)[P_FORMULAE])
                for i in range(0, len(transs), 2):
                    trans_str.append(transs[i])

            if P_INVAR in dict(psts):
                invars = list(dict(psts.invar)[P_FORMULAE])
                for i in range(0, len(invars), 2):
                    invar_str.append(invars[i])

            module = STSModule(name, var_str, state_str, input_str, output_str,
                               par_str, init_str, invar_str, trans_str,
                               sub_str)
            modules.append(module)

            if name == MAIN:
                mainmodule = module
            else:
                modulesdic[name] = module

            #hts.add_ts(self.generate_STS(var_str, init_str, invar_str, trans_str))

        hts = self.generate_HTS(mainmodule, modulesdic)
        hts.flatten()
        return (hts, invar_props, ltl_props)