nodes: 0, module; 1, function_definition; 2, function_name:expression; 3, parameters; 4, block; 5, identifier:self; 6, default_parameter; 7, expression_statement; 8, expression_statement; 9, return_statement; 10, identifier:previous_precedence; 11, integer:0; 12, comment:"""An expression is an atom or an infix expression.
  
          Grammar (sort of, actually a precedence-climbing parser):
              expression = atom [ binary_operator expression ] .
  
          Args:
              previous_precedence: What operator precedence should we start with?
          """; 13, assignment; 14, call; 15, identifier:lhs; 16, call; 17, attribute; 18, argument_list; 19, attribute; 20, argument_list; 21, identifier:self; 22, identifier:operator; 23, identifier:lhs; 24, identifier:previous_precedence; 25, identifier:self; 26, identifier:atom
code: def expression(self, previous_precedence=0):
          """An expression is an atom or an infix expression.
  
          Grammar (sort of, actually a precedence-climbing parser):
              expression = atom [ binary_operator expression ] .
  
          Args:
              previous_precedence: What operator precedence should we start with?
          """
          lhs = self.atom()
  
          return self.operator(lhs, previous_precedence)