def parse_inputx(l0): if lexer.current == "": return l0 n = parse_exp2(l0) parse_token(lexer.QUEST) l0.append(n) return parse_inputx(l0)
def parse_input(l): if lexer.current == '': parse_token(lexer.END) return l parse_token(lexer.QUEST) n = parse_exp(l) l.append(n) return parse_input(l)
def parse_inputX(l0): if parser.current == lexer.END: return l0 else: n = parse_exp2(l0) parse_token(lexer.QUEST) l0.append(n) l = parse_inputX(l0) return l
def parse_exp1x(l, n1): if lexer.current in ["+", "-", "?", ")"]: return n1 elif lexer.current == "*": parse_token(lexer.MULT) n2 = parse_exp0(l) return parse_exp1x(l, n1 * n2) elif lexer.current == "/": parse_token(lexer.DIV) n2 = parse_exp0(l) return parse_exp1x(l, n1 / n2)
def parse_exp2x(l, n1): if lexer.current in ["?", ")"]: return n1 elif lexer.current == "+": parse_token(lexer.PLUS) n2 = parse_exp1(l) return parse_exp2x(l, n1 + n2) elif lexer.current == "-": parse_token(lexer.MINUS) n2 = parse_exp1(l) return parse_exp2x(l, n1 - n2)
def parse_exp1X(l, n1): if parser.current == lexer.MULT: parse_token(lexer.MULT) n2 = parse_exp0(l) n = parse_exp1X(l, n1 * n2) return n elif parser.current == lexer.DIV: parse_token(lexer.DIV) n2 = parse_exp0(l) n = parse_exp1X(l, n1 / n2) return n else: return n1
def parse_exp2X(l, n1): if parser.current in {lexer.QUEST, lexer.CPAR}: return n1 elif parser.current == lexer.PLUS: parse_token(lexer.PLUS) n2 = parse_exp1(l) n = parse_exp2X(l, n1 + n2) return n else: print(parser.current) parse_token(lexer.MINUS) n2 = parse_exp1(l) n = parse_exp2X(l, n1 - n2) return n
def parse_exp0(l): if parser.current == lexer.VAR: i = parse_token(lexer.VAR) return l[i - 1] elif parser.current == lexer.MINUS: parse_token(lexer.MINUS) n0 = parse_exp0(l) return -n0 elif parser.current == lexer.OPAR: parse_token(lexer.OPAR) n = parse_exp2(l) parse_token(lexer.CPAR) return n else: n = parse_token(lexer.INT) print(n) return n
def parse_exp_MINUS(l): parse_token(lexer.MINUS) n1 = parse_exp(l) return -n1
def parse_exp_PLUS(l): parse_token(lexer.PLUS) n1 = parse_exp(l) n2 = parse_exp(l) return n1 + n2
def parse_exp_VAR(l): i = parse_token(lexer.VAR) return l[i-1]
def parse_exp_INT(l): return parse_token(lexer.INT)
def test_parse_token(token, ast): got = parse_token(token) assert ast == got
def test_parse_invalid_token(self): with self.assertRaises(AssertionError): result = parse_token("PPP", 0)
def test_parse_pt_token(self): path = 'SB(-1,0)WA' action, index = parse_token(path, 1) self.assertEqual(action.type, 'B') self.assertEqual(action.pt, (-1, 0)) self.assertEqual(path[index:], 'WA')
def parse_exp_MULT(l): parse_token(lexer.MULT) n1 = parse_exp(l) n2 = parse_exp(l) return n1 * n2
def parse_exp_OPAR(l): parse_token(lexer.OPAR) n = parse_exp2(l) parse_token(lexer.CPAR) return n
def parse_exp_MINUS(l): parse_token(lexer.MINUS) n0 = parse_exp0(l) return -n0
def parse(stream=sys.stdin): init_parser(stream) l = parse_input() parse_token(lexer.END) return l
def parse_exp_DIV(l): parse_token(lexer.DIV) n1 = parse_exp(l) n2 = parse_exp(l) return n1 / n2
def test_parse_simple_token(self): action, index = parse_token('WASD', 0) self.assertEqual(action.type, 'W') self.assertEqual(index, 1)