def parse(s): code = pp.Forward() opcode = pp.Or([ pp.Literal('+'), pp.Literal('-'), pp.Literal('*'), pp.Literal('/'), pp.Literal('_'), pp.Literal('='), pp.Literal('>'), pp.Literal('&'), pp.Literal('|'), pp.Literal('~'), pp.Literal('$'), pp.Literal('%'), pp.Literal('\\'), pp.Literal('@'), pp.Literal('ø'), pp.Literal('p'), pp.Literal(':'), pp.Literal(';'), pp.Literal('!'), pp.Literal('?'), pp.Literal('#'), ]).setParseAction(lambda toks: ast.Opcode(toks[0])) number = (pp.Word('1234567890').setParseAction( lambda toks: ast.Number(int(toks[0])))) str_def = ((pp.Literal('"') + pp.SkipTo(pp.Literal('"'), include=True) ).setParseAction(lambda toks: ast.String(toks[1]))) varname = (pp.Word( 'qwertyuiopasdfghjklzxcvbnm', exact=1).setParseAction(lambda toks: ast.Varname(toks[0]))) fn_def = pp.Suppress(pp.Literal('[')) + code + pp.Suppress(pp.Literal(']')) expr = pp.Or([opcode, number, varname, str_def, fn_def]) atom = pp.Or([expr]) code << pp.ZeroOrMore(atom) code.setParseAction(lambda toks: ast.Function(toks)) return code.parseString(s)[0]
def test_expr2_negs_6(): eval_lambda("Expr2", "-(1 + 1)", lambda x: x.eval() == ast.Number(-2))
def factor_negative_num(p): return ast.Number(-int(p[1].getstr()))
def test_expr2_parens_binop_3(): eval_lambda("Expr2", "1 + 2", lambda x: x.eval() == ast.Number(3))
def test_expr2_parens_binop_1(): eval_lambda("Expr2", "(1 + (2 + 3))", lambda x: x.eval() == ast.Number(6))
def test_expr2_negative_term_0(): eval_lambda("Expr2", "-1", lambda x: x.eval() == ast.Number(-1))
def test_term_negative_term(): eval_lambda("Term", "-1", lambda x: x.eval() == ast.Number(-1))
def test_term_decimal(): eval_lambda("Term", "1", lambda x: x.eval() == ast.Number(1))
def test_expr2_negs_17(): eval_lambda("Expr2", "---(((1+2)+3+3)-(4+6))", lambda x: x.eval() == ast.Number(1))
def test_expr2_negs_16(): eval_lambda("Expr2", "----2 + ----2", lambda x: x.eval() == ast.Number(4))
def test_expr2_negs_15(): eval_lambda("Expr2", "--(2+2)", lambda x: x.eval() == ast.Number(4))
def test_expr2_negs_11(): eval_lambda("Expr2", "-(-(1) - -1)", lambda x: x.eval() == ast.Number(0))
def test_expr2_negs_10(): eval_lambda("Expr2", "(-1) + -(1)", lambda x: x.eval() == ast.Number(-2))
def test_expr2_negs_9(): eval_lambda("Expr2", "-1 - -1", lambda x: x.eval() == ast.Number(0))
def test_expr2_negs_7(): eval_lambda("Expr2", "-(-2) - 3", lambda x: x.eval() == ast.Number(-1))
def test_eval_lit_num_bin(): eval_lambda("LitNum", "0b101010", lambda x: x.eval() == ast.Number(42))
def test_term_hex(): eval_lambda("Term", "0x10", lambda x: x.eval() == ast.Number(0x10))
def test_expr2_negs_18(): eval_lambda("Expr2", "1--2", lambda x: x.eval() == ast.Number(3))
def test_term_binary_lit_1(): eval_lambda("Term", "-0b101", lambda x: x.eval() == ast.Number(-0b101))
def test_expr2_negs_19(): eval_lambda("Expr2", "1+-2", lambda x: x.eval() == ast.Number(-1))
def test_term_neg_neg_term(): eval_lambda("Term", "--1", lambda x: x.eval() == ast.Number(1))
def do_test_expr2_with_args(s, n): eval_lambda("Expr2", s, lambda x: x.eval() == ast.Number(n))
def test_expr2_negative_term_paren_2(): eval_lambda("Expr2", "((((((((-1))))))))", lambda x: x.eval() == ast.Number(-1))
def test_eval_lit_num_dec(): eval_lambda("LitNum", "42", lambda x: x.eval() == ast.Number(42))
def test_expr2_parens_binop_2(): eval_lambda("Expr2", "((1 + 1) + (1 + 1))", lambda x: x.eval() == ast.Number(4))
def eval_expr2(s): eval_lambda("Expr2", s, lambda x: x.eval() == ast.Number(eval(s)))
def factor_num(p): return ast.Number(int(p[0].getstr()))
def eval_expr2_expect(s, e): eval_lambda("Expr2", s, lambda x: x.eval() == ast.Number(e))
def p_numeric_literal(self, p): """numeric_literal : NUMBER""" p[0] = ast.Number(p[1])
def test_eval_lit_num_hex(): eval_lambda("LitNum", "0x2a", lambda x: x.eval() == ast.Number(42))