def p_expression_binop(self, p):
_LOGGER.debug("<STR_LIT>" % p[<NUM_LIT:2>])<EOL>if self._autodefine_vars:<EOL><INDENT>self._init_vars(p[<NUM_LIT:1>], p[<NUM_LIT:3>])<EOL><DEDENT>if p[<NUM_LIT:1>].type != p[<NUM_LIT:3>].type: raise TypeError()<EOL>if p[<NUM_LIT:1>].type == TypedClass.LIST:<EOL><INDENT>if p[<NUM_LIT:2>] == '<STR_LIT:+>':<EOL><INDENT>p[<NUM_LIT:0>] = TypedList(p[<NUM_LIT:1>].value + p[<NUM_LIT:3>].value)<EOL><DEDENT>else:<EOL><INDENT>raise TypeError('<STR_LIT>')<EOL><DEDENT><DEDENT>elif p[<NUM_LIT:1>].type == TypedClass.STRING:<EOL><INDENT>if p[<NUM_LIT:2>] == '<STR_LIT:+>':<EOL><INDENT>p[<NUM_LIT:0>] = TypedClass(p[<NUM_LIT:1>].value + p[<NUM_LIT:3>].value, TypedClass.STRING)<EOL><DEDENT>else:<EOL><INDENT>raise TypeError('<STR_LIT>')<EOL><DEDENT><DEDENT>elif p[<NUM_LIT:1>].type == TypedClass.NUMBER: <EOL><INDENT>if p[<NUM_LIT:2>] == '<STR_LIT:+>':<EOL><INDENT>p[<NUM_LIT:0>] = TypedClass(p[<NUM_LIT:1>].value + p[<NUM_LIT:3>].value, TypedClass.NUMBER)<EOL><DEDENT>elif p[<NUM_LIT:2>] == '<STR_LIT:->':<EOL><INDENT>p[<NUM_LIT:0>] = TypedClass(p[<NUM_LIT:1>].value - p[<NUM_LIT:3>].value, TypedClass.NUMBER)<EOL><DEDENT>if p[<NUM_LIT:2>] == '<STR_LIT:*>':<EOL><INDENT>p[<NUM_LIT:0>] = TypedClass(p[<NUM_LIT:1>].value * p[<NUM_LIT:3>].value, TypedClass.NUMBER)<EOL><DEDENT>if p[<NUM_LIT:2>] == '<STR_LIT:/>':<EOL><INDENT>p[<NUM_LIT:0>] = TypedClass(p[<NUM_LIT:1>].value / p[<NUM_LIT:3>].value, TypedClass.NUMBER)<EOL><DEDENT><DEDENT>else:<EOL><INDENT>raise TypeError("<STR_LIT>")<EOL><DEDENT>
expression : expression PLUS expression
          | expression MINUS expression
          | expression TIMES expression
          | expression DIVIDE expression