首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript:获取语法树

TypeScript:获取语法树
EN

Stack Overflow用户
提问于 2013-11-25 16:37:32
回答 4查看 14K关注 0票数 53

我读过“整个互联网”,但找不到任何关于从TypeScrypt源码中获取语法树(就像在Esprima中)的例子。我的意思是如何获得像这样的对象(Esprima Parser示例)

代码语言:javascript
复制
{
    "type": "Program",
    "body": [
        {
            "type": "VariableDeclaration",
            "declarations": [
                {
                    "type": "VariableDeclarator",
                    "id": {
                        "type": "Identifier",
                        "name": "answer"
                    },
                    "init": {
                        "type": "BinaryExpression",
                        "operator": "*",
                        "left": {
                            "type": "Literal",
                            "value": 6,
                            "raw": "6"
                        },
                        "right": {
                            "type": "Literal",
                            "value": 7,
                            "raw": "7"
                        }
                    }
                }
            ],
            "kind": "var"
        }
    ]
}

从javascript代码

代码语言:javascript
复制
var answer = 6 * 7;

是否仅用于TypeScript源文本?

附言:我非常希望你的帮助,因为我不想写出你自己的糟糕的自行车。

附注:我认为库文件typescript.ts(.js)和typescriptServices.ts(.js)对我有帮助,但我不知道如何:(

已解决的

非常感谢用户Steve Fenton。这是我的代码,如果有人对此感兴趣的话:

代码语言:javascript
复制
// uses
var typeScriptLS =  new Harness.TypeScriptLS();
var ServicesFactory = new Services.TypeScriptServicesFactory();
var serviceShim = ServicesFactory.createLanguageServiceShim(typeScriptLS);

// add lib.d.ts
var _libText = window.document.getElementById('lib.d.ts').innerText;
typeScriptLS.addScript('lib.d.ts', _libText.replace(/\r\n?/g,"\n"), true);

// add greeter.ts
var _sourceText = window.document.getElementById('greeter.ts').innerText;
typeScriptLS.addScript('greeter.ts', _sourceText.replace(/\r\n?/g,"\n"), true);

// script name
var _scriptName = 'greeter.ts';
// get syntax tree
var _st = serviceShim.languageService.getSyntaxTree(_scriptName);
//console.log(_st);
console.log(JSON.stringify(_st, "", 2));
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-25 18:52:04

这个问题出现在back in September面前。

目前还没有什么东西可以帮你做到这一点--没有什么神奇的getSyntaxTree方法可以调用来做到这一点。

不过,TypeScript编译器是开源的,而且完全是用TypeScript编写的,所以您可以扫描一下它,看看是否有什么东西可以使用/添加句柄。

这样做的好处是,你有一个很大的机会将你的工作作为一个开源项目发布,因为从这两个问题上的投票来看,这是有一些需求的。

或者,使用EsprimaSpiderMonkey从编译后的JavaScript (实际上将在运行时执行的代码)中获取语法树。

票数 9
EN

Stack Overflow用户

发布于 2013-11-26 00:07:09

TypeScript解析器不会直接生成这样的树,但是您仍然可以使用它的对象模型来做各种事情。例如,我们在一些工具中使用它来进行语法转换以用于测试目的。下面是一个可用于打印语法树的代码片段:

代码语言:javascript
复制
import ts = require('typescript');

const code = "enum { x = 1 }"
const sc = ts.createSourceFile('x.ts', code, ts.ScriptTarget.Latest, true);

let indent = 0;
function print(node: ts.Node) {
    console.log(new Array(indent + 1).join(' ') + ts.SyntaxKind[node.kind]);
    indent++;
    ts.forEachChild(node, print);
    indent--;
}

print(sc);
票数 25
EN

Stack Overflow用户

发布于 2018-06-21 04:03:34

使用重铸和巴比伦@next是可能的。尽管您必须信任由这些技术定义的语法来表示TypeScript代码AST,并且它们将保持最新-因为TypeScript具有新的语言特性,通过发布(短时间)发布-不像其他语言(JavaScript)那样,您具有定义良好的版本并以标准发布-因此,如果您的用户开始使用新的语言特性,这些技术(我猜巴比伦)应该保持最新,否则解析将失败

代码语言:javascript
复制
// npm install recast babylon@next
const source = `
interface I {
  color: string
}
class C implements I{
  color: string='blue'
}
`
const recast = require('recast')
const tsParser = require("recast/parsers/typescript")
const ast = recast.parse(source, {
  parser: tsParser
});
console.log(`
CODE: 

${source}

AST: 

${JSON.stringify(ast)}
`);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20187928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档