1 | var util = require('util');
|
2 | var esprima = require('esprima');
|
3 | var syntax = require('./syntax');
|
4 | var traverse = require('./traverse');
|
5 |
|
6 | exports.parse = function parse(code) {
|
7 | var options = {
|
8 |
|
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 |
|
19 | function 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 |
|
48 | function 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 | }
|