为一种编程语言编写代码格式化工具

11

我正在研究为Apex语言编写代码格式化工具的可行性,这是Salesforce.com对Java的一种变体,也许还包括VisualForce,它是基于标记的标记语言。

除了感觉/知道从头开始编写语言解析器可能不是最佳方法之外,我对此毫无头绪。

我对Antlr是什么以及它的作用有一定了解,但在概念上,我想象可以“训练”Antlr来理解Apex的语法。然后,我可以获得一个数据结构中的结构化版本的代码(AST?),我可以遍历以生成正确格式化的代码。

这是正确的概念吗?Antlr是执行此操作的工具吗?任何关于此的简要概述的链接?我计划在这项任务上投资几天时间,而不是几个月,并且我不确定它是否甚至是隐约可行的。


所以你只是想要对代码进行语法高亮和自动缩进吗? - Blender
尝试使用带插件的Notepad++和/或Eclipse。 - Randy
主要关注自动缩进,但理想情况下会有类似于Checkstyle的工具。 - Steven Herod
4个回答

2

Steven Herod 写道:

... 我想象一下,antlr可以“训练”以理解Apex的语法。...

你所说的“'train' antlr”是什么意思?是否指人工智能中的训练神经网络?如果是这样的话,那么你是错误的。

Steven Herod 写道:

... 获取代码的结构化版本(AST?),然后可以遍历它以生成正确格式的代码。

这是正确的概念吗?Antlr是一个可以做到这一点的工具吗?

是的,差不多就是这个意思。你需要编写一个精确定义要解析的语言的文法。然后使用ANTLR根据该文法文件生成基于词法分析器和解析器的代码。您可以让解析器从输入源创建AST,然后遍历AST并发出(自定义)输出/代码。

Steven Herod 写道:

... 我想投入几天时间来完成这项任务,而不是几个月,我不确定它是否可行。

嗯,我当然不认识你,但我会说为类似Java的语言编写语法,然后通过遍历AST在几天内发出输出是不可能的,即使是对于ANTLR新手来说也更加如此。我对ANTLR相当熟悉,但我不能在短短几天内做到这一点。请注意,我只是谈论“解析部分”,在完成这项任务之后,您将需要将其集成到某个文本编辑器中。所有这些看起来都需要几个月,甚至不是几周,更不用说几天了。

所以,简而言之,如果您想编写自定义代码突出显示器,ANTLR不是您最好的选择。

您可以查看Xtext,该工具在幕后使用ANTLR。引用他们的网站:

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

但是我怀疑您无法在短短几天内运行Eclipse插件。

无论如何,祝你好运!


我所说的“train”是指“迭代配置”,我并没有期望涉及到人工智能 :) - Steven Herod

2

由于Apex语法与Java类似,建议查看Eclipse的JDT。将Java语法精简到与Apex匹配。同样地,处理格式规则/选项。这需要几天以上的工作。


这绝对是正确的方法。然而,这需要相当多的工作量。我喜欢Eclipse Java自动格式化程序,并且几个月前曾考虑过将其应用于Apex,但决定它不值得那么多的工作。我猜我需要大约两周时间将JDT格式化程序适配到Eclipse上。Apex和Java显然非常相似,但有足够的差异,而且代码格式化程序也很复杂,所以它看起来并不像我希望的那样简单。如果你在这方面取得任何进展,请告诉我,因为我很想要类似的东西。 - jkraybill
我并不相信Salesforce不会废弃Apex,否则我可能会有兴趣投入一些精力。 Apex是次优的,可能不值得工程师们维护的努力,并且可以通过与vmforce或heroku的良好集成来替换。 - Jeremy Ross

0

我们的DMS软件重构工具包旨在做任何类型的自动化软件重构项目所需的必要操作,就像德州扑克中的底池一样。

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

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

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

DMS的词法分析器非常小心地捕获注释和“词法格式”(那是八进制数字吗?那个字符串有什么引号?转义字符?),以便它们可以被正确地再生。将解析到AST,然后将AST漂亮地打印到文本中,可以将任意丑陋的代码循环转换为遵循漂亮打印规则的格式化代码。(这个循环旅程是扑克盲注:如果您想进一步操作AST,您仍然希望能够重新生成有效的源文本)。

我们最近为EGL构建了解析器/美化器。这需要大约一个周末的时间来完成。当然,我们对我们的工具非常熟练。
您可以从我们的网站下载使用DMS构建的许多不同格式化程序,以查看此类格式化可以做什么。
2012年7月编辑:上个星期(5天)使用DMS,我们(我个人)从头开始构建了一个完全符合IEC61131-3“结构化文本”(工业控制语言,类似于Pascal)的解析器和美化器。(它处理标准文档中的所有示例)。

当我阅读有关该工具包的信息时,它听起来很不错。是否有试用版/免费版本可用? - Jus12

0

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

但为什么要重复造轮子呢?

在GitHub上,Force.com IDE的一部分有一个精彩的Apex解析器实现。它只是一个没有源代码的jar文件,但您可以将其用于任何想要的目的。而且背后的开发人员非常支持和乐于助人

我们目前正在这里构建一个Apex模块

着名的Java静态代码分析器PMD。我们使用Salesforce.com内部解析器。它运作得非常好。

嘿,这是一个开放源代码项目,我们需要任何形式的贡献者 ;-)


嗨,罗伯特,这个项目的进展如何?已经完成了吗? - ajinkyah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接