def expr_to_obj(s, name=None): """ Construct nineml objects from expressions """ from util import StrToExpr # import re # Is our job already done? if isinstance(s, (RegimeElement)): return s # strip surrounding whitespace s = s.strip() # Do we have a alias? if StrToExpr.is_alias(s): return StrToExpr.alias(s) # re for an expression -> groups into lhs, op, rhs p_eqn = re.compile( r"(?P<lhs>[a-zA-Z_]+[a-zA-Z_0-9]*(/?[a-zA-Z_]+[a-zA-Z_0-9]*)?)\s*(?P<op>[+\-*/:]?=)\s*(?P<rhs>.*)") m = p_eqn.match(s) if not m: raise ValueError, "Not a valid nineml expression: %s" % s # get lhs, op, rhs lhs, op, rhs = [m.group(x) for x in ['lhs', 'op', 'rhs']] # do we have an TimeDerivative? # re for lhs for TimeDerivative p_ode_lhs = re.compile(r"(?:d)([a-zA-Z_]+[a-zA-Z_0-9]*)/(?:d)([a-zA-Z_]+[a-zA-Z_0-9]*)") m = p_ode_lhs.match(lhs) if m: if op != "=": raise ValueError, "TimeDerivative lhs, but op not '=' in %s" % s dep_var = m.group(1) indep_var = m.group(2) return TimeDerivative(dep_var, indep_var, rhs, name=name) # Do we have an Inplace op? # if op in Inplace.op_name_map.keys(): # return Inplace(lhs,op,rhs, name = name) # Do we have an assignment? if op == "=": return StateAssignment(lhs, rhs, name=name) # If we get here, what do we have? raise ValueError, "Cannot map expr '%s' to a nineml Expression" % s