| Index: utils/astml.js |
| diff --git a/utils/astml.js b/utils/astml.js |
| deleted file mode 100644 |
| index 0065a87c0e9ce7f05a2fba56b2c62570b83b5ee3..0000000000000000000000000000000000000000 |
| --- a/utils/astml.js |
| +++ /dev/null |
| @@ -1,683 +0,0 @@ |
| -// Output an JsonML codec for the AST |
| - |
| -// Explanation of a node: |
| -// { |
| -// type: The type of the node |
| -// location: "line:col-line:col" |
| -// } |
| -/** |
| - * Node formats: |
| - * Program |
| - * sourceElements: Array of elements (functions, statements) |
| - * FunctionDeclaration |
| - * name: Name of the function |
| - * arguments: Array of arguments |
| - * body: Array of elements in function body |
| - * VarStatement |
| - * variables: Variables being initialized |
| - * VarDeclaration |
| - * name: Name of variable |
| - * initializer: Initial value of variable |
| - * CallExpression |
| - * func: Name of the function being called |
| - * arguments: Array of arguments |
| - * IdentifierExpression |
| - * name: Name of identifier |
| - * LiteralExpression |
| - * objtype: "null", "boolean", "numeric", "string", "regex" |
| - * value: Value of the literal |
| - * BinaryExpression |
| - * operator: operator (e.g., '|', '+') |
| - + lhs, rhs: left-hand, right-hand expressions for the operator |
| - */ |
| -include("../utils/dumpast.js"); |
| - |
| -function makeAST(pn) { |
| - let ast = shellNode(pn, "Program"); |
| - ast.sourceElements = parseToAst(pn).statements; |
| - return ast; |
| -} |
| - |
| -// Broken things: |
| -// * Generators (i for (i in foo), not array comp) |
| -// * let {a: x, b: y} = baz(); |
| -// * let (x = 5, y = 12) {} (really!) |
| -// * function ( {a: 1, b: 2} ) |
| -// * E4x |
| - |
| -let structure = { |
| - // Program : SourceElement* |
| - "Program": [ "sourceElements" ], |
| - // SourceElement : FunctionDeclaration | Statement |
| - // FunctionDeclaration : function [name] ( Parameter * ) { SourceElement * } |
| - "FunctionDeclaration": [ "arguments", "body" ], |
| - "Parameter": [ ], // name: Parameter name |
| - |
| - // Statements |
| - "BlockStatement": [ "statements" ], |
| - "VarStatement": [ "variables" ], |
| - "VarDeclaration": [ "initializer" ], // name: name of variable |
| - "LetStatement": [ "variables", "body" ], |
| - "EmptyStatement": [], |
| - "ExpressionStatement": [ "expr" ], |
| - "IfStatement": [ "cond", "body", "elsebody" ], |
| - "DoWhileStatement": [ "cond", "body" ], |
| - "WhileStatement": [ "cond", "body" ], |
| - "ForStatement": [ "init", "cond", "inc", "body" ], |
| - "ForInStatement": [ "itervar", "iterrange", "body" ], // itertype: for (each) |
| - "ContinueStatement": [ ], // label: label to break to |
| - "BreakStatement": [ ], // label: label to break to |
| - "ReturnStatement": [ "expr" ], |
| - "WithStatement": [ "variable", "body" ], |
| - "LabeledStatement": [ "body" ], // label: label of statement |
| - "SwitchStatement": [ "expr", "cases" ], |
| - "SwitchCase": [ "expr", "body"], // default: no expr |
| - "ThrowStatement": [ "expr" ], |
| - "TryStatement": [ "body", "catchers", "fin" ], |
| - "CatchStatement": [ "variable", "cond", "body" ], |
| - "DebuggerStatement": [ ], |
| - |
| - // Expressions (all have a precedence attribute, 0 (primary) -17) |
| - "ThisExpression": [], |
| - "LiteralExpression": [], // objtype: typeof literal, value: value |
| - "ObjectLiteral": [ "setters" ], |
| - "PropertyLiteral": [ "property", "value" ], // proptype: getter, setter, not |
| - "ArrayLiteral": [ "members" ], |
| - "ArrayComprehensionExpression": [ "element", "itervar", "iterrange", |
| - "iterif" ], // itertype |
| - "IdentifierExpression": [], // name: name of node |
| - "MemberExpression": [ "container", "member"], //constmember if constant |
| - "NewExpression": [ "constructor", "arguments" ], |
| - "CallExpression": [ "func", "arguments" ], |
| - "PostfixExpression": [ "operand" ], // operator |
| - // XXX: jorendorff says yield is weird precedence |
| - // For now, it's an unary with precedence = 16 |
| - "UnaryExpression": [ "operand" ], // operator |
| - "BinaryExpression": [ "lhs", "rhs" ], // operator |
| - "ConditionalExpression": [ "cond", "iftrue", "iffalse" ], |
| - "AssignmentExpression": [ "lhs", "rhs" ], // operator |
| -}; |
| -function walkAST(ast, visitor) { |
| - function astVisitor(node) { |
| - let info = structure[node.type]; |
| - if (!info) |
| - throw "Need to define " + node.type; |
| - let cback = "visit" + node.type; |
| - let deep = false; |
| - if (cback in visitor) |
| - deep = visitor[cback](node); |
| - if (!deep) { |
| - for each (let part in info) { |
| - let piece = node[part]; |
| - if (piece instanceof Array) { |
| - [astVisitor(x) for each (x in piece)]; |
| - } else if (piece) { |
| - astVisitor(piece); |
| - } |
| - } |
| - } |
| - cback = "post" + cback; |
| - if (cback in visitor) |
| - visitor[cback](node); |
| - } |
| - astVisitor(ast); |
| -} |
| - |
| -function getLocation(pn) { |
| - return pn.line + ":" + pn.column; |
| -} |
| -function shellNode(pn, type) { |
| - function visit(visitor) { |
| - return walkAST(this, visitor); |
| - } |
| - return {type: type, location: getLocation(pn), visit: visit }; |
| -} |
| -function binaryNode(pn, operator, precedence) { |
| - let ast = shellNode(pn, "BinaryExpression"); |
| - ast.precedence = precedence; |
| - ast.operator = operator; |
| - ast.lhs = parseToAst(pn.kids[0]); |
| - ast.rhs = parseToAst(pn.kids[1]); |
| - for (let i = 2; i < pn.kids.length; i++) { |
| - let sup = shellNode(pn.kids[i], "BinaryExpression"); |
| - sup.precedence = precedence; |
| - sup.operator = operator; |
| - sup.lhs = ast; |
| - sup.rhs = parseToAst(pn.kids[i]); |
| - ast = sup; |
| - } |
| - return ast; |
| -} |
| - |
| -function parseToAst(pn) { |
| - if (!pn) |
| - return pn; |
| - try { |
| - return global["convert" + decode_type(pn.type)](pn); |
| - } catch (e if e instanceof TypeError) { |
| - dump_ast(pn); |
| - throw e; |
| - //throw "Unexpected token " + decode_type(pn.type); |
| - } |
| -} |
| - |
| -// Nodes that I don't see in output |
| -// TOK_ERROR, TOK_EOL, TOK_ELSE, TOK_FINALLY, TOK_SEQ |
| -// TOK_XMLSTAGO - TOK_XMLLIST are XML and thus ignored |
| - |
| -function convertTOK_SEMI(pn) { |
| - let ast = shellNode(pn, "ExpressionStatement"); |
| - if (pn.kids[0]) |
| - ast.expr = parseToAst(pn.kids[0]); |
| - else { |
| - ast.type = "EmptyStatement"; |
| - } |
| - return ast; |
| -} |
| - |
| -function convertTOK_COMMA(pn) { |
| - if (pn.kids.length == 0) { |
| - let ast = shellNode(pn, "EmptyExpression"); |
| - ast.precedence = 17; |
| - return ast; |
| - } else { |
| - return binaryNode(pn, ",", 17); |
| - } |
| -} |
| - |
| -function convertTOK_ASSIGN(pn) { |
| - let ast = shellNode(pn, "AssignmentExpression"); |
| - ast.precedence = 16; |
| - ast.lhs = parseToAst(pn.kids[0]); |
| - ast.rhs = parseToAst(pn.kids[1]); |
| - switch (pn.op) { |
| - case JSOP_NOP: ast.operator = ''; break; |
| - case JSOP_BITOR: ast.operator = '|'; break; |
| - case JSOP_BITXOR: ast.operator = '^'; break; |
| - case JSOP_BITAND: ast.operator = '&'; break; |
| - case JSOP_LSH: ast.operator = '<<'; break; |
| - case JSOP_RSH: ast.operator = '>>'; break; |
| - case JSOP_URSH: ast.operator = '>>>'; break; |
| - case JSOP_ADD: ast.operator = '+'; break; |
| - case JSOP_SUB: ast.operator = '-'; break; |
| - case JSOP_MUL: ast.operator = '*'; break; |
| - case JSOP_DIV: ast.operator = '/'; break; |
| - case JSOP_MOD: ast.operator = '%'; break; |
| - default: throw "Unexpected operator " + decode_op(pn.op); |
| - }; |
| - return ast; |
| -} |
| - |
| -function convertTOK_HOOK(pn) { |
| - let ast = shellNode(pn, "ConditionalExpression"); |
| - ast.precedence = 15; |
| - ast.cond = parseToAst(pn.kids[0]); |
| - ast.iftrue = parseToAst(pn.kids[1]); |
| - ast.iffalse = parseToAst(pn.kids[2]); |
| - return ast; |
| -} |
| - |
| -function convertTOK_COLON(pn) { |
| - if (pn.kids.length == 1) { |
| - let ast = shellNode(pn, "LabeledStatement"); |
| - ast.label = pn.atom; |
| - ast.body = parseToAst(pn.kids[0]); |
| - return ast; |
| - } |
| - let ast = shellNode(pn, "PropertyLiteral"); |
| - ast.property = parseToAst(pn.kids[0]); |
| - ast.value = parseToAst(pn.kids[1]); |
| - if (pn.op == JSOP_GETTER) |
| - ast.proptype = "getter"; |
| - else if (pn.op == JSOP_SETTER) |
| - ast.proptype = "setter"; |
| - return ast; |
| -} |
| - |
| -function convertTOK_OR(pn) { return binaryNode(pn, "||", 14); } |
| -function convertTOK_AND(pn) { return binaryNode(pn, "&&", 13); } |
| -function convertTOK_BITOR(pn) { return binaryNode(pn, "|", 12); } |
| -function convertTOK_BITXOR(pn) { return binaryNode(pn, "^", 11); } |
| -function convertTOK_BITAND(pn) { return binaryNode(pn, "&", 10); } |
| -function convertTOK_EQOP(pn) { |
| - switch (pn.op) { |
| - case JSOP_EQ: return binaryNode(pn, "==", 9); |
| - case JSOP_NE: return binaryNode(pn, "!=", 9); |
| - case JSOP_STRICTEQ: return binaryNode(pn, "===", 9); |
| - case JSOP_STRICTNE: return binaryNode(pn, "!==", 9); |
| - } |
| - throw "Unknown operator: " + decode_op(pn.op); |
| -} |
| -function convertTOK_RELOP(pn) { |
| - switch (pn.op) { |
| - case JSOP_LT: return binaryNode(pn, "<", 8); |
| - case JSOP_LE: return binaryNode(pn, "<=", 8); |
| - case JSOP_GT: return binaryNode(pn, ">", 8); |
| - case JSOP_GE: return binaryNode(pn, ">=", 8); |
| - } |
| - throw "Unknown operator: " + decode_op(pn.op); |
| -} |
| -function convertTOK_SHOP(pn) { |
| - switch (pn.op) { |
| - case JSOP_LSH: return binaryNode(pn, "<<", 7); |
| - case JSOP_RSH: return binaryNode(pn, ">>", 7); |
| - case JSOP_URSH: return binaryNode(pn, ">>>", 7); |
| - } |
| - throw "Unknown operator: " + decode_op(pn.op); |
| -} |
| -function convertTOK_PLUS(pn) { return binaryNode(pn, "+", 6); } |
| -function convertTOK_MINUS(pn) { return binaryNode(pn, "-", 6); } |
| -function convertTOK_STAR(pn) { return binaryNode(pn, "*", 5); } |
| -function convertTOK_DIVOP(pn) { |
| - switch (pn.op) { |
| - case JSOP_MUL: return binaryNode(pn, "*", 5); |
| - case JSOP_DIV: return binaryNode(pn, "/", 5); |
| - case JSOP_MOD: return binaryNode(pn, "%", 5); |
| - } |
| - throw "Unknown operator: " + decode_op(pn.op); |
| -} |
| -function convertTOK_UNARYOP(pn) { |
| - let ast = shellNode(pn, "UnaryExpression"); |
| - ast.precedence = 4; |
| - ast.operand = parseToAst(pn.kids[0]); |
| - switch (pn.op) { |
| - case JSOP_NEG: ast.operator = "-"; break; |
| - case JSOP_POS: ast.operator = "+"; break; |
| - case JSOP_NOT: ast.operator = "!"; break; |
| - case JSOP_BITNOT: ast.operator = "~"; break; |
| - case JSOP_TYPEOF: ast.operator = "typeof"; break; |
| - case JSOP_VOID: ast.operator = "void"; break; |
| - case JSOP_TYPEOFEXPR: ast.operator = "typeof"; break; |
| - default: |
| - throw "Unknown operator: " + decode_op(pn.op); |
| - } |
| - return ast; |
| -} |
| -function convertTOK_INC(pn) { return convertPrePost(pn, '++'); } |
| -function convertTOK_DEC(pn) { return convertPrePost(pn, '--'); } |
| -function convertPrePost(pn, op) { |
| - let ast = shellNode(pn, "UnaryExpression"); |
| - ast.precedence = 3; |
| - ast.operator = op; |
| - ast.operand = parseToAst(pn.kids[0]); |
| - switch (pn.op) { |
| - case JSOP_INCNAME: |
| - case JSOP_INCPROP: |
| - case JSOP_INCELEM: |
| - case JSOP_DECNAME: |
| - case JSOP_DECPROP: |
| - case JSOP_DECELEM: |
| - /*ast.type = "PrefixExpression";*/ break; |
| - case JSOP_NAMEINC: |
| - case JSOP_PROPINC: |
| - case JSOP_ELEMINC: |
| - case JSOP_NAMEDEC: |
| - case JSOP_PROPDEC: |
| - case JSOP_ELEMDEC: |
| - ast.type = "PostfixExpression"; break; |
| - default: |
| - throw "Unknown operator: " + decode_op(pn.op); |
| - } |
| - return ast; |
| -} |
| - |
| -function convertTOK_DOT(pn) { |
| - let ast = shellNode(pn, "MemberExpression"); |
| - ast.precedence = 1; |
| - ast.container = parseToAst(pn.kids[0]); |
| - ast.member = shellNode(pn, "LiteralExpression"); |
| - ast.member.objtype = "string"; |
| - ast.member.value = pn.atom; |
| - ast.constmember = pn.atom; |
| - return ast; |
| -} |
| - |
| -function convertTOK_LB(pn) { |
| - let ast = shellNode(pn, "MemberExpression"); |
| - ast.precedence = 1; |
| - ast.container = parseToAst(pn.kids[0]); |
| - ast.member = parseToAst(pn.kids[1]); |
| - return ast; |
| -} |
| - |
| -function convertTOK_RB(pn) { |
| - let ast = shellNode(pn, "ArrayLiteral"); |
| - ast.precedence = 0; |
| - ast.members = [parseToAst(x) for each (x in pn.kids)]; |
| - return ast; |
| -} |
| - |
| -/* Returns a list */ |
| -function convertTOK_LC(pn) { |
| - let ast = shellNode(pn, "BlockStatement"); |
| - ast.statements = [parseToAst(x) for each (x in pn.kids)]; |
| - if (ast.statements.length == 0) { |
| - return shellNode(pn, "EmptyStatement"); |
| - } |
| - return ast; |
| -} |
| - |
| -function convertTOK_RC(pn) { |
| - let ast = shellNode(pn, "ObjectLiteral"); |
| - ast.setters = [parseToAst(x) for each (x in pn.kids)]; |
| - return ast; |
| -} |
| - |
| -function convertTOK_LP(pn) { |
| - if (pn.op != JSOP_CALL && pn.op != JSOP_APPLY) { |
| - let ast = shellNode(pn, "LetStatement"); |
| - ast.variables = [parseToAst(x) for each (x in pn.kids)]; |
| - return ast; |
| - } |
| - let ast = shellNode(pn, "CallExpression"); |
| - ast.precedence = 2; |
| - ast.func = parseToAst(pn.kids[0]); |
| - ast.arguments = []; |
| - for (let i = 1; i < pn.kids.length; i++) |
| - ast.arguments[i - 1] = parseToAst(pn.kids[i]); |
| - return ast; |
| -} |
| - |
| -function convertTOK_RP(pn) { |
| - let ast = shellNode(pn, "UnaryExpression"); |
| - ast.precedence = 2; |
| - ast.operand = parseToAst(pn.kids[0]); |
| - ast.operator = "()"; |
| - return ast; |
| -} |
| - |
| -function convertTOK_NAME(pn) { |
| - let ast = shellNode(pn, "IdentifierExpression"); |
| - ast.precedence = 0; |
| - ast.name = pn.atom; |
| - if (pn.kids.length > 0 && pn.kids[0]) { |
| - ast.initializer = parseToAst(pn.kids[0]); |
| - } |
| - return ast; |
| -} |
| - |
| - |
| -function convertTOK_NUMBER(pn) { |
| - let ast = shellNode(pn, "LiteralExpression"); |
| - ast.precedence = 0; |
| - ast.objtype = "number"; |
| - ast.value = pn.value; |
| - return ast; |
| -} |
| - |
| -function convertTOK_STRING(pn) { |
| - let ast = shellNode(pn, "LiteralExpression"); |
| - ast.precedence = 0; |
| - ast.objtype = "string"; |
| - ast.value = pn.atom; |
| - return ast; |
| -} |
| - |
| -function convertTOK_REGEXP(pn) { |
| - let ast = shellNode(pn, "LiteralExpression"); |
| - ast.precedence = 0; |
| - ast.objtype = "regex"; |
| - ast.value = pn.value; |
| - return ast; |
| -} |
| - |
| -function convertTOK_PRIMARY(pn) { |
| - let ast = shellNode(pn, "LiteralExpression"); |
| - ast.precedence = 0; |
| - switch (pn.op) { |
| - case JSOP_ZERO: ast.objtype = "number"; ast.value = 0; break; |
| - case JSOP_ONE: ast.objtype = "number"; ast.value = 1; break; |
| - case JSOP_NULL: ast.objtype = "null"; ast.value = null; break; |
| - case JSOP_FALSE: ast.objtype = "boolean"; ast.value = false; break; |
| - case JSOP_TRUE: ast.objtype = "boolean"; ast.value = true; break; |
| - case JSOP_THIS: |
| - return shellNode(pn, "ThisExpression"); |
| - default: |
| - throw "Unknown operand: " + decode_op(pn.op); |
| - } |
| - return ast; |
| -} |
| - |
| -function convertTOK_FUNCTION(pn) { |
| - let ast = shellNode(pn, "FunctionDeclaration"); |
| - // Precedence needs to be highest -> always wrapped |
| - ast.precedence = 1.0 / 0.0; |
| - ast.name = pn.name; |
| - if (pn.kids[0].type == TOK_UPVARS) |
| - pn = pn.kids[0]; |
| - let args = []; |
| - if (pn.kids[0].type == TOK_ARGSBODY) { |
| - pn = pn.kids[0]; |
| - while (pn.kids.length > 1) { |
| - let argNode = parseToAst(pn.kids.shift()); |
| - argNode.type = "Parameter"; |
| - args.push(argNode); |
| - } |
| - } |
| - ast.arguments = args; |
| - ast.body = parseToAst(pn.kids[0]); |
| - return ast; |
| -} |
| - |
| -function convertTOK_IF(pn) { |
| - let ast = shellNode(pn, "IfStatement"); |
| - ast.cond = parseToAst(pn.kids[0]); |
| - ast.body = parseToAst(pn.kids[1]); |
| - if (pn.kids[1]) |
| - ast.elsebody = parseToAst(pn.kids[2]); |
| - return ast; |
| -} |
| - |
| - |
| -function convertTOK_SWITCH(pn) { |
| - let ast = shellNode(pn, "SwitchStatement"); |
| - ast.expr = parseToAst(pn.kids[0]); |
| - let rhs = parseToAst(pn.kids[1]); |
| - if (rhs instanceof Array) |
| - ast.cases = rhs; |
| - else |
| - ast.cases = rhs.statements; |
| - return ast; |
| -} |
| - |
| -function convertTOK_CASE(pn) { |
| - let ast = shellNode(pn, "SwitchCase"); |
| - ast.expr = parseToAst(pn.kids[0]); |
| - ast.body = parseToAst(pn.kids[1]); |
| - return ast; |
| -} |
| -function convertTOK_DEFAULT(pn) { |
| - let ast = shellNode(pn, "SwitchCase"); |
| - ast.body = parseToAst(pn.kids[1]); |
| - return ast; |
| -} |
| - |
| -function convertTOK_WHILE(pn) { |
| - let ast = shellNode(pn, "WhileStatement"); |
| - ast.cond = parseToAst(pn.kids[0]); |
| - ast.body = parseToAst(pn.kids[1]); |
| - return ast; |
| -} |
| -function convertTOK_DO(pn) { |
| - let ast = shellNode(pn, "DoWhileStatement"); |
| - ast.body = parseToAst(pn.kids[0]); |
| - ast.cond = parseToAst(pn.kids[1]); |
| - return ast; |
| -} |
| - |
| -function convertTOK_FOR(pn) { |
| - let ast = shellNode(pn, "ForStatement"); |
| - let expr = parseToAst(pn.kids[0]); |
| - if (expr.type == "Forehead") { |
| - ast.init = expr.init; |
| - ast.cond = expr.condition; |
| - ast.inc = expr.increment; |
| - } else { |
| - ast.type = "ForInStatement"; |
| - ast.itervar = expr.lhs; |
| - ast.iterrange = expr.rhs; |
| - ast.itertype = (pn.iflags & 0x2 ? "for each" : "for"); |
| - } |
| - ast.body = parseToAst(pn.kids[1]); |
| - return ast; |
| -} |
| - |
| -function convertTOK_BREAK(pn) { |
| - let ast = shellNode(pn, "BreakStatement"); |
| - if (pn.atom) |
| - ast.label = pn.atom; |
| - return ast; |
| -} |
| -function convertTOK_CONTINUE(pn) { |
| - let ast = shellNode(pn, "ContinueStatement"); |
| - if (pn.atom) |
| - ast.label = pn.atom; |
| - return ast; |
| -} |
| - |
| -function convertTOK_IN(pn) { return binaryNode(pn, "in", 8); } |
| - |
| -function convertTOK_VAR(pn) { |
| - let ast = shellNode(pn, "VarStatement"); |
| - if (pn.op == JSOP_DEFCONST) |
| - ast.vartype = "const"; |
| - else |
| - ast.vartype = "var"; |
| - ast.variables = [parseToAst(x) for each (x in pn.kids)]; |
| - for each (let x in ast.variables) { |
| - if (x.type == "LetStatement") |
| - return x; |
| - if (x.type == "IdentifierExpression") |
| - x.type = "VarDeclaration"; |
| - } |
| - return ast; |
| -} |
| - |
| -function convertTOK_WITH(pn) { |
| - let ast = shellNode(pn, "WithStatement"); |
| - ast.variable = parseToAst(pn.kids[0]); |
| - ast.body = parseToAst(pn.kids[1]); |
| - return ast; |
| -} |
| - |
| -function convertTOK_RETURN(pn) { |
| - let ast = shellNode(pn, "ReturnStatement"); |
| - ast.expr = parseToAst(pn.kids[0]); |
| - return ast; |
| -} |
| - |
| -function convertTOK_NEW(pn) { |
| - let ast = shellNode(pn, "NewExpression"); |
| - ast.precedence = 1; |
| - ast.constructor = parseToAst(pn.kids[0]); |
| - ast.arguments = []; |
| - for (let i = 1; i < pn.kids.length; i++) |
| - ast.arguments.push(parseToAst(pn.kids[i])); |
| - return ast; |
| -} |
| - |
| -function convertTOK_DELETE(pn) { |
| - let ast = shellNode(pn, "UnaryExpression"); |
| - ast.precedence = 4; |
| - ast.operator = "delete"; |
| - ast.operand = parseToAst(pn.kids[0]); |
| - return ast; |
| -} |
| - |
| -function convertTOK_DEFSHARP(pn) { |
| - let ast = shellNode(pn, "SharpDefinitionExpression"); |
| - ast.expr = parseToAst(pn.kids[0]); |
| - ast.sharpnum = pn.number; |
| - return ast; |
| -} |
| -function convertTOK_USESHARP(pn) { |
| - let ast = shellNode(pn, "SharpExpression"); |
| - ast.sharpnum = pn.number; |
| - return ast; |
| -} |
| - |
| -function convertTOK_TRY(pn) { |
| - let ast = shellNode(pn, "TryStatement"); |
| - ast.body = parseToAst(pn.kids[0]); |
| - if (pn.kids[1]) |
| - ast.catchers = parseToAst(pn.kids[1]); |
| - else |
| - ast.catchers = []; |
| - if (pn.kids[2]) |
| - ast.fin = parseToAst(pn.kids[2]); |
| - return ast; |
| -} |
| - |
| -function convertTOK_CATCH(pn) { |
| - let ast = shellNode(pn, "CatchStatement"); |
| - ast.variable = parseToAst(pn.kids[0]); |
| - if (pn.kids[1]) |
| - ast.cond = parseToAst(pn.kids[1]); |
| - ast.body = parseToAst(pn.kids[2]); |
| - return ast; |
| -} |
| - |
| -function convertTOK_THROW(pn) { |
| - let ast = shellNode(pn, "ThrowStatement"); |
| - ast.expr = parseToAst(pn.kids[0]); |
| - return ast; |
| -} |
| - |
| -function convertTOK_INSTANCEOF(pn) { return binaryNode(pn, "instanceof", 8); } |
| - |
| -function convertTOK_DEBUGGER(pn) { return shellNode(pn, "DebuggerStatement"); } |
| -// XML OPS |
| - |
| -function convertTOK_YIELD(pn) { |
| - let ast = shellNode(pn, "UnaryExpression"); |
| - ast.operand = parseToAst(pn.kids[0]); |
| - ast.precedence = 16; |
| - ast.operator = "yield"; |
| - return ast; |
| -} |
| - |
| -function convertTOK_ARRAYCOMP(pn) { |
| - let ast = parseToAst(pn.kids[0]); |
| - ast.precedence = 0; |
| - ast.type = "ArrayComprehensionExpression"; |
| - if ("expr" in ast.body) |
| - ast.element = ast.body.expr; |
| - else { |
| - ast.element = ast.body.body.expr; |
| - ast.iterif = ast.body.cond; |
| - } |
| - delete ast.body; |
| - return ast; |
| -} |
| - |
| -function convertTOK_ARRAYPUSH(pn) { |
| - let ast = shellNode(pn, "ArrayPush"); |
| - ast.expr = parseToAst(pn.kids[0]); |
| - return ast; |
| -} |
| - |
| -function convertTOK_LEXICALSCOPE(pn) { |
| - return parseToAst(pn.kids[0]); |
| -} |
| - |
| -function convertTOK_LET(pn) { |
| - let ast = convertTOK_VAR(pn); |
| - if (ast.type == "VarStatement") |
| - ast.vartype = "let"; |
| - return ast; |
| -} |
| - |
| -function convertTOK_FORHEAD(pn) { |
| - let ast = shellNode(pn, "Forehead"); |
| - ast.init = pn.kids[0] ? parseToAst(pn.kids[0]) : |
| - shellNode(pn, "EmptyStatement"); |
| - ast.condition = pn.kids[1] ? parseToAst(pn.kids[1]) : |
| - shellNode(pn, "EmptyStatement"); |
| - ast.increment = pn.kids[2] ? parseToAst(pn.kids[2]) : |
| - shellNode(pn, "EmptyStatement"); |
| - return ast; |
| -} |
| - |
| -function convertTOK_RESERVED(pn) { |
| - return [parseToAst(x) for each (x in pn.kids)]; |
| -} |