【发布时间】:2021-10-17 03:15:36
【问题描述】:
JavaScript 源代码可以转换为 AST。我正在使用 SHIFT AST Parser 从 JavaScipt 代码创建 AST。
现在我想将生成的 AST 转换回源代码。
我在这里非常困惑,并试图了解基本原理。我从同事那里听说 AST 无法转换回源代码。但是是什么原因呢?
一位同事告诉我,AST 不保留间距,并且在将 AST 转换为源代码时会丢失缩进。
这是唯一的原因吗?
【问题讨论】:
-
另一个原因是cmets被丢弃了。
-
但是丢弃的 cmets 无法恢复。此外,有些人出于某种原因想要保留原始间距和缩进。例如,如果更改间距/缩进,
git diff之类的工具很难有效使用。 -
嗯......是的......这一切都取决于你在谈论什么 AST 实现。可以设计一个 AST 以绝对保留原始源代码中的所有内容。
-
@Exploring - 不,它们根本不是限制。取决于您所说的“原始来源”是什么意思-如果您想要原始代码中每个错误的缩进、奇数间距、字节对字节,那么不,您可能无法重现-我想我的问题是-为什么要你想要?当然,您可以生成有效的源代码,只是没有原始源代码
-
当然不是。即使是 CST 传统上也不会保留很多令牌流(空白和 cmets)。 AST 是 CST 的树重写,传统上保留的信息更少。重写功能可能不是一对一的,进一步使源重构成为问题。假设您有一种语言的关键字不区分大小写,因此关键字“func”和“Func”是等价的,但是 AST 不再保留标记,因为 AST 仅表示我们正在定义一个函数。预处理(解析器/重构器的管道)加剧了这个问题。
标签: javascript abstract-syntax-tree lexer shift-ast