Skip to content

Instantly share code, notes, and snippets.

@qoh
Created March 2, 2013 08:26
Show Gist options
  • Save qoh/5070169 to your computer and use it in GitHub Desktop.
Save qoh/5070169 to your computer and use it in GitHub Desktop.
%BOOLOP_SYMBOLS = {%And: "&&", %Or: "||"};
%BINOP_SYMBOLS = {%Add: "+", %Sub: "-", %Mult: "*", %Div: "/", %FloorDiv: "/", %Mod: "%", %LShift: "<<", %RShift: ">>", %BitOr: "|", %BitAnd: "&", %BitXor: "^"};
%CMPOP_SYMBOLS = {%Eq: "$=", %Gt: ">", %GtE: ">=", %In: "INVALID", %Is: "$=", %IsNot: "!$=", %Lt: "<", %LtE: "<=", %NotEq: "!$=", %NotIn: "INVALID"};
%UNARYOP_SYMBOLS = {%Invert: "~", %Not: "!", %UAdd: "+", %USub: "-"};
%ALL_SYMBOLS = {};
%ALL_SYMBOLS.update(%BOOLOP_SYMBOLS)
%ALL_SYMBOLS.update(%BINOP_SYMBOLS)
%ALL_SYMBOLS.update(%CMPOP_SYMBOLS)
%ALL_SYMBOLS.update(%UNARYOP_SYMBOLS)
function to_torquescript(%node, %indent_with, %add_line_information)
{
%generator = %SourceGenerator(%indent_with, %add_line_information);
%generator.visit(%node)
return "".join(%generator.result);
}
class SourceGenerator(%NodeVisitor):
function __init__(%self, %indent_with, %add_line_information)
{
%self.result = [];
%self.indent_with = %indent_with;
%self.add_line_information = %add_line_information;
%self.indentation = 0;
%self.new_lines = 0;
}
function write(%self, %x)
{%isinstance(%x, %str)
if (%self.new_lines)
{
if (%self.result)
{
%self.result.append("\n" * %self.new_lines)
}
%self.result.append(%self.indent_with * %self.indentation)
%self.new_lines = 0;
}
%self.result.append(%x)
}
function newline(%self, %node, %extra)
{
%self.new_lines = %max(%self.new_lines, 1 + %extra);
if (((%node !$= %None) && %self.add_line_information))
{
%self.write("// line: %s" % %node.lineno)
%self.new_lines = 1;
}
}
function body(%self, %statements)
{
%self.new_line = %True;
%self.indentation += 1
for %stmt in %statements:
%self.visit(%stmt)
%self.indentation -= 1
}
function body_or_else(%self, %node)
{
%self.body(%node.body)
if (%node.orelse)
{
%self.newline()
%self.write("else")
%self.newline()
%self.write("{")
%self.body(%node.orelse)
}
}
function signature(%self, %node)
{
%want_comma = [];
function write_comma()
{
if (%want_comma)
{
%self.write(", ")
}
else
{
%want_comma.append(%True)
}
}
for %arg in %zip(%node.args):
%write_comma()
%self.write("%" + %arg[0].id)
}
function decorators(%self, %node)
{
}
function visit_Assign(%self, %node)
{
%self.newline(%node)
for (%index, %target) in %enumerate(%node.targets):
if (%index)
{
%self.write(", ")
}
%self.visit(%target)
%self.write(" = ")
%self.visit(%node.value)
%self.write(";")
}
function visit_AugAssign(%self, %node)
{
%self.newline(%node)
%self.visit(%node.target)
%self.write(" " + %BINOP_SYMBOLS[%type(%node.op)] + "= ")
%self.visit(%node.value)
}
function visit_ImportFrom(%self, %node)
{
}
function visit_Import(%self, %node)
{
}
function visit_Expr(%self, %node)
{
%self.newline(%node)
%self.generic_visit(%node)
}
function visit_FunctionDef(%self, %node)
{
%self.newline(extra=1)
%self.newline(%node)
%self.write("function %s(" % %node.name)
%self.signature(%node.args)
%self.write(")")
%self.newline()
%self.write("{")
%self.body(%node.body)
%self.newline()
%self.write("}")
}
function visit_ClassDef(%self, %node)
{
%have_args = [];
function paren_or_comma()
{
if (%have_args)
{
%self.write(", ")
}
else
{
%have_args.append(%True)
%self.write("(")
}
}
%self.newline(extra=2)
%self.decorators(%node)
%self.newline(%node)
%self.write("class %s" % %node.name)
for %base in %node.bases:
%paren_or_comma()
%self.visit(%base)
%self.write(((%have_args && "):") || ":"))
%self.body(%node.body)
}
function visit_If(%self, %node)
{
%self.newline(%node)
%self.write("if (")
%self.visit(%node.test)
%self.write(")")
%self.newline()
%self.write("{")
%self.body(%node.body)
%self.newline()
%self.write("}")
while %True:
%else_ = %node.orelse;
if (((%len(%else_) $= 1) && %isinstance(%else_[0], %If)))
{
%node = %else_[0];
%self.newline()
%self.write("else if (")
%self.visit(%node.test)
%self.write(")")
%self.newline()
%self.write("{")
%self.body(%node.body)
%self.newline()
%self.write("}")
}
else
{
if ((%len(%else_) > 0))
{
%self.newline()
%self.write("else")
%self.newline()
%self.write("{")
%self.body(%else_)
%self.newline()
%self.write("}")
}
break;
}
}
function visit_For(%self, %node)
{
%self.newline(%node)
%self.write("for ")
%self.visit(%node.target)
%self.write(" in ")
%self.visit(%node.iter)
%self.write(":")
%self.body_or_else(%node)
}
function visit_While(%self, %node)
{
%self.newline(%node)
%self.write("while ")
%self.visit(%node.test)
%self.write(":")
%self.body_or_else(%node)
}
function visit_With(%self, %node)
{
%self.newline(%node)
%self.write("with ")
%self.visit(%node.context_expr)
if ((%node.optional_vars !$= %None))
{
%self.write(" as ")
%self.visit(%node.optional_vars)
}
%self.write(":")
%self.body(%node.body)
}
function visit_Pass(%self, %node)
{
}
function visit_Print(%self, %node)
{
%self.newline(%node)
%self.write("echo(")
%want_comma = %False;
for %value in %node.values:
if (%want_comma)
{
%self.write(", ")
}
%self.visit(%value)
%want_comma = %True;
if ((!%node.nl))
{
%self.write(",")
}
else
{
%self.write(");")
}
}
function visit_Delete(%self, %node)
{
%self.newline(%node)
%self.write("del ")
for (%idx, %target) in %enumerate(%node.targets):
if (%idx)
{
%self.write(", ")
}
%self.visit(%target)
}
function visit_TryExcept(%self, %node)
{
%self.newline(%node)
%self.write("try:")
%self.body(%node.body)
for %handler in %node.handlers:
%self.visit(%handler)
}
function visit_TryFinally(%self, %node)
{
%self.newline(%node)
%self.write("try:")
%self.body(%node.body)
%self.newline(%node)
%self.write("finally:")
%self.body(%node.finalbody)
}
function visit_Global(%self, %node)
{
%self.newline(%node)
%self.write("global " + ", ".join(%node.names))
}
function visit_Nonlocal(%self, %node)
{
%self.newline(%node)
%self.write("nonlocal " + ", ".join(%node.names))
}
function visit_Return(%self, %node)
{
%self.newline(%node)
if ((%node.value !$= %None))
{
%self.write("return ")
%self.visit(%node.value)
%self.write(";")
}
else
{
%self.write("return;")
}
}
function visit_Break(%self, %node)
{
%self.newline(%node)
%self.write("break;")
}
function visit_Continue(%self, %node)
{
%self.newline(%node)
%self.write("continue;")
}
function visit_Raise(%self, %node)
{
%self.newline(%node)
%self.write("raise")
if ((%hasattr(%node, "exc") && (%node.exc !$= %None)))
{
%self.write(" ")
%self.visit(%node.exc)
if ((%node.cause !$= %None))
{
%self.write(" from ")
%self.visit(%node.cause)
}
}
else if ((%hasattr(%node, "type") && (%node.type !$= %None)))
{
%self.visit(%node.type)
if ((%node.inst !$= %None))
{
%self.write(", ")
%self.visit(%node.inst)
}
if ((%node.tback !$= %None))
{
%self.write(", ")
%self.visit(%node.tback)
}
}
}
function visit_Attribute(%self, %node)
{
%self.visit(%node.value)
%self.write("." + %node.attr)
}
function visit_Call(%self, %node)
{
%want_comma = [];
function write_comma()
{
if (%want_comma)
{
%self.write(", ")
}
else
{
%want_comma.append(%True)
}
}
%self.visit(%node.func)
%self.write("(")
for %arg in %node.args:
%write_comma()
%self.visit(%arg)
for %keyword in %node.keywords:
%write_comma()
%self.write(%keyword.arg + "=")
%self.visit(%keyword.value)
if ((%node.starargs !$= %None))
{
%write_comma()
%self.write("*")
%self.visit(%node.starargs)
}
if ((%node.kwargs !$= %None))
{
%write_comma()
%self.write("**")
%self.visit(%node.kwargs)
}
%self.write(")")
}
function visit_Name(%self, %node)
{
%self.write("%" + %node.id)
}
function visit_Str(%self, %node)
{
%self.write(""" + %repr(%node.s)[1:-1] + """)
}
function visit_Bytes(%self, %node)
{
%self.write(%repr(%node.s))
}
function visit_Num(%self, %node)
{
%self.write(%repr(%node.n))
}
function visit_Tuple(%self, %node)
{
%self.write("(")
%idx = -1;
for (%idx, %item) in %enumerate(%node.elts):
if (%idx)
{
%self.write(", ")
}
%self.visit(%item)
%self.write(((%idx && ")") || ",)"))
}
function sequence_visit(%left, %right)
{
function visit(%self, %node)
{
%self.write(%left)
for (%idx, %item) in %enumerate(%node.elts):
if (%idx)
{
%self.write(", ")
}
%self.visit(%item)
%self.write(%right)
}
return %visit;
}
%visit_List = %sequence_visit("[", "]");
%visit_Set = %sequence_visit("{", "}");
del %sequence_visit
function visit_Dict(%self, %node)
{
%self.write("{")
for (%idx, (%key, %value)) in %enumerate(%zip(%node.keys, %node.values)):
if (%idx)
{
%self.write(", ")
}
%self.visit(%key)
%self.write(": ")
%self.visit(%value)
%self.write("}")
}
function visit_BinOp(%self, %node)
{
%self.visit(%node.left)
%self.write(" %s " % %BINOP_SYMBOLS[%type(%node.op)])
%self.visit(%node.right)
}
function visit_BoolOp(%self, %node)
{
%self.write("(")
for (%idx, %value) in %enumerate(%node.values):
if (%idx)
{
%self.write(" %s " % %BOOLOP_SYMBOLS[%type(%node.op)])
}
%self.visit(%value)
%self.write(")")
}
function visit_Compare(%self, %node)
{
%self.write("(")
%self.visit(%node.left)
for (%op, %right) in %zip(%node.ops, %node.comparators):
%self.write(" %s " % %CMPOP_SYMBOLS[%type(%op)])
%self.visit(%right)
%self.write(")")
}
function visit_UnaryOp(%self, %node)
{
%self.write("(")
%op = %UNARYOP_SYMBOLS[%type(%node.op)];
%self.write(%op)
if ((%op $= "not"))
{
%self.write(" ")
}
%self.visit(%node.operand)
%self.write(")")
}
function visit_Subscript(%self, %node)
{
%self.visit(%node.value)
%self.write("[")
%self.visit(%node.slice)
%self.write("]")
}
function visit_Slice(%self, %node)
{
if ((%node.lower !$= %None))
{
%self.visit(%node.lower)
}
%self.write(":")
if ((%node.upper !$= %None))
{
%self.visit(%node.upper)
}
if ((%node.step !$= %None))
{
%self.write(":")
if ((!(%isinstance(%node.step, %Name) && (%node.step.id $= "None"))))
{
%self.visit(%node.step)
}
}
}
function visit_ExtSlice(%self, %node)
{
for (%idx, %item) in %node.dims:
if (%idx)
{
%self.write(", ")
}
%self.visit(%item)
}
function visit_Yield(%self, %node)
{
%self.write("yield ")
%self.visit(%node.value)
}
function visit_Lambda(%self, %node)
{
%self.write("lambda ")
%self.signature(%node.args)
%self.write(": ")
%self.visit(%node.body)
}
function visit_Ellipsis(%self, %node)
{
%self.write("Ellipsis")
}
function generator_visit(%left, %right)
{
function visit(%self, %node)
{
%self.write(%left)
%self.visit(%node.elt)
for %comprehension in %node.generators:
%self.visit(%comprehension)
%self.write(%right)
}
return %visit;
}
%visit_ListComp = %generator_visit("[", "]");
%visit_GeneratorExp = %generator_visit("(", ")");
%visit_SetComp = %generator_visit("{", "}");
del %generator_visit
function visit_DictComp(%self, %node)
{
%self.write("{")
%self.visit(%node.key)
%self.write(": ")
%self.visit(%node.value)
for %comprehension in %node.generators:
%self.visit(%comprehension)
%self.write("}")
}
function visit_IfExp(%self, %node)
{
%self.visit(%node.body)
%self.write(" if ")
%self.visit(%node.test)
%self.write(" else ")
%self.visit(%node.orelse)
}
function visit_Starred(%self, %node)
{
%self.write("*")
%self.visit(%node.value)
}
function visit_Repr(%self, %node)
{
%self.write("`")
%self.visit(%node.value)
%self.write("`")
}
function visit_alias(%self, %node)
{
%self.write(%node.name)
if ((%node.asname !$= %None))
{
%self.write(" as " + %node.asname)
}
}
function visit_comprehension(%self, %node)
{
%self.write(" for ")
%self.visit(%node.target)
%self.write(" in ")
%self.visit(%node.iter)
if (%node.ifs)
{
for %if_ in %node.ifs:
%self.write(" if ")
%self.visit(%if_)
}
}
function visit_ExceptHandler(%self, %node)
{
%self.newline(%node)
%self.write("except")
if ((%node.type !$= %None))
{
%self.write(" ")
%self.visit(%node.type)
if ((%node.name !$= %None))
{
%self.write(" as ")
%self.visit(%node.name)
}
}
%self.write(":")
%self.body(%node.body)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment