small interesting bits.
This commit is contained in:
parent
d428f454b6
commit
ff1a97485b
@ -1,21 +1,70 @@
|
|||||||
# output ast for cpython 2.7
|
# 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.builtins import builtins
|
||||||
from hy.lang.natives import natives
|
from hy.lang.natives import natives
|
||||||
|
|
||||||
|
|
||||||
offset = 0
|
offset = 0
|
||||||
def _new_fn_name():
|
def _new_fn_name():
|
||||||
global offset
|
global offset
|
||||||
offset += 1
|
offset += 1
|
||||||
return "_hy_fn_%s" % (offset)
|
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):
|
def forge_ast(name, forest):
|
||||||
|
conv = AST27Converter()
|
||||||
|
|
||||||
|
statements = []
|
||||||
for tree in forest:
|
for tree in forest:
|
||||||
print tree
|
statements.append(conv.render(tree))
|
||||||
|
|
||||||
|
print [ast.dump(x) for x in statements]
|
||||||
|
Loading…
Reference in New Issue
Block a user