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)
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
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)
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)
def _StringWordTest(s): # TODO: Could be Word_String return bool_expr.WordTest(word.StringWord(Id.Word_Compound, s))