编写用于编程语言的代码格式化工具

| 我正在研究为Apex语言,Java上的Salesforce.com变体以及基于标记的标记语言perhams VisualForce编写代码格式化工具的可行性。 除了感觉/知道从头开始编写语言解析器可能不是最佳方法之外,我不知道从哪里开始。 我对Antlr是什么以及它的功能有相当的了解,但是从概念上讲,我正在想象可以“训练” Antlr来理解Apex的语法。然后,我可以在数据结构(AST?)中获得代码的结构化版本,然后可以步行生成正确格式的代码。 这是正确的概念吗? Antlr是做到这一点的工具吗?对此有任何简要概述的链接吗?我正在寻找在此任务上花费几天而不是几个月的时间,而且我不确定它是否可以实现。     
已邀请:
        由于Apex语法类似于Java,因此我将研究Eclipse的JDT。修改Java语法以匹配Apex。执行相同的w /格式化规则/选项。这是超过几天的工作。     
           史蒂文·希律(Steven Herod)写道:      ...我正在想象一个人可以“训练”理解Apex的语法。 ... 您“火车” antlr“”是什么意思?像人工智能(训练神经网络)中的“火车”?如果是这样,那么您就错了。   史蒂文·希律(Steven Herod)写道:      ...在数据结构(AST?)中获得代码的结构化版本,然后我可以步行以生成正确格式的代码。      这是正确的概念吗? Antlr是做到这一点的工具吗? 是的,或多或少。您编写了精确定义要解析的语言的语法。然后,您将使用ANTLR,它将基于语法文件生成词法分析器(令牌生成器)和解析器。您可以让解析器从输入源创建AST,然后遍历AST并发出(自定义)输出/代码。   史蒂文·希律(Steven Herod)写道:      ...我正在寻找几天时间来完成这项任务,而不是几个月,而且我不确定它是否可以实现。 好吧,我当然不认识你,但是我想说的是为类似于Java的语言编写语法,然后在短短几天之内通过走AST发出输出是不可能的,对于某人来说更是如此ANTLR的新手。我对ANTLR相当熟悉,但是短短几天我却做不到。请注意,我只是在谈论\“ parsing-part \”,完成之后,您需要将其集成到某些文本编辑器中。所有这些看起来都是一个数月而不是数周的项目,更不用说几天了。 因此,简而言之,如果您只想编写自定义代码荧光笔,那么ANTLR并不是您的最佳选择。 您可以看一下使用ANTLR的Xtext。引用他们的网站:   借助Xtext,您可以轻松创建自己的编程语言和特定领域的语言(DSL)。该框架支持语言基础结构的开发,包括编译器和解释器以及全面的基于Eclipse的IDE集成。 ... 但我怀疑您会在短短几天内启动并运行Eclipse插件。 无论如何,祝你好运!     
我们的DMS软件再造工具包旨在将其做为任何类型的自动化软件再造项目所必需的筹码赌注。 DMS允许定义一种语法,类似于ANTLR(和其他解析器生成器)样式。与ANTLR(和其他解析器生成器)不同,DMS使用GLR解析器,这意味着您不必弯腰语言语法规则即可满足解析器生成器的要求。如果您可以编写上下文无关的语法,则DMS会将其转换为该语言的解析器。实际上,这意味着与典型的LL或L(AL)R解析器生成器相比,您可以更快地获得正确的语法。 与ANTLR(和其他解析器生成器)不同,构建AST没有其他工作。它是自动构建的。这意味着您花费零时间编写树构建规则,而无需调试它们。 DMS还提供了一种漂亮的规范语言,可以指定垂直,水平或缩进堆叠的文本框,您可以在其中定义\“ format \”来将AST转换回完全合法,格式正确的源文本。没有一个著名的解析器生成器在这里提供任何帮助。如果要对树进行漂亮打印,则需要进行大量的自定义编码。有关此的更多详细信息,请参阅我对编译AST返回源代码的SO解答。这意味着您可以在一个(紧张的)下午为语法构建一个漂亮的打印机,只需用框布局指令注释语法规则即可。 DMS的词法分析器非常小心地捕获注释和“词法格式”(该数字是八进制的吗?该字符串具有什么样的引号?转义的字符?),以便可以正确地重新生成它们。解析到AST,然后执行prettyprint-AST到文本的往返过程,根据prettyprinting规则将任意难看的代码转换为格式化的代码。 (这是扑克的赌注:如果您想走得更远,要实际操作AST,您仍然希望能够重新生成有效的源文本)。 我们最近为EGL构建了解析器/ prettyprinters。这花了一个星期左右的时间。当然,我们是我们工具的专家。 您可以从我们的网站下载使用DMS构建的许多不同格式器中的任何一个,以查看这种格式可以做什么。 编辑2012年7月:上周(5天)使用DMS,从零开始,我们(我个人)构建了一个完全符合IEC61131-3的“结构化文本”(工业控制语言,类似于Pascal的语言)解析器和prettyprinter。 (它处理标准文档中的所有示例)。     
        对语言进行反向工程以获取解析器非常困难。很难!即使它非常接近Java。 但是为什么要重新发明轮子呢? 作为GitHub上Force.com IDE的一部分,有一个很棒的Apex解析器实现。它只是一个没有源代码的jar,但是您可以将其用于任何您想要的东西。而且它背后的开发人员确实是支持和帮助的。 我们目前正在这里构建著名的Java静态代码分析器PMD的Apex模块。我们使用Salesforce.com内部解析器。它像一种魅力。 嘿,这是一个开源项目,我们需要任何类型的贡献者;-)     

要回复问题请先登录注册