def main(): opts = options.parse_options() if opts.version: print "prophyc {}".format(__version__) sys.exit(0) if not opts.input_files: sys.exit("prophyc: error: missing input file") if opts.isar: from prophyc.parsers.isar import IsarParser parser = IsarParser() parse_error = None elif opts.sack: if not module_exists("clang"): sys.exit("Sack input requires clang and it's not installed") from prophyc.parsers.sack import SackParser parser = SackParser(opts.include_dirs) parse_error = None else: from prophyc.parsers.prophy import ProphyParser, ParseError parser = ProphyParser() parse_error = ParseError serializers = [] if opts.python_out: from prophyc.generators.python import PythonGenerator serializers.append(PythonGenerator(opts.python_out)) if opts.cpp_out: from prophyc.generators.cpp import CppGenerator serializers.append(CppGenerator(opts.cpp_out)) if not serializers: sys.exit("Missing output directives") for input_file in opts.input_files: try: nodes = parser.parse(input_file) except parse_error as e: sys.exit('\n'.join(e.errors)) if opts.patch: from prophyc import patch patches = patch.parse(opts.patch) patch.patch(nodes, patches) model.topological_sort(nodes) model.cross_reference(nodes) model.evaluate_kinds(nodes) for serializer in serializers: basename = get_basename(input_file) serializer.serialize(nodes, basename)
def get_serializers(opts): serializers = [] if opts.python_out: from prophyc.generators.python import PythonGenerator serializers.append(PythonGenerator(opts.python_out)) if opts.cpp_out: from prophyc.generators.cpp import CppGenerator serializers.append(CppGenerator(opts.cpp_out)) if opts.cpp_full_out: from prophyc.generators.cpp_full import CppFullGenerator serializers.append(CppFullGenerator(opts.cpp_full_out)) return serializers
def serialize(nodes): return PythonGenerator().generate_definitions(nodes)
def test_of_PythonGenerator(): ih = [] th = [] for x in range(20, 200, 60): ih.append(model.Include("test_include_" + str(x), [])) th.append(model.Typedef("td_elem_name_" + str(x), "td_elem_val_" + str(x))) th.append(model.Typedef("td_elem_name_" + str(x), "i_td_elem_val_" + str(x))) th.append(model.Typedef("td_elem_name_" + str(x), "u_td_elem_val_" + str(x))) enum = [] for x in range(1, 100, 30): enum.append((model.EnumMember("elem_" + str(x), "val_" + str(x)))) name = "MAC_L2CallConfigResp" members = [model.StructMember('messageResult', 'SMessageResult')] msg_h = model.Struct(name, members) nodes = [] nodes += ih nodes += [model.Constant("C_A", "5"), model.Constant("C_B", "5"), model.Constant("C_C", "C_B + C_A")] nodes += th nodes += [model.Enum("test", enum)] nodes += [msg_h] ps = PythonGenerator() output = ps.serialize_string(nodes) ref = """\ import prophy from test_include_20 import * from test_include_80 import * from test_include_140 import * C_A = 5 C_B = 5 C_C = C_B + C_A td_elem_name_20 = td_elem_val_20 td_elem_name_20 = i_td_elem_val_20 td_elem_name_20 = u_td_elem_val_20 td_elem_name_80 = td_elem_val_80 td_elem_name_80 = i_td_elem_val_80 td_elem_name_80 = u_td_elem_val_80 td_elem_name_140 = td_elem_val_140 td_elem_name_140 = i_td_elem_val_140 td_elem_name_140 = u_td_elem_val_140 class test(prophy.with_metaclass(prophy.enum_generator, prophy.enum)): _enumerators = [('elem_1', val_1), ('elem_31', val_31), ('elem_61', val_61), ('elem_91', val_91)] elem_1 = val_1 elem_31 = val_31 elem_61 = val_61 elem_91 = val_91 class MAC_L2CallConfigResp(prophy.with_metaclass(prophy.struct_generator, prophy.struct)): _descriptor = [('messageResult', SMessageResult)] """ assert ref == output
def test_of_PythonGenerator(): ih = [] th = [] for x in range(20, 200, 60): ih.append(model.Include("test_include_" + str(x))) th.append( model.Typedef("td_elem_name_" + str(x), "td_elem_val_" + str(x))) th.append( model.Typedef("td_elem_name_" + str(x), "i_td_elem_val_" + str(x))) th.append( model.Typedef("td_elem_name_" + str(x), "u_td_elem_val_" + str(x))) enum = [] for x in range(1, 100, 30): enum.append(("elem_" + str(x), "val_" + str(x))) name = "MAC_L2CallConfigResp" members = [model.StructMember('messageResult', 'SMessageResult')] msg_h = model.Struct(name, members) nodes = [] nodes += ih nodes += [ model.Constant("C_A", "5"), model.Constant("C_B", "5"), model.Constant("C_C", "C_B + C_A") ] nodes += th nodes += [model.Enum("test", enum)] nodes += [msg_h] ps = PythonGenerator() output = ps.serialize_string(nodes) ref = """\ import prophy from test_include_20 import * from test_include_80 import * from test_include_140 import * C_A = 5 C_B = 5 C_C = C_B + C_A td_elem_name_20 = td_elem_val_20 td_elem_name_20 = i_td_elem_val_20 td_elem_name_20 = u_td_elem_val_20 td_elem_name_80 = td_elem_val_80 td_elem_name_80 = i_td_elem_val_80 td_elem_name_80 = u_td_elem_val_80 td_elem_name_140 = td_elem_val_140 td_elem_name_140 = i_td_elem_val_140 td_elem_name_140 = u_td_elem_val_140 class test(prophy.enum): __metaclass__ = prophy.enum_generator _enumerators = [('elem_1', val_1), ('elem_31', val_31), ('elem_61', val_61), ('elem_91', val_91)] elem_1 = val_1 elem_31 = val_31 elem_61 = val_61 elem_91 = val_91 class MAC_L2CallConfigResp(prophy.struct): __metaclass__ = prophy.struct_generator _descriptor = [('messageResult', SMessageResult)] """ assert ref == output