Esempio n. 1
0
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