Created
March 2, 2013 08:26
-
-
Save qoh/5070169 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
%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