@millermedeiros / Agosto 2014
AST é normalmente um formato de transição
usado para descrever a estrutura original do programa antes que o mesmo seja convertido para outro formato.
function sum(a, b) {
return a + b;
}
{
"type": "Program",
"body": [
{
"type": "FunctionDeclaration",
"id": {
"type": "Identifier",
"name": "sum"
},
"params": [
{
"type": "Identifier",
"name": "a"
},
{
"type": "Identifier",
"name": "b"
}
],
"defaults": [],
"body": {
"type": "BlockStatement",
"body": [
{
"type": "ReturnStatement",
"argument": {
"type": "BinaryExpression",
"operator": "+",
"left": {
"type": "Identifier",
"name": "a"
},
"right": {
"type": "Identifier",
"name": "b"
}
}
}
]
},
"rest": null,
"generator": false,
"expression": false
}
]
}
Tokens são grupos de caracteres gerados apartir da análise léxica do programa.
a + b
[
{ "type": "Identifier",
"value": "a" },
{ "type": "Punctuator",
"value": "+" },
{ "type": "Identifier",
"value": "b" }
]
"Nodes" são representações de estruturas base do programa apartir da análise sintática
a + b
{
"type": "ExpressionStatement",
"expression": {
"type": "BinaryExpression",
"operator": "+",
"left": {
"type": "Identifier",
"name": "a"
},
"right": {
"type": "Identifier",
"name": "b"
}
}
}
{
"type": "VariableDeclaration",
"range": [ 34, 53 ],
"loc": {
"start": {
"line": 2,
"column": 0
},
"end": {
"line": 2,
"column": 19
}
},
// ...
}
Kyle Simpson (@getify), tentou mas não foi pra frente: https://github.com/getify/concrete-syntax-tree
a + b
(((a + b)))
o segundo exemplo parece Lisp mas é JavaScript válido :P
Formatador de JavaScript com mais de 200 opções de configuração.
One day esformatter will be "complete", don't give up!
var source = 'var foo = "bar";';
var ast = rocambole.parse(source);
rocambole.moonwalk(ast, function(node) {
if (node.type === 'VariableDeclaration') {
doStuffWithVar(node);
}
});
node.startToken
node.endToken
function toString(node) {
var str = '';
var token = node.startToken;
var last = node.endToken.next;
while (token !== last) {
str += token.raw || token.value;
token = token.next;
}
return str;
}
Converte módulos escritos no formato AMD para node.js