使用ANTLR4设计灵活语言应用程序的一般策略

时间:2014-09-22 07:06:47

标签: antlr dsl antlr4

要求:

我正在尝试使用antlr4开发语言应用程序。有问题的语言并不重要。重要的是语法非常广泛(容易> 2000规则!!! )。我想做一些操作

  • 提取大量信息。这些可以是调用图,变量名。常数表达式等。
  • 任意数量的转换:
    • 如果可以扩展循环,我们继续展开它
    • 如果我们可以消除死代码,我们可能会选择这样做
    • 我们可能会选择重命名所有变量名以符合某些规范。

这些操作中的每一个都可以彼此独立地应用。在应用这些步骤之后,我希望尽可能接近原始输入重写输入。

e.g。所以我们可能想要消除循环并重命名变量,然后以原始语言格式输出结果。

问题:

  1. 我认为需要为此构建自定义树(读取AST)。这样我就可以用每个转换修改树。但是当我想生成输出时,我失去了 TokenStreamRewriter 的优秀能力。我必须指定如何编写树的每个节点,我丢失了原始输入格式,我没有进行任何转换。 antlr4是否提供了解决此问题的好方法?
  2. AST是最好的方式吗?或者我是否构建自己的对象表示?如果是这样,我该如何有效地创建该对象?创建对象表示对于如此广泛的语言来说是非常大的痛苦。但从长远来看可能会更好。我怎样才能恢复原始格式?
  3. 是否可以在解析树上工作?
  4. 是否有类似的语言应用程序执行相同的操作?如果是这样,他们使用什么策略?
  5. 欢迎任何输入。 提前致谢。

1 个答案:

答案 0 :(得分:3)

通常,您想要的是Program Transformation System (PTS)

PTS通常具有解析器,构建AST,可以将AST重新打印以恢复可编译的源文本。更重要的是,他们有标准的方法来导航/检查/修改AST,以便您可以以编程方式更改它们。

许多人以模式匹配代码片段的形式提供这些功能,这些代码片段是用被转换语言的表面语法编写的;这避免了永远不必知道关于AST中哪些节点以及它们与子节点相关的极其详细的细节。当您使用大型复杂语法时,这非常有用,因为我们的大多数现代语言(以及我们的遗留语言)似乎都有。

更复杂的PTS(极少数)提供额外的工具来梳理源代码的语义。分析/转换大多数代码非常困难,而不知道各个符号属于哪个范围,或者它们的类型,以及许多其他细节,如数据流。完全披露:我建立其中一个。