From ff1a97485bf239ee373d127fd85b0820e5b89e58 Mon Sep 17 00:00:00 2001 From: Paul Tagliamonte Date: Sat, 22 Dec 2012 14:03:56 -0500 Subject: [PATCH] small interesting bits. --- hy/compiler/ast27.py | 59 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 5 deletions(-) diff --git a/hy/compiler/ast27.py b/hy/compiler/ast27.py index 4af7db2..702d068 100644 --- a/hy/compiler/ast27.py +++ b/hy/compiler/ast27.py @@ -1,21 +1,70 @@ # output ast for cpython 2.7 +import ast + +from hy.lang.expression import HYExpression +from hy.lang.string import HYString from hy.lang.builtins import builtins from hy.lang.natives import natives + offset = 0 def _new_fn_name(): global offset offset += 1 return "_hy_fn_%s" % (offset) -# body=[Print(dest=None, -# values=[BinOp(left=Num(n=1), op=Add(), right=Num(n=1))], -# nl=True)] -# body=[Expr(value=BinOp(left=Num(n=1), op=Add(), right=Num(n=1)))] +def _ast_print(node, children): + return ast.Print( + dest=None, + values=children, + nl=True + ) + + +special_cases = { + "print": _ast_print +} + + +class AST27Converter(object): + def __init__(self): + self.table = { + HYString: self.render_string, + HYExpression: self.render_expression + } + + def render_string(self, node): + return ast.Str(s=node) + + def render_number(self, node): + pass + + def render_expression(self, node): + c = [] + for child in node.get_children(): + c.append(self.render(child)) + + inv = node.get_invocation() + if inv['function'] in special_cases: + return special_cases[inv['function']](node, c) + + return ret + + def render(self, tree): + t = type(tree) + handler = self.table[t] + ret = handler(tree) + + return ret def forge_ast(name, forest): + conv = AST27Converter() + + statements = [] for tree in forest: - print tree + statements.append(conv.render(tree)) + + print [ast.dump(x) for x in statements]