【问题标题】:General stategy for designing Flexible Language application using ANTLR4使用 ANTLR4 设计灵活语言应用程序的一般策略
【发布时间】:2014-09-26 23:58:33
【问题描述】:

要求:

我正在尝试使用 antlr4 开发语言应用程序。所讨论的语言并不重要。重要的是语法非常庞大(轻松 >2000 条规则!!!)。我想做一些操作

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

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

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

问题:

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

欢迎任何意见。 提前致谢。

【问题讨论】:

  • ANTLR 是一个解析器生成器,支持构建树。这通常不足以支持做所有你想做的事情。 “是否有类似的语言应用程序做同样的事情?” ==> 见我的文章“解析后的生活”(通过谷歌或我的简历)。

标签: antlr dsl antlr4


【解决方案1】:

一般来说,你想要的就是Program Transformation System (PTS)

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

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

更复杂的 PTS(很少)提供额外的工具来梳理源代码的语义。如果不知道各个符号属于什么范围,或者它们的类型,以及许多其他细节(例如数据流),就很难分析/转换大多数代码。全面披露:我构建了其中之一。

【讨论】:

    猜你喜欢
    • 2010-12-18
    • 2020-10-07
    • 1970-01-01
    • 2014-10-23
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多