16

我非常喜欢记录 IDE 功能的正确行为,这些功能对编码流程有微妙但重要的影响——比如自动完成选择注释/取消注释代码,你可能没有意识到你在利用,但在结束时那天你比你可能做的多一点。我这样做是希望我必须使用的其他语言服务包含这些功能,从而改善我的日常编码生活。“真正的”智能缩进,即 Visual Studio 2008 C# 编辑器,就是这些功能之一。

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

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

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

编辑(8/25):我设法写下了我认为当智能缩进在代码注释中时应该如何处理事情的规则草案。我可能会从 C++/C# 的角度研究规则,但稍后它们应该能够针对其他语言的各个方面进行参数化。

4

4 回答 4

5

Emacs CC 模式手册:缩进引擎基础

Steve Yegge 博客咆哮:js2-mode:Emacs 的新 JavaScript 模式

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

于 2009-08-24T12:59:59.197 回答
3

您正在寻找的神奇搜索短语可能是“漂亮的打印”。

于 2009-08-26T02:18:37.793 回答
2

与另一个响应者一样,正确执行此操作的关键思想是漂亮打印,即从代码的抽象语法结构生成文本。

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

棘手的部分:使用来自树叶的格式信息重新生成语言文字(二进制​​浮点数有多少前导零?),通过允许替代框布局和回溯处理右边距溢出,以及将复杂的树结构模式匹配到漂亮打印以很好的方式特定的树(例如,嵌套的 if-then-if-then-if ....)

这是关于该主题的研究论文(全文 PDF)

是我们使用DMS Software Reengineering Toolkit为漂亮打印大规模元编程生成的 AST 所做的工作。

于 2009-09-03T03:30:44.707 回答
1

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

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

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

我想我只是不明白学术论文的呼吁是什么。当然,除非我缺少某些东西。这是很有可能的,因为我当然从来不敢尝试这个。:) 但是,从我的角度来看,这种智能缩进似乎只需运行一个修改过的解析器就可以实现,而不是报告“解析错误”,它会自动重新格式化代码以使其有效(假设“真正的“解析器已经确定了该块)。实时运行肯定会导致问题,并且在依赖于空格的语言中存在不明确的缩进级别(因为缩进级别块的末尾)。

最后(老实说,我快完成了!:))注意:根据我的经验,Emacs 文本编辑器非常好。我不知道它是如何工作的,但如果我要尝试这个,那将是我首先要看的地方……当然,在 SO 之后。:))

于 2009-08-24T03:31:43.633 回答