예제 #1
0
 def _project_if_slice(self, left, right):
     index_expr = ast.index_expression([left, right])
     if right['type'] == 'slice':
         return ast.projection(
             index_expr,
             self._parse_projection_rhs(self.BINDING_POWER['star']))
     else:
         return index_expr
예제 #2
0
 def _project_if_slice(self, left, right):
     index_expr = ast.index_expression([left, right])
     if right['type'] == 'slice':
         return ast.projection(
             index_expr,
             self._parse_projection_rhs(self.BINDING_POWER['star']))
     else:
         return index_expr
예제 #3
0
 def _token_nud_lbracket(self, token):
     if self._current_token() in ['number', 'colon']:
         return self._parse_index_expression()
     elif self._current_token() == 'star' and \
             self._lookahead(1) == 'rbracket':
         self._advance()
         self._advance()
         right = self._parse_projection_rhs(self.BINDING_POWER['star'])
         return ast.projection(ast.identity(), right)
     else:
         return self._parse_multi_select_list()
예제 #4
0
 def _token_nud_lbracket(self, token):
     if self._current_token() in ['number', 'colon']:
         return self._parse_index_expression()
     elif self._current_token() == 'star' and \
             self._lookahead(1) == 'rbracket':
         self._advance()
         self._advance()
         right = self._parse_projection_rhs(self.BINDING_POWER['star'])
         return ast.projection(ast.identity(), right)
     else:
         return self._parse_multi_select_list()
 def _token_led_lbracket(self, left):
     token = self._lookahead_token(0)
     if token['type'] == 'number':
         self._match('number')
         right = ast.index(token['value'])
         self._match('rbracket')
         return ast.index_expression(left, right)
     else:
         # We have a projection
         self._match('star')
         self._match('rbracket')
         right = self._parse_projection_rhs(self.BINDING_POWER['star'])
         return ast.projection(left, right)
 def _token_led_lbracket(self, left):
     token = self._lookahead_token(0)
     if token['type'] == 'number':
         self._match('number')
         right = ast.index(token['value'])
         self._match('rbracket')
         return ast.index_expression(left, right)
     else:
         # We have a projection
         self._match('star')
         self._match('rbracket')
         right = self._parse_projection_rhs(self.BINDING_POWER['star'])
         return ast.projection(left, right)
 def _token_nud_lbracket(self, token):
     if self._current_token() == 'number':
         node = ast.index(self._lookahead_token(0)['value'])
         self._advance()
         self._match('rbracket')
         return node
     elif self._current_token() == 'star' and \
             self._lookahead(1) == 'rbracket':
         self._advance()
         self._advance()
         right = self._parse_projection_rhs(self.BINDING_POWER['star'])
         return ast.projection(ast.identity(), right)
     else:
         return self._parse_multi_select_list()
 def _token_nud_lbracket(self, token):
     if self._current_token() == 'number':
         node = ast.index(self._lookahead_token(0)['value'])
         self._advance()
         self._match('rbracket')
         return node
     elif self._current_token() == 'star' and \
             self._lookahead(1) == 'rbracket':
         self._advance()
         self._advance()
         right = self._parse_projection_rhs(self.BINDING_POWER['star'])
         return ast.projection(ast.identity(), right)
     else:
         return self._parse_multi_select_list()
예제 #9
0
 def _token_led_lbracket(self, left):
     token = self._lookahead_token(0)
     if token['type'] in ['number', 'colon']:
         right = self._parse_index_expression()
         if left['type'] == 'index_expression':
             left['children'].append(right)
             return left
         else:
             return ast.index_expression([left, right])
     else:
         # We have a projection
         self._match('star')
         self._match('rbracket')
         right = self._parse_projection_rhs(self.BINDING_POWER['star'])
         return ast.projection(left, right)
예제 #10
0
 def _token_led_lbracket(self, left):
     token = self._lookahead_token(0)
     if token['type'] in ['number', 'colon']:
         right = self._parse_index_expression()
         if left['type'] == 'index_expression':
             left['children'].append(right)
             return left
         else:
             return ast.index_expression([left, right])
     else:
         # We have a projection
         self._match('star')
         self._match('rbracket')
         right = self._parse_projection_rhs(self.BINDING_POWER['star'])
         return ast.projection(left, right)
예제 #11
0
 def _token_nud_lbracket(self, token):
     if self._current_token() in ['number', 'colon']:
         right = self._parse_index_expression()
         # We could optimize this and remove the identity() node.
         # We don't really need an index_expression node, we can
         # just use emit an index node here if we're not dealing
         # with a slice.
         return self._project_if_slice(ast.identity(), right)
     elif self._current_token() == 'star' and \
             self._lookahead(1) == 'rbracket':
         self._advance()
         self._advance()
         right = self._parse_projection_rhs(self.BINDING_POWER['star'])
         return ast.projection(ast.identity(), right)
     else:
         return self._parse_multi_select_list()
예제 #12
0
 def _token_nud_lbracket(self, token):
     if self._current_token() in ['number', 'colon']:
         right = self._parse_index_expression()
         # We could optimize this and remove the identity() node.
         # We don't really need an index_expression node, we can
         # just use emit an index node here if we're not dealing
         # with a slice.
         return self._project_if_slice(ast.identity(), right)
     elif self._current_token() == 'star' and \
             self._lookahead(1) == 'rbracket':
         self._advance()
         self._advance()
         right = self._parse_projection_rhs(self.BINDING_POWER['star'])
         return ast.projection(ast.identity(), right)
     else:
         return self._parse_multi_select_list()
예제 #13
0
 def _token_led_lbracket(self, left):
     token = self._lookahead_token(0)
     if token['type'] in ['number', 'colon']:
         right = self._parse_index_expression()
         if left['type'] == 'index_expression':
             # Optimization: if the left node is an index expr,
             # we can avoid creating another node and instead just add
             # the right node as a child of the left.
             left['children'].append(right)
             return left
         else:
             return self._project_if_slice(left, right)
     else:
         # We have a projection
         self._match('star')
         self._match('rbracket')
         right = self._parse_projection_rhs(self.BINDING_POWER['star'])
         return ast.projection(left, right)
예제 #14
0
 def _token_led_lbracket(self, left):
     token = self._lookahead_token(0)
     if token['type'] in ['number', 'colon']:
         right = self._parse_index_expression()
         if left['type'] == 'index_expression':
             # Optimization: if the left node is an index expr,
             # we can avoid creating another node and instead just add
             # the right node as a child of the left.
             left['children'].append(right)
             return left
         else:
             return self._project_if_slice(left, right)
     else:
         # We have a projection
         self._match('star')
         self._match('rbracket')
         right = self._parse_projection_rhs(self.BINDING_POWER['star'])
         return ast.projection(left, right)
예제 #15
0
 def _token_led_flatten(self, left):
     left = ast.flatten(left)
     right = self._parse_projection_rhs(
         self.BINDING_POWER['flatten'])
     return ast.projection(left, right)
예제 #16
0
 def _token_led_flatten(self, left):
     left = ast.flatten(left)
     right = self._parse_projection_rhs(
         self.BINDING_POWER['flatten'])
     return ast.projection(left, right)
예제 #17
0
 def _token_nud_flatten(self, token):
     left = ast.flatten(ast.identity())
     right = self._parse_projection_rhs(
         self.BINDING_POWER['flatten'])
     return ast.projection(left, right)
예제 #18
0
 def _token_nud_flatten(self, token):
     left = ast.flatten(ast.identity())
     right = self._parse_projection_rhs(
         self.BINDING_POWER['flatten'])
     return ast.projection(left, right)