【发布时间】:2014-09-26 23:58:33
【问题描述】:
要求:
我正在尝试使用 antlr4 开发语言应用程序。所讨论的语言并不重要。重要的是语法非常庞大(轻松 >2000 条规则!!!)。我想做一些操作
- 提取大量信息。这些可以是调用图、变量名。常量表达式等
- 任意数量的转换:
- 如果可以展开循环,我们继续展开它
- 如果我们可以消除死代码,我们可能会选择这样做
- 我们可能会选择重命名所有变量名以符合某些规范。
这些操作中的每一个都可以相互独立地应用。在应用这些步骤之后,我希望尽可能接近原始输入的重写输入。
例如所以我们可能想消除循环并重命名变量,然后以原始语言格式输出结果。
问题:
- 我认为需要为此构建一个自定义树(读取 AST)。这样我就可以使用每个转换来修改树。但是,当我想生成输出时,我失去了 TokenStreamRewriter 的出色功能。我必须指定如何编写树的每个节点,并且我会丢失未进行任何转换的地方的原始输入格式。 antlr4 是否提供了解决此问题的好方法?
- AST 是最好的方法吗?还是我构建自己的对象表示?如果是这样,我如何有效地创建该对象?对于如此庞大的语言,创建对象表示是非常痛苦的。但从长远来看可能会更好。同样,如何恢复原始格式?
- 是否可以只在解析树上工作?
- 是否有类似的语言应用程序做同样的事情?如果是,他们使用什么策略?
欢迎任何意见。 提前致谢。
【问题讨论】:
-
ANTLR 是一个解析器生成器,支持构建树。这通常不足以支持做所有你想做的事情。 “是否有类似的语言应用程序做同样的事情?” ==> 见我的文章“解析后的生活”(通过谷歌或我的简历)。