逆转解析的进度会很棒。
预期行为:
将对象恢复为已解析的格式。
实际行为:
我只能解析格式,不能将对象转回解析后的格式。
你好。 我不明白您请求的目标和背景(为什么)。 一个具体的样本可能会有所帮助。
解析将字符串识别为语言的一部分,并可选择构造 AST 或评估(解释)以下形式的表达式: parse(text) --> result
这个 _parse()_ 函数通常不能保证是一个双射函数。 因此,无法保证您可以反转解析,例如,您可以在解析过程中丢弃详细信息。
给定一个 AST,您可以将表达式生成为对应于一种语言的文本。 这是作为代码生成的一部分完成的,您可以使用模板引擎将 AST 转换为源代码。 但是这个任务超出了解析库的范围。
虽然我个人理解希望软件能够生成它可以解析的东西的感觉,正如@pjmolina总结的那样,这超出了这个库(解析器生成器)的范围,所以我将关闭它。
我建议你只制作你自己的代码生成器,对你正在解析的语言使用现有的代码生成器(你必须确保 AST 是正确的)。
这张票很有意义。 考虑到 PEG.js 语法中的语法,您希望还有哪个库将 AST 转换为源代码? 是的,目前没有办法做到这一点。 大多数 AST 是在操作中生成的,并且无法还原它们。 但是当我们在另一个问题中讨论了 AST 生成的语法时,它突然不仅有意义,而且可以实现。
例如, StringTemplate是您可以用于此类任务的众多工具之一:来自 AST 的代码生成。
我不认为 StringTemplate 读取 PEG.js 语法中的语法。
要恢复到原来的文本的AST(A bstract小号yntaxŤREE)是不够的。 例如给出一个 JavaScript 语法这两个语句
即使它们的语法略有不同,通常也会有相同的AST,
// statement 1
var x = 5
// statement 2 - with semicolon
var x = 5;
为了能够恢复到原始文本,解析器的操作必须是一个Injective 函数。
我个人不明白这样的功能如何成为解析库的一部分
依赖于嵌入式用户操作来创建输出结构。
也许在未来,如果 pegjs 会有某种自动解析树创建
这是可行的。
假设在 pegjs 嵌入的动作中,完整的位置信息是可用的
您可以插入自己的自定义嵌入操作来构建 CST / ParseTree
并且仅在解析后阶段将其转换为 AST。
一旦你有一个 CST 重新创建原始输入是相当微不足道的......
你可以在这里找到几个候选人:
https://tomassetti.me/parsing-in-javascript/
我决定再看看这个,但它必须在 v1 之后才能实现,因为这将是 API 稳定的地方,我可以发布一个提供基本通用 AST 结构的包(例如@pegjs/ast
?)。 解析器开发人员可以使用这个包来从中派生他们自己的 AST,如果需要,可以使用另一个工具将其转换回源代码(我在想@pegjs/reverse
)
@futagoza这个怎么样?
@Coffee2CodeNL pegjs v1 尚未发布。
有人可以推荐一些工具来从 AST 生成代码吗?
@lzane哪个 AST?
@polkovnikov-ph 一些由 PEG 生成的定制 AST
是否有任何读取 PEG 语法的工具可以完成代码生成工作?
最有用的评论
你好。 我不明白您请求的目标和背景(为什么)。 一个具体的样本可能会有所帮助。
解析将字符串识别为语言的一部分,并可选择构造 AST 或评估(解释)以下形式的表达式:
parse(text) --> result
这个 _parse()_ 函数通常不能保证是一个双射函数。 因此,无法保证您可以反转解析,例如,您可以在解析过程中丢弃详细信息。
给定一个 AST,您可以将表达式生成为对应于一种语言的文本。 这是作为代码生成的一部分完成的,您可以使用模板引擎将 AST 转换为源代码。 但是这个任务超出了解析库的范围。