def shift_expression(self) -> Node: shift = self.additive_expression() while True: if self.consume('>>'): rhs = self.additive_expression() if not Type.both_integer(shift.type, rhs.type): raise TypeError('右シフト演算子>>に整数型以外が指定されています') shift = Node('>>', type=shift.type, lhs=shift, rhs=rhs) continue if self.consume('<<'): rhs = self.additive_expression() if not Type.both_integer(shift.type, rhs.type): raise TypeError('左シフト演算子<<に整数型以外が指定されています') shift = Node('<<', type=shift.type, lhs=shift, rhs=rhs) continue break return shift
def logical_or_expression(self) -> Node: lor = self.logical_and_expression() while True: if self.consume('||'): rhs = self.logical_and_expression() if not Type.both_integer(lor.type, rhs.type): raise TypeError('||演算子に整数型以外が指定されています') lor = Node('||', type=lor.type, lhs=lor, rhs=rhs) continue break return lor
def or_expression(self) -> Node: or_ = self.exclusive_or_expression() while True: if self.consume('|'): rhs = self.exclusive_or_expression() if not Type.both_integer(or_.type, rhs.type): raise TypeError('|演算子に整数型以外が指定されています') or_ = Node('|', type=or_.type, lhs=or_, rhs=rhs) continue break return or_
def exclusive_or_expression(self) -> Node: xor = self.and_expression() while True: if self.consume('^'): rhs = self.and_expression() if not Type.both_integer(xor.type, rhs.type): raise TypeError('^演算子に整数型以外が指定されています') xor = Node('^', type=xor.type, lhs=xor, rhs=rhs) continue break return xor
def and_expression(self) -> Node: and_ = self.equality_expression() while True: if self.consume('&'): rhs = self.equality_expression() if not Type.both_integer(and_.type, rhs.type): raise TypeError('&演算子に整数型以外が指定されています') and_ = Node('&', type=and_.type, lhs=and_, rhs=rhs) continue break return and_
def logical_and_expression(self) -> Node: land = self.or_expression() while True: if self.consume('&&'): rhs = self.or_expression() if not Type.both_integer( land.type, rhs.type): # TODO: integerじゃなくてscala... raise TypeError('&&演算子に整数型以外が指定されています') land = Node('&&', type=land.type, lhs=land, rhs=rhs) continue break return land