lexer - TypeScript'in Sözdizim Ağacını nasıl alabiliriz?
Bir derleyicinin sözdizimi ağacını elde etme süreci var mı? Açık kaynak olduğu için tüm derleyici kodunu görebileceğimiz bir projede TypeScript’in sözdizimi ağacına erişmemiz gerekiyordu. Ama nasıl elde edeceğimizi bilmiyoruz. İnternette bazı makaleler okudum ama gerçekten kullanıcı dostu veya leyman terimleriyle yazılmış bir makale bulamıyorum. Bazıları, yapmamız gereken ilk adımın ayrıştırma adımını bulmak olduğunu söylemişti. Ama ondan sonra sırada ne yapacağımız hakkında hiçbir fikrimiz yoktu.
Acemi sorusu için üzgünüm. :)
Cevap #1
TypeScript derleyici API'si gerçekten oldukça kullanımı kolaydır. Bir TypeScript dosyasını çözümlemek ve AST'yi elde etmek için şunları deneyin:
const ts = require('typescript');
const sourceFile = ts.createSourceFile(filename,
fs.readFileSync(filename).toString(), ts.ScriptTarget.ES6, false);
console.log(sourceFile.ast);
Bu, örneğin AST'yi oluşturur:
{
"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"
},
...
