智能缩进算法文档?

16

我喜欢记录IDE功能的正确使用方式,这些功能在编码流程中具有微妙但重要的影响,例如自动补全选择和注释/取消代码注释等,你可能没有意识到自己正在利用它们,但最终你完成的工作量会更多。我这样做是希望其他我必须使用的语言服务可以包含这些功能,从而改善我的日常编码生活。"真正的"智能缩进,即Visual Studio 2008 C#编辑器,就是其中之一。

基本块代码缩进相当简单,可以在合理的时间内很好地拼凑在一起,以完成工作。另一方面,真正的智能缩进可能是我迄今为止实现IDE中最具挑战性的任务之一,而我已经实现了自己公平份额的任务。即使是全面的即时自动代码重新格式化也更容易; 它只是将其推迟到智能缩进来完成繁重的工作。

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

PS: Visual Studio 2010 的 C# 编辑器在这个功能中有一些小错误。自己实现之后,我对它所花费的工作有了全新的尊重。

编辑 (8/25): 我设法起草了智能缩进规则,说明当智能缩进位于代码注释内部时应该如何处理。我可能会从 C++/C# 规则的角度出发进行工作,但稍后它们应该能够为其他语言的方面进行参数化。


@Chris:如果没有我重新放回的两个链接,你就无法了解这两个功能的范围以及我对它们的深思熟虑。 - Sam Harwell
2
带有超链接的内容,在我看来是垃圾邮件。 - ChrisW
@Chris:这就是为什么我留下了其中一个,但并没有在我的博客上留下那两个只是代码流程图的。 - Sam Harwell
我读过它们。虽然它们对你来说可能看起来相关,但在我看来,它们与回答问题即引用“通用智能缩进算法的学术讨论”无关。 - ChrisW
嗨,Sam,最近我一直在研究这个问题(因为Sublime Text和Atom的无能让我感到沮丧),你是否有更多的结论可以分享? - Kos
显示剩余4条评论
4个回答

5

Steve的博客讲得非常清晰易懂,我完全理解他的观点。需要注意的一点是:他的博文没有涵盖所有需要考虑的情况,但这很可能是因为太多了无法列举。 - Sam Harwell
哇,我真的惊了。我的唯一安慰是史蒂夫也认为这个问题与解析无关。 :) +1 - agorenst
我的个人观点是,基于构建实际工具,"智能缩进"需要解析代码,然后进行漂亮的打印。请参见其他答案。 - Ira Baxter

3
你正在寻找的神奇搜索词可能是“漂亮打印”。漂亮打印可能就是你需要的内容。

1
阿门。+1(显然我需要在这里输入15个字符,只是为了说我给你一个点)。 - Ira Baxter

2
与另一个回答者一样,正确的做法的关键思想是漂亮打印,即从代码的抽象语法结构生成文本。
基本上,您可以利用树的嵌套来产生打印文本的嵌套。关键思想是从树的叶子构建原始字符串,从子树中的其他框中粘合水平框[文本矩形]以提供水平组合,并将框粘合在彼此上方以获得更大的垂直框。
棘手的部分包括:从树叶中使用格式信息重新生成语言文字(那个二进制浮点数有多少前导零?),通过允许备选框布局和回溯来处理右边距溢出,以及模式匹配复杂的树结构以漂亮地打印特定的树(例如,嵌套的if-then-if-then-if....)。
这里是有关该主题的研究论文(完整的PDF全文)
这里是我们使用DMS软件重工具包对大规模元编程生成的AST进行漂亮打印的实现情况

+1 那篇论文肯定对记录普遍的智能缩进行为有所帮助。我确信你严重低估了将智能缩进与任何正常解析算法相关联的难度。 - Sam Harwell

1
也许我错过了什么,但“智能缩进”完全与语言的语法规范有关。在谷歌上搜索一番后,我找到的最接近学术论文的东西实际上是另一个关于特定语言的SO问题,here
所以,恐怕我无法在技术上提供答案,因为我没有找到任何学术论文,但作为一种元回答(遗憾的是,以问题的形式):它比解析语言更难吗?我使用“难”这个词是指计算/复杂性方面的模糊含义,而不是实际的时间/精力/眼泪。
考虑到:缩进级别的变化,在我的经验中,发生在某些子句内。if语句、循环、类、结构体等等。所有这些都已经被解析器检测到。就像可以用语义树来装饰解析树一样(这里是一个随机大学网站的碎片),你不能用“缩进信息”来装饰解析树吗?

我想我不明白为什么要发表学术论文。除非当然,有些事情我没有注意到。这很可能是因为我从未尝试过。:) 但是,从我的角度来看,似乎只需运行修改后的解析器,而不是报告“解析错误”,就可以实现智能缩进,并自动重新格式化代码,使其有效(假设“真正”的解析器已经批准该块)。实时运行肯定会引起问题,在依赖于空格的语言中存在模糊的缩进级别(因为缩进级别是块的结尾)。

最后(老实说,我快结束了!:))一句话:在我的经验中,Emacs文本编辑器非常好用。我不知道它是如何工作的,但如果我要尝试这个,那将是我首先寻找的地方...当然是在SO之后。:))


3
我稍微修改了问题(可能有些大)。我正在花费巨大的时间创建一个测试流程,以防止在修复恼人的 bug 的同时出现回归。这比解析要困难得多,因为1)速度非常重要,2)在调用智能缩进时,文档几乎从不在语法上正确。 - Sam Harwell
“document is almost never syntactically correct” 的确让事情变得更加困难。但是你仍然可以通过解析和错误修正来取得好的效果;最小代价修复告诉你应该有什么,然后你可以将问题简化为漂亮地打印出干净的树形结构。 - Ira Baxter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接