Pegjs: 预处理器? 重新生成源代码

创建于 2017-11-12  ·  5评论  ·  资料来源: pegjs/pegjs

我正在构建对现有语言的扩展作为预处理器。 我无法弄清楚是否有办法让 pegjs 重新生成源代码。 基本上我希望它解析源,我想修改 AST 然后重新生成源。 无论如何,这是可能的吗?

discussion question

最有用的评论

@YemSalat是对的,PEG.js 只是一个解析器生成器。

  1. 使用 PEG.js 构建解析器(确保操作返回 AST)
  2. 使用生成的解析器解析您的语言以构建 AST
  3. 使用转换过程修改 AST
  4. 重新生成源代码

如您所见,PEG.js 只涉及第一步,所以如果您想重新生成源代码,您必须自己构建一个编译器,或者如果该语言已经存在编译器或生成器(工具链),我建议您要么返回与工具链兼容的 AST,要么添加一个转换来改变 AST 以使其与工具链更兼容。

结束,因为这实际上不是 PEG.js 的问题,但欢迎您继续讨论。

所有5条评论

@mattkanwisher抱歉,我不太明白您所说的“重新生成”源是什么意思。
你能澄清一下吗? 如果您的意思是基于 AST 生成代码 - 您必须自己编写该逻辑,直接在语法中或作为单独的部分。

是的,基于 AST 生成代码,所以如果我想使用它进行预处理,我必须生成一个编译器回到原始源代码?

嗯,如果你想要 _original_ 源 - 你仍然需要它来生成它,对吧?
但是如果你想要它的修改版本 - 你必须自己编写代码生成逻辑。
@Mingun @futagoza如果我错了,请纠正我)

@YemSalat是对的,PEG.js 只是一个解析器生成器。

  1. 使用 PEG.js 构建解析器(确保操作返回 AST)
  2. 使用生成的解析器解析您的语言以构建 AST
  3. 使用转换过程修改 AST
  4. 重新生成源代码

如您所见,PEG.js 只涉及第一步,所以如果您想重新生成源代码,您必须自己构建一个编译器,或者如果该语言已经存在编译器或生成器(工具链),我建议您要么返回与工具链兼容的 AST,要么添加一个转换来改变 AST 以使其与工具链更兼容。

结束,因为这实际上不是 PEG.js 的问题,但欢迎您继续讨论。

所以我想通了。 对于将来登陆此错误帖子的任何人。 只需阅读“超级微型编译器”的源代码即可。 之后,我能够在几个小时内使用 pegjs 构建我的预处理器

https://github.com/thejameskyle/the-super-tiny-compiler

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

mreinstein picture mreinstein  ·  12评论

futagoza picture futagoza  ·  6评论

vldmr1986 picture vldmr1986  ·  12评论

StoneCypher picture StoneCypher  ·  8评论

marek-baranowski picture marek-baranowski  ·  6评论