Beispiel #1
0
 def parse_bit_shift(self):
     left = self.parse_plus_minus()
     rest = self.parse_bs()
     if rest is not None:
         return ast.BinaryExprNode(self.context, left, rest[0], rest[1])
     else:
         return left
Beispiel #2
0
 def parse_multi_divide(self):
     left = self.parse_factor()
     rest = self.parse_md()
     if rest is not None:
         return ast.BinaryExprNode(self.context, left, rest[0], rest[1])
     else:
         return left
Beispiel #3
0
 def parse_plus_minus(self):
     left = self.parse_multi_divide()
     rest = self.parse_pm()
     if rest is not None:
         return ast.BinaryExprNode(self.context, left, rest[0], rest[1])
     else:
         return left
Beispiel #4
0
 def parse_equal_or_not(self):
     left = self.parse_compare()
     rest = self.parse_eon()
     if rest is not None:
         return ast.BinaryExprNode(self.context, left, rest[0], rest[1])
     else:
         return left
Beispiel #5
0
 def parse_bit_or(self):
     left = self.parse_bit_and()
     rest = self.parse_bo()
     if rest is not None:
         return ast.BinaryExprNode(self.context, left, rest[0], rest[1])
     else:
         return left
Beispiel #6
0
 def parse_md(self):
     token = self.get_current_token()
     if token.word == '*' or token.word == '/' or token.word == '%':
         self.move_for_n(1)
         left = self.parse_factor()
         rest = self.parse_md()
         if rest is not None:
             node = ast.BinaryExprNode(self.context, left, rest[0], rest[1])
             return [token, node]
         else:
             return [token, left]
     else:
         return
Beispiel #7
0
 def parse_pm(self):
     token = self.get_current_token()
     if token.word == '+' or token.word == '-':
         self.move_for_n(1)
         left = self.parse_multi_divide()
         rest = self.parse_pm()
         if rest is not None:
             node = ast.BinaryExprNode(self.context, left, rest[0], rest[1])
             return [token, node]
         else:
             return [token, left]
     else:
         return
Beispiel #8
0
 def parse_bs(self):
     token = self.get_current_token()
     if token.word == '>>' or token.word == '<<':
         self.move_for_n(1)
         left = self.parse_plus_minus()
         rest = self.parse_bs()
         if rest is not None:
             node = ast.BinaryExprNode(self.context, left, rest[0], rest[1])
             return [token, node]
         else:
             return [token, left]
     else:
         return
Beispiel #9
0
 def parse_c(self):
     token = self.get_current_token()
     if token.word == '>=' or token.word == '>' or token.word == '<' or token.word == '<=':
         self.move_for_n(1)
         left = self.parse_bit_shift()
         rest = self.parse_c()
         if rest is not None:
             node = ast.BinaryExprNode(self.context, left, rest[0], rest[1])
             return [token, node]
         else:
             return [token, left]
     else:
         return
Beispiel #10
0
 def parse_ba(self):
     token = self.get_current_token()
     if token.word == '&':
         self.move_for_n(1)
         left = self.parse_equal_or_not()
         rest = self.parse_ba()
         if rest is not None:
             node = ast.BinaryExprNode(self.context, left, rest[0], rest[1])
             return [token, node]
         else:
             return [token, left]
     else:
         return
Beispiel #11
0
def p_binary_expression(t):
    '''binary_expression : cast_expression
                         | binary_expression TIMES binary_expression
                         | binary_expression DIVIDE binary_expression
                         | binary_expression MODULO binary_expression
                         | binary_expression PLUS binary_expression
                         | binary_expression MINUS binary_expression
                         | binary_expression LESSTHAN binary_expression
                         | binary_expression LESSEQUAL binary_expression
                         | binary_expression GREATERTHAN binary_expression
                         | binary_expression GREATEREQUAL binary_expression
                         | binary_expression ISEQUAL binary_expression
                         | binary_expression NOTEQUAL binary_expression
                         | binary_expression LOGICAND binary_expression
                         | binary_expression LOGICOR binary_expression
    '''
    if len(t) == 2:
        t[0] = t[1]
    else:
        t[0] = ast.BinaryExprNode(t[1], t[3], t.lexer.lineno, t[2])
Beispiel #12
0
def p_expression_binaryop(t):
    '''expression : expression compare expression
                  | expression arithop expression'''
    node = ast.BinaryExprNode(t[1], t[3], t.lineno, t[2])
    t[0] = node