使用ANTLR4设计灵活语言应用程序的通用策略 要求:

使用ANTLR4设计灵活语言应用程序的通用策略 要求:,antlr,dsl,antlr4,Antlr,Dsl,Antlr4,我正在尝试使用antlr4开发一个语言应用程序。所讨论的语言并不重要。重要的是语法非常广泛(轻松>2000条规则!!!)。我想做一些手术 提取大量信息。这些可以是调用图、变量名。常量表达式等 任意数量的转换: 如果一个循环可以展开,我们就继续展开它 如果我们能够消除死代码,我们可能会选择这样做 我们可以选择重命名所有变量名以符合某些规范 每个操作都可以相互独立地应用。在应用这些步骤之后,我希望重写输入尽可能接近原始输入 e、 因此,我们可能希望消除循环并重命名变量,然后以原始语言格式输出

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

  • 提取大量信息。这些可以是调用图、变量名。常量表达式等
  • 任意数量的转换:
    • 如果一个循环可以展开,我们就继续展开它
    • 如果我们能够消除死代码,我们可能会选择这样做
    • 我们可以选择重命名所有变量名以符合某些规范
每个操作都可以相互独立地应用。在应用这些步骤之后,我希望重写输入尽可能接近原始输入

e、 因此,我们可能希望消除循环并重命名变量,然后以原始语言格式输出结果

问题:
  • 我认为有必要为此构建一个自定义树(readast)。这样我就可以用每个转换修改树。然而,当我想要生成输出时,我就失去了令牌流重写器的良好功能。我必须指定如何写入树的每个节点,并且我丢失了我没有进行任何转换的地方的原始输入格式。antlr4是否提供了解决此问题的好方法
  • AST是最好的方式吗?还是我要构建自己的对象表示?如果是,我如何有效地创建该对象?创建对象表示对于如此庞大的语言来说是一件非常痛苦的事情。但从长远来看可能更好。再说一次,我如何恢复原始格式
  • 是否可以只在解析树上工作
  • 有没有做同样事情的类似语言应用程序?如果是,他们使用什么策略
  • 欢迎任何意见。
    提前谢谢

    一般来说,你想要的东西叫做a

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

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


    更复杂的PTS(很少)提供了额外的工具,用于梳理源代码的语义。在不知道单个符号所属的范围、类型以及许多其他细节(如数据流)的情况下,分析/转换大多数代码是非常困难的。完整披露:我构建了其中之一。

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