智能缩进算法文档?

Posted

技术标签:

【中文标题】智能缩进算法文档?【英文标题】:Smart Indent algorithm documentation? 【发布时间】:2010-11-22 01:59:45 【问题描述】:

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

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

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

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

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

【问题讨论】:

@Chris:没有我放回的两个链接,你无法说出这两个功能的范围以及我是如何仔细考虑它们的。 带有超链接,恕我直言,这是垃圾邮件。 @Chris:这就是为什么我遗漏了一个,而不是我博客上只是代码流程图的两个 我读过它们。尽管它们对您来说似乎很相关,但它们与 IMO 无关,因为它们无法回答这个问题,即引用“通用智能缩进算法的学术讨论”。 我不明白为什么您更喜欢学术论文而不是实际解决方案。例如,您是否看过 Doxygen 是如何做到这一点的? 【参考方案1】:

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

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

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

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

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

【讨论】:

我稍微(或很多)改变了这个问题。我在修复讨厌的错误时花费了大量时间来创建测试程序以防止回归。它比解析困难得多,因为 1) 速度很重要,而且 2) 在调用 Smart Indent 时,文档的语法几乎永远不会正确。 +1 表示“文档在语法上几乎从不正确”。这确实让事情变得更难了。通过纠错解析仍然可以做得很好;最低成本的维修告诉您应该有什么,然后您可以将问题简化为漂亮地打印一棵干净的树。【参考方案2】:

Emacs CC 模式手册:Indentation Engine Basics。

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

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

【讨论】:

Steve 的博客很有意义。我完全明白他来自哪里。需要注意的一点是:他的博客文章缺少大量需要考虑的案例,但这很可能是因为要列出的案例太多了。 好吧,我会的。我唯一的安慰是史蒂夫也相信得知这个问题与解析正交。 :) +1 我个人认为,基于构建真实工具,“智能缩进”需要你解析代码,然后漂亮打印。查看其他答案。【参考方案3】:

您要查找的神奇搜索短语可能是“pretty print”。

【讨论】:

阿门。 +1(显然我需要在这里输入 15 个字符,只是说我给了你一点)。【参考方案4】:

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

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

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

这里是a research paper,主题为(Full text PDF)。

这里是 what we did for prettyprinting 和 DMS Software Reengineering Toolkit,用于漂亮打印由大规模元编程生成的 AST。

【讨论】:

+1 那篇论文肯定有助于记录通用的智能缩进行为。我确实相信您大大低估了将智能缩进与任何正常解析算法相关联的难度。

以上是关于智能缩进算法文档?的主要内容,如果未能解决你的问题,请参考以下文章

Vim:在空白行上进入插入模式时智能缩进?

word文档的首行缩进两个字符怎么设置?

怎么设置首行缩进2字符

首行缩进2字符怎么设置?

段首缩进2字符怎么设置

首行悬挂缩进2字符怎么设置