我们如何获得TypeScript的语法树?
是否有获取编译器语法树的过程。我们被分配到一个需要访问typescript语法树的项目中(该语法树是开源的,因此我们可以看到整个编译器的代码)。但我们不知道如何得到它。我一直在互联网上读一些文章,但我真的找不到一篇用户友好的文章,也找不到用雷曼兄弟的术语写的文章。我相信有人提到,我们需要做的第一步是找到解析步骤。但在那之后,我们不知道下一步该怎么办我们如何获得TypeScript的语法树?,typescript,lexer,abstract-syntax-tree,parser-generator,Typescript,Lexer,Abstract Syntax Tree,Parser Generator,是否有获取编译器语法树的过程。我们被分配到一个需要访问typescript语法树的项目中(该语法树是开源的,因此我们可以看到整个编译器的代码)。但我们不知道如何得到它。我一直在互联网上读一些文章,但我真的找不到一篇用户友好的文章,也找不到用雷曼兄弟的术语写的文章。我相信有人提到,我们需要做的第一步是找到解析步骤。但在那之后,我们不知道下一步该怎么办 对不起,我的问题是noob.:) 您需要从特定的编译器获取AST,还是只需要从TypeScript中的程序获取语法树?如果您对后者感兴趣,那么您可能
对不起,我的问题是noob.:) 您需要从特定的编译器获取AST,还是只需要从TypeScript中的程序获取语法树?如果您对后者感兴趣,那么您可能需要为TypeScript(起点)获取一个BNF语法,然后使用ANTLR作为示例。它有一个名为ANTLRWorks的工具,允许您可视化程序的语法树。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);
这将生成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"
},
...
对你来说没有什么帮助,也许除了已经看透了这段代码的人。你学到的是,在一个大的软件中,很难找到你的方法。你需要花时间去挖掘源头。一个明显的技巧是在源代码中搜索单词“parse”、“tree”和“node”;定义/构建AST的代码肯定就在其中一个的附近,除非代码库真的很糟糕。为此,许多程序员喜欢的标准工具是“grep”。如果你不知道那是什么,可以在维基百科上找到。后面这个问题的答案可能有用。。。从大多数编译器获取AST的问题很难解决;更糟糕的是,他们拥有的AST往往是特殊的。另一个你可以考虑的替代方法是找到解析器生成器,甚至更好地进行程序变换,并使用(开发)TypeScript的语法;这类工具通常使构建AST变得相对容易,AST可用于编译以外的目的。