我正在研究为Apex语言编写代码格式化工具的可行性,Java上的Salesforce.com变体,以及基于标记的标记语言perhams VisualForce。
我不知道从哪里开始这个,除了感觉/知道从头开始编写语言解析器可能不是最好的方法。
我对Antlr是什么以及它的作用有一个相当薄弱的把握,但从概念上讲,我想象一个人可以“训练”antlr来理解Apex的语法。然后我可以在数据结构(AST?)中获得代码的结构化版本,然后我可以走路来生成格式正确的代码。
这是正确的概念吗? Antlr是一个可以做到这一点的工具吗?有关此的简要概要的任何链接?我正在寻找投资这几天的任务,而不是几个月,而且我不确定它是否可以实现模糊。
答案 0 :(得分:2)
Steven Herod写道:
......我想象一个人可以'训练'antlr来理解Apex的语法。 ...
“'train'antlr”是什么意思?人工智能中的“训练”(训练神经网络)?如果是这样,那你就错了。
Steven Herod写道:
...在数据结构(AST?)中获取代码的结构化版本,然后我可以走路来生成格式正确的代码。
这是正确的概念吗? Antlr是一个可以做到这一点的工具吗?
是的,或多或少。您编写的语法可以精确定义要解析的语言。然后使用ANTLR,它将生成基于语法文件的词法分析器(标记器)和解析器。您可以让解析器从输入源创建一个AST,然后遍历AST并发出(自定义)输出/代码。
Steven Herod写道:
......我正在寻找投资这几天的任务,而不是几个月,而且我不确定它是否可以实现模糊。
好吧,我当然不认识你,但我会说为一种类似于Java的语言编写语法,然后在几天之内通过走AST来发出输出是不可能的,对于某人是ANTLR的新手。我对ANTLR非常熟悉,但我在短短几天内就无法做到。请注意,我只是在谈论“解析部分”,在你完成之后,你需要将它集成到一些文本编辑器中。这看起来更像是几个月甚至几周的项目,更不用说几天了。
因此,简而言之,如果您只想编写自定义代码荧光笔,ANTLR不是您的最佳选择。
你可以看一下使用ANTLR的Xtext。引用他们的网站:
使用Xtext,您可以轻松创建自己的编程语言和特定于域的语言(DSL)。该框架支持语言基础结构的开发,包括编译器和解释器以及基于Eclipse的完整IDE集成。 ... 的
但我怀疑你会在短短几天内启动并运行Eclipse插件。
无论如何,祝你好运!
答案 1 :(得分:2)
由于Apex语法类似于Java,我会看看Eclipse的JDT。编辑Java语法以匹配Apex。执行相同的w /格式规则/选项。这是超过几天的工作。
答案 2 :(得分: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的回答。这意味着您可以通过使用框布局指令简单地注释语法规则,在(激烈的)下午为您的语法构建一个漂亮的打印机。
DMS的词法分析器非常小心地捕获注释和“词法格式”(那个数字八进制?该字符串有什么样的引号?转义字符?)以便它们可以正确地重新生成。 Parse-to-AST然后是prettyprint-AST-to-text根据prettyprinting规则将任意丑陋的代码转换成格式化代码。 (这次往返是扑克赌注:如果你想进一步,实际操纵AST,你仍然希望能够重新生成有效的源文本。)
我们最近为EGL构建了解析器/ prettyprinters。这大约花了一个星期的时间。当然,我们是我们工具的专家。
您可以从我们的网站下载使用DMS构建的许多不同格式化程序,以查看此类格式化可以执行的操作。
2012年7月编辑:最后周(5天)使用DMS,从头开始我们(我个人)构建了完全符合IEC61131-3“结构化文本”(工业控制语言,类Pascal)解析器和prettyprinter。 (它处理标准文档中的所有示例)。
答案 3 :(得分:0)
反向工程语言以获得解析器很难。很难!即使它非常接近Java。
但为什么重新发明轮子?
作为GitHub上Force.com IDE的一部分,有一个精彩的Apex解析器实现。它只是一个没有源代码的jar,但你可以随意使用它。 And the developers behind it are really supportive and helpful
这里We are currently building an Apex module的{p> famous Java static code analyzer PMD。我们使用Salesforce.com内部解析器。它就像一个魅力。嘿,这是一个开源项目,我们需要任何类型的贡献者; - )