def visit_term15(self, node, ch): l = ch.pop(0) while len(ch): op, r = ch.pop(0), ch.pop(0) if op == '<<': l = expr.Binary(l, op, r, lambda x, y: x << y) elif op == '>>': l = expr.Binary(l, op, r, lambda x, y: x >> y) return l
def visit_term16(self, node, ch): l = ch.pop(0) while len(ch): op, r = ch.pop(0), ch.pop(0) if op == '+': l = expr.Binary(l, op, r, lambda x, y: x + y) elif op == '-': l = expr.Binary(l, op, r, lambda x, y: x - y) return l
def visit_term17(self, node, ch): l = ch.pop(0) while len(ch): op, r = ch.pop(0), ch.pop(0) if op == '*': l = expr.Binary(l, op, r, lambda x, y: x * y) elif op == '/': l = expr.Binary(l, op, r, lambda x, y: x / y) elif op == '%': l = expr.Binary(l, op, r, lambda x, y: x % y) return l
def visit_term12(self, node, ch): l = ch.pop(0) while len(ch): op, r = ch.pop(0), ch.pop(0) if op == '==': l = expr.Binary(l, op, r, lambda x, y: gdb.Value(x == y)) elif op == '!=': l = expr.Binary(l, op, r, lambda x, y: gdb.Value(x != y)) elif op == '==?': l = expr.Filter(l, op, r, lambda x, y: gdb.Value(x == y)) elif op == '!=?': l = expr.Filter(l, op, r, lambda x, y: gdb.Value(x != y)) return l
def visit_term7(self, node, ch): l = ch.pop(0) while len(ch): op, r = ch.pop(0), ch.pop(0) if op == '||': l = expr.Binary(l, op, r, lambda x, y: 1 if x or y else 0) return l
def visit_term13(self, node, ch): l = ch.pop(0) while len(ch): op, r = ch.pop(0), ch.pop(0) if op == '<': l = expr.Binary(l, op, r, lambda x, y: gdb.Value(x < y)) elif op == '>': l = expr.Binary(l, op, r, lambda x, y: gdb.Value(x > y)) elif op == '<=': l = expr.Binary(l, op, r, lambda x, y: gdb.Value(x <= y)) elif op == '>=': l = expr.Binary(l, op, r, lambda x, y: gdb.Value(x >= y)) elif op == '<?': l = expr.Filter(l, op, r, lambda x, y: gdb.Value(x < y)) elif op == '>?': l = expr.Filter(l, op, r, lambda x, y: gdb.Value(x > y)) elif op == '<=?': l = expr.Filter(l, op, r, lambda x, y: gdb.Value(x <= y)) elif op == '>=?': l = expr.Filter(l, op, r, lambda x, y: gdb.Value(x >= y)) return l
def visit_term19(self, node, ch): l = ch.pop(0) while len(ch): op, r = ch.pop(0), ch.pop(0) if op == '[': l, _ = expr.Binary(l, '{0}[{1}]', r, lambda x, y: x[int(y)]), ch.pop(0) elif op == '.': l = expr.Struct(l, '{0}.{1}', r) elif op == '->': l = expr.Struct(l, '{0}->{1}', r) elif op == '-->': l = expr.StructWalk(l, r) elif op == '[[': l, _ = expr.TakeNth(l, r), ch.pop(0) elif op == '@': l = expr.Until(l, r) return l
def visit_term9(self, node, ch): l = ch.pop(0) while len(ch): op, r = ch.pop(0), ch.pop(0) if op == '|': l = expr.Binary(l, op, r, lambda x, y: x | y) return l