'Logic from string with space around & and | but none after !.
e.g.
!a & b | c'

@staticmethod
def fromstring(text):

    lexpr = None
    schedop = None
    for term in text.split():
        if (term in '&|'):
            if (schedop is not None):
                raise ValueError(('double    op    forbidden:    "%s    %s"' % (term, schedop)))
            if (lexpr is None):
                raise ValueError(('%s    cannot    be    in    the    beginning    of    expression' % term))
            schedop = term
            continue
        if (('&' in term) or ('|' in term)):
            raise ValueError('&    and    |    must    have    space    around    them')
        if (term[0] == '!'):
            if (len(term) == 1):
                raise ValueError('do    not    include    space    after    "!"')
            term = Not(term[1:])
        if schedop:
            lexpr = Logic.op_2class[schedop](lexpr, term)
            schedop = None
            continue
        if (lexpr is not None):
            raise ValueError(('missing    op    between    "%s"    and    "%s"' % (lexpr, term)))
        lexpr = term
    if (schedop is not None):
        raise ValueError(('premature    end-of-expression    in    "%s"' % text))
    if (lexpr is None):
        raise ValueError(('"%s"    is    empty' % text))
    return lexpr
