如何获取编译器的语法树?我们被分配了一个需要访问TypeScript语法树的项目(它是开源的,因此我们可以看到整个编译器的代码)。但是我们不知道如何获取它。我已经在互联网上阅读了一些文章,但我无法找到一个用户友好或用通俗易懂的语言写的文章。我相信有些人提到了我们需要做的第一步是找到解析步骤。但是在那之后我们不知道该怎么办。
抱歉问这种初学者问题 :)
如何获取编译器的语法树?我们被分配了一个需要访问TypeScript语法树的项目(它是开源的,因此我们可以看到整个编译器的代码)。但是我们不知道如何获取它。我已经在互联网上阅读了一些文章,但我无法找到一个用户友好或用通俗易懂的语言写的文章。我相信有些人提到了我们需要做的第一步是找到解析步骤。但是在那之后我们不知道该怎么办。
抱歉问这种初学者问题 :)
TypeScript编译器API非常易于使用。要解析TypeScript文件并获取AST,请尝试以下操作:
const ts = require('typescript');
const sourceFile = ts.createSourceFile(filename,
fs.readFileSync(filename).toString(), ts.ScriptTarget.ES6, false);
console.log(sourceFile.ast);
这将生成抽象语法树,例如:
{
"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"
},
...
你需要从特定编译器中获取AST,还是只需要从TypeScript程序中获取语法树?如果你关心后者,那么你可能需要获取TypeScript的BNF语法(起点在这里),然后使用ANTLR等工具。它有一个名为ANTLRWorks的工具,可以让你可视化程序的语法树。