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

Parsing 为编程语言编写代码格式化工具,parsing,antlr,salesforce,lexer,force.com,Parsing,Antlr,Salesforce,Lexer,Force.com,我正在研究为Apex语言(Java上的Salesforce.com变体)和基于标记的标记语言perhams VisualForce编写代码格式化工具的可行性 我不知道从哪里开始,除了感觉/知道从头开始编写语言解析器可能不是最好的方法之外 我对Antlr是什么以及它的作用有一个相当模糊的理解,但是从概念上来说,我想象人们可以“训练”Antlr来理解Apex的语法。然后,我可以在数据结构(AST?)中获得代码的结构化版本,然后我可以步行生成格式正确的代码 这是正确的概念吗?Antlr是这样做的工具吗

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

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

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

这是正确的概念吗?Antlr是这样做的工具吗?有关于这方面的简要概要的链接吗?我希望在这项任务上花上几天时间,而不是几个月,而且我也不确定它是否能实现

史蒂文·赫罗德写道:

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

你说的“火车”是什么意思?人工智能中的“训练”(训练神经网络)?如果是这样,那你就错了

史蒂文·赫罗德写道:

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

这是正确的概念吗?Antlr是这样做的工具吗

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

史蒂文·赫罗德写道:

。。。我希望在这项任务上花上几天时间,而不是几个月,而且我也不确定它是否能实现

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

因此,简而言之,如果您只想编写一个自定义代码高亮显示,那么ANTLR并不是您的最佳选择

你可以看看引擎盖下使用ANTLR的是什么。引用他们的网站:

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

但我怀疑你能在几天内安装并运行Eclipse插件


无论如何,祝你好运

由于Apex语法类似于Java,所以我将研究Eclipse的JDT。编辑Java语法以匹配Apex。使用格式规则/选项执行相同的操作。这不仅仅是几天的工作。

我们的设计是为了做任何类型的自动化软件再工程项目所必需的扑克赌注

DMS允许定义语法,类似于ANTLR(和其他解析器生成器)的样式。与ANTLR(和其他解析器生成器)不同,DMS使用GLR解析器,这意味着您不必修改语言语法规则来满足解析器生成器的要求。如果您可以编写上下文无关语法,DMS将把它转换为该语言的解析器。这意味着事实上,您可以比使用典型的LL或L(AL)R解析器生成器更快地生成一个工作正常的语法

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

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

DMS的lexer非常小心地捕获注释和“词法格式”(那个数字是八进制的吗?那个字符串有什么样的引号?转义字符?),以便正确地重新生成它们。解析为AST,然后按照预打印规则将AST预打印为文本,将任意丑陋的代码转换为格式化代码。(这个往返过程就是赌注:如果您想更进一步,实际操作AST,您仍然希望能够重新生成有效的源文本)

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

您可以从我们的网站下载使用DMS构建的许多不同的格式化程序中的任何一个,以了解这些格式化程序可以做什么


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

逆向工程语言以获得解析器是很困难的。非常努力!即使它非常接近Java

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

GitHub上的Force.com IDE中有一个出色的Apex解析器实现。它是