Exemplo n.º 1
0
def _ThreeArgs(argv):
    """Returns an expression tree to be evaluated."""
    a0, a1, a2 = argv

    # NOTE: Order is important here.

    binary_id = _BINARY_LOOKUP.get(a1)
    if binary_id is not None:
        left = word.StringWord(Id.Word_Compound, a0)
        right = word.StringWord(Id.Word_Compound, a2)
        return bool_expr.BoolBinary(IdInstance(binary_id), left, right)

    if a1 == '-a':
        left = _StringWordTest(a0)
        right = _StringWordTest(a2)
        return bool_expr.LogicalAnd(left, right)

    if a1 == '-o':
        left = _StringWordTest(a0)
        right = _StringWordTest(a2)
        return bool_expr.LogicalOr(left, right)

    if a0 == '!':
        child = _TwoArgs(argv[1:])
        return bool_expr.LogicalNot(child)

    if a0 == '(' and a2 == ')':
        return _StringWordTest(a1)

    p_die('Syntax error: binary operator expected, got %r (3 args)', a1)
Exemplo n.º 2
0
    def ReadWord(self, unused_lex_mode):
        """Interface for bool_parse.py."""
        if self.i == self.n:
            # Does it make sense to define Eof_Argv or something?
            w = word.StringWord(Id.Eof_Real, '')
            # TODO: Add a way to show this.  Show 1 char past the right-most spid of
            # the last word?  But we only have the left-most spid.
            w.spids.append(const.NO_INTEGER)
            return w

        #log('ARGV %s i %d', self.argv, self.i)
        s = self.arg_vec.strs[self.i]
        left_spid = self.arg_vec.spids[self.i]
        self.i += 1

        # default is an operand word
        id_int = (_UNARY_LOOKUP.get(s) or _BINARY_LOOKUP.get(s)
                  or _OTHER_LOOKUP.get(s))

        id_ = Id.Word_Compound if id_int is None else IdInstance(id_int)

        # NOTE: We only have the left spid now.  It might be useful to add the
        # right one.
        w = word.StringWord(id_, s)
        w.spids.append(left_spid)
        return w
Exemplo n.º 3
0
    def ReadWord(self, unused_lex_mode):
        if self.i == self.n:
            # NOTE: Could define something special
            return word.StringWord(Id.Eof_Real, '')

        #log('ARGV %s i %d', self.argv, self.i)
        s = self.argv[self.i]
        self.i += 1

        # default is an operand word
        id_int = (_UNARY_LOOKUP.get(s) or _BINARY_LOOKUP.get(s)
                  or _OTHER_LOOKUP.get(s))

        id_ = Id.Word_Compound if id_int is None else IdInstance(id_int)
        return word.StringWord(id_, s)
Exemplo n.º 4
0
def _TwoArgs(argv):
    """Returns an expression tree to be evaluated."""
    a0, a1 = argv
    if a0 == '!':
        return bool_expr.LogicalNot(_StringWordTest(a1))
    unary_id = _UNARY_LOOKUP.get(a0)
    if unary_id is None:
        # TODO:
        # - syntax error
        # - separate lookup by unary
        p_die('Expected unary operator, got %r (2 args)', a0)
    child = word.StringWord(Id.Word_Compound, a1)
    return bool_expr.BoolUnary(IdInstance(unary_id), child)
Exemplo n.º 5
0
def _StringWordTest(s):
    # TODO: Could be Word_String
    return bool_expr.WordTest(word.StringWord(Id.Word_Compound, s))