为编程语言编写代码格式化工具
我正在研究为Apex语言编写代码格式化工具的可行性,这是Salesforce.com上Java的一个变体,并且是基于标记的标记语言VisualForce。
我不知道从哪里开始,除了感觉/知道从头开始编写语言解析器可能不是最好的方法。
我对Antlr是什么以及它做什么有一个相当薄弱的把握,但从概念上来说,我想象一个人可以“训练”antlr来理解Apex的语法。 然后,我可以在数据结构(AST?)中获得代码的结构化版本,然后我可以步行生成正确格式的代码。
这是正确的概念吗? Antlr是一个工具吗? 任何链接到这个简要的简介? 我正在寻找投资几天来完成这项任务,而不是几个月,而且我不确定它是否可以实现。
由于Apex语法类似于Java,因此我会考虑Eclipse的JDT。 编辑Java语法以匹配Apex。 做相同的w /格式化规则/选项。 这是几天以上的工作。
史蒂文赫罗德写道:
...我想象着能够训练antlr来理解Apex的语法。 ...
“'train'antlr是什么意思?” “训练”为人工智能(训练神经网络)? 如果是这样,那么你错了。
史蒂文赫罗德写道:
...在数据结构(AST?)中获取代码的结构化版本,然后我可以步行生成正确格式的代码。
这是正确的概念吗? Antlr是一个工具吗?
是的,或多或少。 你写一个语法来精确定义你想要解析的语言。 然后你使用ANTLR,它会根据语法文件生成一个词法分析器(tokenizer)和分析器。 你可以让解析器从输入源创建一个AST,然后走AST并发出(自定义)输出/代码。
史蒂文赫罗德写道:
......我正在寻找投资几天来完成这项任务,而不是几个月,而且我不确定它是否可以实现。
好吧,我当然不知道你,但是我会说为类似于Java的语言写一个语法,然后在几天内散步输出AST是不可能的,对于新来的人来说更是如此ANTLR。 我对ANTLR相当熟悉,但几天后我无法做到。 请注意,我只是在谈论“解析部分”,在完成之后,您需要将其集成到某个文本编辑器中。 这一切看起来都是几个月甚至几周的项目,更不用说几天了。
所以,简而言之,如果你只想写一个自定义代码荧光笔,ANTLR不是你的最佳选择。
你可以看看在底层使用ANTLR的Xtext。 引用他们的网站:
借助Xtext,您可以轻松创建自己的编程语言和领域特定语言(DSL)。 该框架支持语言基础设施的开发,包括编译器和解释器以及全面的基于Eclipse的IDE集成。 ...
但是我怀疑你会在短短几天内启动并运行一个Eclipse插件。
无论如何,祝你好运!
我们的DMS软件再造工具包旨在做到这一点,因为它可以做任何形式的自动化软件再造项目。
DMS允许定义一个语法,类似于ANTLR(和其他解析器生成器)的样式。 与ANTLR(和其他解析器生成器)不同,DMS使用GLR解析器,这意味着您不必弯曲语言语法规则以满足解析器生成器的要求。 如果您可以编写上下文无关文法,DMS会将其转换为该语言的解析器。 这意味着事实上,您可以比使用典型的LL或L(AL)R语法分析器生成器快得多地运行正确的语法。
与ANTLR(和其他解析器生成器)不同,没有额外的工作来构建AST; 它是自动构建的。 这意味着你花零时间编写树建立规则,而不用调试它们。
DMS另外提供了一个漂亮的打印规范语言,指定垂直,水平或缩进的文本框堆栈,您可以在其中定义用于将AST转换回完全合法,格式良好的源文本的“格式”。 没有一个众所周知的解析器生成器在这里提供任何帮助; 如果你想打印这棵树,你可以做很多自定义编码。 有关这方面的更多详细信息,请参阅我的答案,以便将AST编译回源代码。 这意味着你可以在一个(紧张的)下午为你的语法构建一个漂亮的打印机,只需用框布局指令注释语法规则即可。
DMS的词法分析器非常小心地捕捉注释和“词汇格式”(是八进制数字?该字符串具有什么样的引号?转义字符?),以便它们可以正确地重新生成。 按照美化打印规则,将解析到AST转换为AST打印文本,然后将粗糙的AST代码转换为格式化的代码。 (这次回合是扑克赌注:如果你想进一步,实际操纵AST,你仍然希望能够重新生成有效的源文本)。
我们最近为EGL构建了解析器/ prettyprinters。 这花了大约一个星期的时间。 当然,我们是我们工具的专家。
您可以从我们的网站下载任何使用DMS构建的不同格式化器,以查看此类格式化可以执行的操作。
编辑2012年7月:上周(5天)使用DMS,从头开始,我们(我个人)构建了完全符合IEC61131-3“结构化文本”(工业控制语言,帕斯卡样)解析器和漂亮打印机。 (它处理来自标准文件的所有例子)。
链接地址: http://www.djcxy.com/p/7591.html上一篇: Writing a code formatting tool for a programming language
下一篇: How to integrate Google Closure Compiler as a build step in Visual Studio 2010