¿Cómo podemos obtener el árbol de sintaxis de TypeScript?
lexer abstract-syntax-tree (2)
¿Existe un proceso para obtener un árbol de sintaxis de un compilador? Nos habían asignado un proyecto que necesita acceder al árbol de sintaxis de mecanografiado (que es un código abierto para que podamos ver el código completo del compilador). Pero no sabemos cómo conseguirlo. He estado leyendo algunos artículos en Internet, pero realmente no puedo encontrar un artículo fácil de usar o que esté escrito en el término de lehman. Creo que algunos mencionaron que el primer paso que debemos hacer es encontrar el paso de análisis. Pero después de eso no teníamos idea de qué hacer a continuación.
Lo siento por la pregunta de noob. :)
¿Necesita obtener el AST de un compilador específico o simplemente obtener el árbol de sintaxis de un programa en TypeScript? Si le interesa más adelante, entonces lo que debe hacer es tomar una gramática BNF para TypeScript (punto de partida here ) y luego usar ANTLR por ejemplo. Tiene una herramienta llamada ANTLRWorks que le permite visualizar el árbol de sintaxis de un programa.
El API del compilador de TypeScript es realmente muy fácil de usar. Para analizar un archivo mecanografiado y obtener el AST, intente lo siguiente:
const ts = require(''typescript'');
const sourceFile = ts.createSourceFile(filename,
fs.readFileSync(filename).toString(), ts.ScriptTarget.ES6, false);
console.log(sourceFile.ast);
Esto genera el AST, por ejemplo:
{
"kind": 251,
"pos": 0,
"end": 1097,
"flags": 0,
"bindDiagnostics": [],
"languageVersion": 2,
"fileName": "slidingWindow.ts",
"languageVariant": 0,
"scriptKind": 3,
"referencedFiles": [],
"amdDependencies": [],
"statements": [
{
"kind": 218,
"pos": 0,
"end": 69,
"flags": 0,
"name": {
"kind": 69,
"pos": 10,
"end": 22,
"flags": 0,
"text": "Accumulator",
"kindDecoded": "Identifier"
},
"members": [
{
"kind": 148,
"pos": 24,
"end": 67,
"flags": 0,
"parameters": [
{
"kind": 139,
"pos": 28,
"end": 42,
"flags": 0,
"name": {
"kind": 69,
"pos": 28,
"end": 32,
"flags": 0,
"text": "data",
"kindDecoded": "Identifier"
},
"type": {
"kind": 157,
"pos": 33,
"end": 42,
"flags": 0,
"elementType": {
"kind": 128,
"pos": 33,
"end": 40,
"flags": 0,
"kindDecoded": "NumberKeyword"
},
"kindDecoded": "ArrayType"
},
"kindDecoded": "Parameter"
},
{
"kind": 139,
"pos": 43,
"end": 57,
"flags": 0,
"name": {
"kind": 69,
"pos": 43,
"end": 49,
"flags": 0,
"text": "index",
"kindDecoded": "Identifier"
},
"type": {
"kind": 128,
"pos": 50,
"end": 57,
"flags": 0,
"kindDecoded": "NumberKeyword"
},
"kindDecoded": "Parameter"
}
],
"type": {
"kind": 128,
"pos": 59,
"end": 66,
"flags": 0,
"kindDecoded": "NumberKeyword"
},
"kindDecoded": "CallSignature"
}
],
"kindDecoded": "InterfaceDeclaration"
},
...