UNPKG

2.1 kBJavaScriptView Raw
1var util = require('util');
2var esprima = require('esprima');
3var syntax = require('./syntax');
4var traverse = require('./traverse');
5
6exports.parse = function parse(code) {
7 var options = {
8 //loc: true,
9 comment: true,
10 };
11 var ast = esprima.parse(code, options);
12 ast = new syntax.Program(ast.body, ast.comments);
13
14 traverse(ast, constructor);
15 //console.log(util.inspect(ast, false, null, true));
16 return ast;
17}
18
19function constructor(statement) {
20 switch (statement.type) {
21 case 'BlockStatement':
22 return new syntax.BlockStatement(statement.body);
23 case 'ExpressionStatement':
24 return new syntax.ExpressionStatement(statement.expression);
25 case 'ForStatement':
26 return new syntax.ForStatement(statement.init, statement.test, statement.update, statement.body);
27 case 'FunctionDeclaration':
28 return new syntax.FunctionDeclaration(statement.id, statement.params, statement.body);
29 case 'Identifier':
30 return new syntax.Literal(statement.name);
31 case 'IfStatement':
32 return new syntax.IfStatement(statement.test, statement.consequent, statement.alternate);
33 case 'Literal':
34 return new syntax.Literal(statement.value);
35 case 'ReturnStatement':
36 return new syntax.ReturnStatement(statement.argument);
37 case 'SwitchStatement':
38 return new syntax.SwitchStatement(statement.discriminant, statement.cases);
39 case 'VariableDeclaration':
40 return new syntax.VariableDeclaration(statement.declarations, statement.kind);
41 case 'WhileStatement':
42 return new syntax.WhileStatement(statement.test, statement.body);
43 default:
44 return statement;
45 }
46}
47
48function expressionContructor(expression) {
49 switch (expression.type) {
50 case 'CallExpression':
51 return new syntax.CallExpression(expression.callee, expression.arguments);
52 case 'FunctionExpression':
53 return new syntax.FunctionExpression(expression.id, expression.params, expression.body);
54 case 'MemberExpression':
55 return new syntax.MemberExpression(expression.object, expression.property, expression.computed);
56 default:
57 return expression;
58 }
59}