9

我正在研究为 Apex 语言(Java 上的 Salesforce.com 变体)和 perhams VisualForce(其基于标签的标记语言)编写代码格式化工具的可行性。

我不知道从哪里开始,除了感觉/知道从头开始编写语言解析器可能不是最好的方法。

我对 Antlr 是什么以及它的作用知之甚少,但从概念上讲,我想象一个人可以“训练” antlr 来理解 Apex 的语法。然后,我可以在数据结构(AST?)中获得代码的结构化版本,然后我可以步行以生成格式正确的代码。

这是正确的概念吗?Antlr 是一个工具吗?有没有关于这个的简要概要的链接?我正在寻找在这项任务上投入几天,而不是几个月,我不确定它是否能模糊地实现。

4

4 回答 4

2

史蒂文希律写道:

...我想象一个人可以“训练” antlr 来理解 Apex 的语法。...

“'train'antlr”是什么意思?像人工智能一样“训练”(训练神经网络)?如果是这样,那你就错了。

史蒂文希律写道:

...在数据结构(AST?)中获取代码的结构化版本,然后我可以步行以生成格式正确的代码。

这是正确的概念吗?Antlr 是一个工具吗?

是的,或多或少。您编写的语法精确定义了您要解析的语言。然后使用 ANTLR,它将根据语法文件生成词法分析器(标记器)和解析器。您可以让解析器从您的输入源创建一个 AST,然后遍历 AST 并发出(自定义)输出/代码。

史蒂文希律写道:

...我正在寻找在这项任务上投入几天,而不是几个月,而且我不确定它是否可以模糊地实现。

好吧,我当然不认识你,但我想说为类似于 Java 的语言编写语法,然后在短短几天内通过 AST 发出输出是不可能的,对于新手来说更是如此ANTLR。我对 ANTLR 相当熟悉,但我在短短几天内做不到。请注意,我只是在谈论“解析部分”,在你完成之后,你需要将它集成到一些文本编辑器中。这一切看起来更像是一个几个月的项目,甚至不是几周,更不用说几天了。

因此,简而言之,如果您只想编写自定义代码荧光笔,那么 ANTLR 不是您的最佳选择。

你可以看看在底层使用 ANTLR 的Xtext 。引用他们的网站:

使用 Xtext,您可以轻松创建自己的编程语言和特定领域语言 (DSL)。该框架支持语言基础设施的开发,包括编译器和解释器以及成熟的基于 Eclipse 的 IDE 集成。...

但我怀疑您是否会在几天内启动并运行一个 Eclipse 插件。

无论如何,祝你好运!

于 2011-06-06T21:26:53.710 回答
2

由于 Apex 语法与 Java 相似,因此我会查看 Eclipse 的 JDT。编辑 Java 语法以匹配 Apex。使用格式规则/选项执行相同的操作。这已经不止几天的工作了。

于 2011-06-06T21:41:38.610 回答
0

我们的DMS Software Reengineering Toolkit旨在做到这一点,就像做任何类型的自动化软件再造项目所必需的那样。

DMS 允许定义语法,类似于 ANTLR(和其他解析器生成器)样式。与 ANTLR(和其他解析器生成器)不同,DMS 使用 GLR 解析器,这意味着您不必弯曲语言语法规则来满足解析器生成器的要求。如果您可以编写上下文无关语法,DMS 会将其转换为该语言的解析器。这意味着实际上您可以比使用典型的 LL 或 L(AL)R 解析器生成器更快地获得有效的、正确的语法。

与 ANTLR(和其他解析器生成器)不同,构建 AST 不需要额外的工作;它是自动构建的。这意味着您花费零时间编写树构建规则而无需调试它们。

DMS 还提供了一种漂亮的打印规范语言,指定文本框垂直、水平或缩进堆叠,您可以在其中定义用于将 AST 转换回完全合法、格式良好的源文本的“格式”。众所周知的解析器生成器在这里都没有提供任何帮助。如果你想漂亮地打印树,你需要做大量的自定义编码。有关这方面的更多详细信息,请参阅我对Compiling an AST back to source 的SO 回答。这意味着您可以在一个(紧张的)下午为您的语法构建一个漂亮的打印机,只需使用框布局指令注释语法规则。

DMS 的词法分析器非常小心地捕捉注释和“词法格式”(那个数字是八进制的吗?那个字符串有什么样的引号?转义字符?)以便它们可以正确地重新生成。Parse-to-AST 然后 prettyprint-AST-to-text 往返将任意丑陋的代码转换为遵循漂亮打印规则的格式化代码。(这个往返是赌注:如果你想走得更远,要实际操纵 AST,你仍然希望能够重新生成有效的源文本)。

我们最近为 EGL 构建了解析器/漂亮打印机。这花了大约一周的时间。当然,我们是我们工具的专家。

您可以从我们的网站下载使用 DMS 构建的多种不同格式化程序中的任何一种,以查看此类格式化可以做什么。

编辑 2012 年 7 月:上周(5 天)使用 DMS,我们(我个人)从头开始构建了一个完全符合 IEC61131-3“结构化文本”(工业控制语言,类似 Pascal)的解析器和漂亮打印机。(它处理标准文档中的所有示例)。

于 2011-06-07T00:25:24.573 回答
0

对一种语言进行逆向工程以获取解析器是很困难的。很难!即使它非常接近Java。

但为什么要重新发明轮子呢?

作为 GitHub 上 Force.com IDE 的一部分,有一个很棒的 Apex 解析器实现。它只是一个没有源代码的 jar,但您可以随意使用它。而且它背后的开发人员真的很支持和乐于助人

我们目前正在这里构建著名的 Java 静态代码分析器 PMD的Apex 模块。我们使用 Salesforce.com 内部解析器。它就像一个魅力。

嘿,这是一个开源项目,我们需要任何类型的贡献者;-)

于 2016-03-24T19:34:57.967 回答