智能缩进算法文档?

时间:2009-08-23 16:41:00

标签: algorithm ide indentation code-formatting

我非常喜欢记录IDE功能的正确行为,这些功能对编码流有微妙但重要的影响 - 例如自动完成选择评论/取消注释代码< / em>你可能没有意识到你利用了这一点,但最终你得到了比你可能做得更多的事情。我这样做是希望我必须使用的其他语言服务包含这些功能,从而改善了我的日常编码生活。 “Real”Smart Indent,即Visual Studio 2008 C#编辑器,就是其中一项功能。

基本的块代码缩进相当简单,可以在合理的时间内完成黑客攻击,以完成工作。另一方面,True Smart Indent可能是迄今为止我必须在IDE中实现的技术上最具挑战性的任务,并且我已经实现了我的公平份额。即使是全面的动态自动代码重新格式化也更容易;它只是按照Smart Indent进行繁重的工作。

我正在寻找通用智能缩进算法的高级讨论。 特别是,我正在寻找关于智能缩进策略的研究,或者对所有正常和“边缘”案例的客观描述,这些案例可以通过测试来确保可重复,无错误的结果。最终,我我希望提供功能的详细工作流程,实际实现该功能的具体基础,最后从中汇集特定语言版本并将其集成到我的语言服务中。

PS:Visual Studio 2010的C#编辑器在此功能中有几个小错误。自己实施之后,我对完成它所需的工作有了全新的尊重。

编辑(8/25):我设法write down a draft the rules,因为当智能缩进位于代码注释中时,我认为应该如何处理事情。我可能会从C ++ / C#角度对规则进行工作,但后来它们应该能够针对其他语言的方面进行参数化。

4 个答案:

答案 0 :(得分:5)

Emacs CC模式手册:Indentation Engine Basics

Steve Yegge博客咆哮:js2-mode: a new JavaScript mode for Emacs

来自后者的引用:“令人惊讶的是,令人惊讶的是,违反直觉,缩进问题几乎完全正交解析和语法验证。”

答案 1 :(得分:3)

您正在寻找的神奇搜索词可能是“pretty print”。

答案 2 :(得分:2)

与其他响应者一样,做正确的关键想法是精心打印, 也就是说,从代码的抽象语法结构生成文本。

基本上,您可以利用树的嵌套来生成嵌套 印刷文本。关键的想法是从树的叶子构建原始字符串,将水平框[文本的矩形]从子树上的其他框粘合在一起以提供水平构图,并将盒子粘在一起以获得更大的垂直框。

棘手的部分:使用树叶的格式化信息重新生成langauge文字(这个二进制浮点数有多少前导零?), 通过允许替代的盒子布局和回溯处理右边距溢出,以及模式匹配复杂的树结构以漂亮的方式对特定树进行漂白(例如,嵌套if-then-if-then-if ....)

以下是关于a research paper主题的(Full text PDF)

这里是what we did for prettyprintingDMS Software Reengineering Toolkit可以通过大规模元编程生成漂亮的AST。

答案 3 :(得分:1)

也许我错过了一些东西,但“智能缩进”将完全与语言的语法规范联系在一起。事实上,在一些google-fu之后我能找到的学术论文最接近的是与特定语言here有关的另一个SO问题。

所以,我担心我不能在技术上提供答案,因为我没有找到任何学术论文,而是作为一种元答案(遗憾的是,以问题的形式):是否更难比解析语言?我在模糊的可计算性/复杂性意义上使用“更难”一词,而不是指一个人实际投入的实际时间/精力/眼泪。

考虑一下:根据我的经验,缩进级别在某些子条款中发生变化。如果语句,循环,类,结构等等。解析器已经检测到所有这些。正如人们可以装饰一个解析树来构建一个语义树(这里是一个随机大学{(3}}的碎片),你不能用“缩进信息”来装饰解析树吗?

我想我只是看不出学术论文的所谓是什么。当然,除非有一些我遗漏的东西。这很可能,因为我当然不敢尝试这一点。 :)但是,从我的观点来看,似乎只需运行一个修改过的解析器即可实现这种智能缩进,而不是报告“解析错误”,它会自动重新格式化代码以使其有效(假设“真实” “解析器已经可以阻止了。”实时运行肯定会导致问题,并且依赖于空白的语言存在大量的缩进(因为缩进级别 是块的结尾)。

作为决赛(老实说,我差不多完成了!:))注意:根据我的经验,Emacs文本编辑非常好。我不知道它是如何工作的,但是如果我试试这个,那将是我看的第一个地方......当然,在那之后。 :))