def _ThreeArgs(w_parser):
    'Returns an expression tree to be evaluated.'
    w0 = w_parser.Read()
    w1 = w_parser.Read()
    w2 = w_parser.Read()
    binary_id = match.BracketBinary(w1.s)
    if (binary_id != Id.Undefined_Tok):
        return bool_expr.Binary(binary_id, w0, w2)
    if (w1.s == '-a'):
        return bool_expr.LogicalAnd(bool_expr.WordTest(w0), bool_expr.WordTest(w2))
    if (w1.s == '-o'):
        return bool_expr.LogicalOr(bool_expr.WordTest(w0), bool_expr.WordTest(w2))
    if (w0.s == '!'):
        w_parser.Rewind(2)
        child = _TwoArgs(w_parser)
        return bool_expr.LogicalNot(child)
    if ((w0.s == '(') and (w2.s == ')')):
        return bool_expr.WordTest(w1)
    p_die('Expected binary operator, got %r (3 args)', w1.s, word=w1)
Returns an expression tree to be evaluated.
def _ThreeArgs(w_parser):
    
    w0 = w_parser.Read()
    w1 = w_parser.Read()
    w2 = w_parser.Read()
    binary_id = match.BracketBinary(w1.s)
    if (binary_id != Id.Undefined_Tok):
        return bool_expr.Binary(binary_id, w0, w2)
    if (w1.s == '-a'):
        return bool_expr.LogicalAnd(bool_expr.WordTest(w0), bool_expr.WordTest(w2))
    if (w1.s == '-o'):
        return bool_expr.LogicalOr(bool_expr.WordTest(w0), bool_expr.WordTest(w2))
    if (w0.s == '!'):
        w_parser.Rewind(2)
        child = _TwoArgs(w_parser)
        return bool_expr.LogicalNot(child)
    if ((w0.s == '(') and (w2.s == ')')):
        return bool_expr.WordTest(w1)
    p_die('Expected binary operator, got %r (3 args)', w1.s, word=w1)