def _lift_connection_end(location, end, ref): if len(ref.name) > 1: instance = Reference(ref.name[:-1], Instance, ref.location) else: instance = None return ConnectionEnd(end, instance, Reference(ref.name, Interface, ref.location), location)
def p_component_ref(t): '''component_ref : ID | component_block''' if isinstance(t[1], Component): t[0] = t[1] else: t[0] = Reference(t[1], Component) t[0].filename = t.lexer.filename t[0].lineno = t.lexer.lineno
def _lift_export(location, ref1, ref2): assert isinstance(ref1, Reference) assert isinstance(ref2, Reference) if len(ref1.name) < 2: raise ParseError('illegal source in export statement (these must be ' 'qualified references like "foo.bar")', ref1.location) return Export(Reference(ref1.name[:-1], Instance, ref1.location), Reference(ref1.name, Interface, ref1.location), Reference(ref2.name, Interface, ref2.location), location)
def p_component_ref(t): '''component_ref : ID | component_block''' if isinstance(t[1], Component): t[0] = t[1] else: t[0] = Reference(t[1], Component) t[0].filename = t.lexer.filename t[0].lineno = t.lexer.lineno
def p_dataport_statement(t): '''dataport_statement : dataport ID ID SEMI | maybe dataport ID ID SEMI''' if len(t) == 5: t[0] = Dataport(Reference(t[2], Port), t[3]) else: assert len(t) == 6 t[0] = Dataport(Reference(t[3], Port), t[4], optional=True) t[0].filename = t.lexer.filename t[0].lineno = t.lexer.lineno
def p_consumes_statement(t): '''consumes_statement : consumes ID ID SEMI | maybe consumes ID ID SEMI''' if len(t) == 5: t[0] = Consumes(Reference(t[2], Event), t[3]) else: assert len(t) == 6 t[0] = Consumes(Reference(t[3], Event), t[4], optional=True) t[0].filename = t.lexer.filename t[0].lineno = t.lexer.lineno
def p_uses_statement(t): '''uses_statement : uses ID ID SEMI | maybe uses ID ID SEMI''' if len(t) == 5: t[0] = Uses(Reference(t[2], Procedure), t[3]) else: assert len(t) == 6 t[0] = Uses(Reference(t[3], Procedure), t[4], optional=True) t[0].filename = t.lexer.filename t[0].lineno = t.lexer.lineno
def p_connector_ref(t): '''connector_ref : ID | connector_block''' assert len(t) == 2 if isinstance(t[1], Connector): t[0] = t[1] else: t[0] = Reference(t[1], Connector) t[0].filename = t.lexer.filename t[0].lineno = t.lexer.lineno
def p_connector_ref(t): '''connector_ref : ID | connector_block''' assert len(t) == 2 if isinstance(t[1], Connector): t[0] = t[1] else: t[0] = Reference(t[1], Connector) t[0].filename = t.lexer.filename t[0].lineno = t.lexer.lineno
def p_configuration_sing(t): '''configuration_sing : configuration ID SEMI | configuration_decl''' if len(t) == 4: t[0] = Reference(t[2], Configuration) else: assert len(t) == 2 t[0] = t[1] assert isinstance(t[0], Configuration) t[0].filename = t.lexer.filename t[0].lineno = t.lexer.lineno
def p_configuration_sing(t): '''configuration_sing : configuration ID SEMI | configuration_decl''' if len(t) == 4: t[0] = Reference(t[2], Configuration) else: assert len(t) == 2 t[0] = t[1] assert isinstance(t[0], Configuration) t[0].filename = t.lexer.filename t[0].lineno = t.lexer.lineno
def p_connection_defn(t): '''connection_defn : connection connector_ref ID LPAREN from ID DOT ID COMMA to ID DOT ID RPAREN SEMI | connection connector_ref ID LPAREN from ID COMMA to ID DOT ID RPAREN SEMI | connection connector_ref ID LPAREN from ID DOT ID COMMA to ID RPAREN SEMI''' connector = t[2] name = t[3] if len(t) == 16: from_instance = Reference(t[6], Instance, filename=t.lexer.filename, \ lineno=t.lexer.lineno) from_interface = Reference(t[8], Interface, \ filename=t.lexer.filename, lineno=t.lexer.lineno) to_instance = Reference(t[11], Instance, filename=t.lexer.filename, \ lineno=t.lexer.lineno) to_interface = Reference(t[13], Interface, \ filename=t.lexer.filename, lineno=t.lexer.lineno) else: assert len(t) == 14 # placeholder refering to 'current instance of this component' # required for hierarchical components virtual_instance = Instance(Component(), '__virtual__', filename=t.lexer.filename, lineno=t.lexer.lineno) if t[7] == ',': from_instance = virtual_instance from_interface = Reference(t[6], Interface, \ filename=t.lexer.filename, lineno=t.lexer.lineno) to_instance = Reference(t[9], Instance, filename=t.lexer.filename, \ lineno=t.lexer.lineno) to_interface = Reference(t[11], Interface, \ filename=t.lexer.filename, lineno=t.lexer.lineno) else: assert t[9] == ',' from_instance = Reference(t[6], Instance, \ filename=t.lexer.filename, lineno=t.lexer.lineno) from_interface = Reference(t[8], Interface, \ filename=t.lexer.filename, lineno=t.lexer.lineno) to_instance = virtual_instance to_interface = Reference(t[11], Interface, \ filename=t.lexer.filename, lineno=t.lexer.lineno) t[0] = Connection(connector, name, from_instance, from_interface, \ to_instance, to_interface, filename=t.lexer.filename, \ lineno=t.lexer.lineno)
def _lift_uses(location, *args): if len(args) == 3: optional = True _, type, name = args else: optional = False type, name = args return Uses(Reference(type.name, Procedure, type.location), name, optional, location)
def p_parameter(t): '''parameter : direction type ID | direction type ID LSQUARE RSQUARE | direction ID ID | direction ID ID LSQUARE RSQUARE''' array = len(t) == 6 if isinstance(t[2], Type): t[0] = Parameter(t[3], t[1], t[2], array) else: t[0] = Parameter(t[3], t[1], Reference(t[2], Type, \ filename=t.lexer.filename, lineno=t.lexer.lineno), array) t[0].filename = t.lexer.filename t[0].lineno = t.lexer.lineno
def p_method(t): '''method : void ID LPAREN parameter_list RPAREN SEMI | type ID LPAREN parameter_list RPAREN SEMI | ID ID LPAREN parameter_list RPAREN SEMI''' if t[1] == 'void': return_type = None elif isinstance(t[1], Type): return_type = t[1] else: return_type = Reference(t[1], Type, filename=t.lexer.filename, lineno=t.lexer.lineno) name = t[2] parameters = t[4] assert isinstance(parameters, list) for i in parameters: assert isinstance(i, Parameter) t[0] = Method(name, return_type, parameters, filename=t.lexer.filename, \ lineno=t.lexer.lineno)
def p_setting_defn(t): '''setting_defn : ID DOT ID EQUALS ID SEMI | ID DOT ID EQUALS NUMBER SEMI | ID DOT ID EQUALS DECIMAL SEMI | ID DOT ID EQUALS list SEMI | ID DOT ID EQUALS dict SEMI | ID DOT ID LARROW ID SEMI | setting_defn_string''' if len(t) == 2: t[0] = t[1] else: assert len(t) == 7 if t[4] == '<-': # handle hierarchical attribute case value = Reference(t[5], Attribute) else: value = t[5] t[0] = Setting(t[1], t[3], value, filename=t.lexer.filename, \ lineno=t.lexer.lineno)
def _lift_reference(location, *ids): return Reference(list(ids), None, location)
def _lift_provides(location, ref, id2): return Provides(Reference(ref.name, Procedure, ref.location), id2, location)
def _lift_connector_ref(location, arg): if isinstance(arg, Connector): return arg assert isinstance(arg, Reference) return Reference(arg.name, Connector, location)
def _lift_configuration_sing(location, arg): if isinstance(arg, Configuration): return arg assert isinstance(arg, Reference) return Reference(arg.name, Configuration, location)
def _lift_component_ref(location, arg): if isinstance(arg, Component): return arg assert isinstance(arg, Reference) return Reference(arg.name, Component, location)
def _lift_struct_ref(location, arg): if isinstance(arg, Struct): return arg assert isinstance(arg, Reference) return Reference(arg.name, Struct, location)
def p_provides_statement(t): '''provides_statement : provides ID ID SEMI''' t[0] = Provides(Reference(t[2], Procedure), t[3], \ filename=t.lexer.filename, lineno=t.lexer.lineno)
def p_emits_statement(t): '''emits_statement : emits ID ID SEMI''' t[0] = Emits(Reference(t[2], Event), t[3], filename=t.lexer.filename, \ lineno=t.lexer.lineno)