代码之家  ›  专栏  ›  技术社区  ›  Sam Harwell

智能缩进算法文档?

  •  14
  • Sam Harwell  · 技术社区  · 15 年前

    自动完成选择 注释/取消注释代码 你可能没有意识到你会占便宜,但到最后你做的事情比你可能做的要多。我这样做是希望我必须使用的其他语言服务能够包含这些特性,从而改善我的日常编码生活。”真正的“智能缩进”,即visualstudio2008c#编辑器,就是其中之一。

    我正在寻找通用智能缩进算法的高层讨论。 特别是,我要找的要么是对智能缩进策略的研究,要么是对所有正常和“边缘”情况的客观描述,这些情况可以通过测试来确保可重复的、无缺陷的结果。 最后,我想提供一个详细的功能流程,为实际实现该功能提供一个具体的基础,并最终从中组装一个语言特定的版本,并将其集成到我的语言服务中。

    注:Visual Studio 2010的C#编辑器在这个特性中有几个小错误。我自己实现了它,我对它所需要的工作有了全新的尊重。

    编辑(8/25): 我设法做到了 write down a draft the rules 当智能缩进在代码注释中时,我认为应该如何处理。我可能会从C++的C/C透视图中学习规则,但以后它们应该能够对其他语言的各个方面进行参数化。

    4 回复  |  直到 15 年前
        1
  •  5
  •   Marius Andersen Trey Jackson    15 年前

    Emacs CC模式手册: Indentation Engine Basics .

    js2-mode: a new JavaScript mode for Emacs .

    引用后者的话:“令人惊讶的是,令人惊讶的是,反直觉的是,缩进问题是 解析和语法验证。”

        2
  •  3
  •   Steven Huwig    15 年前

    你要找的神奇搜索词可能是“ pretty print

        3
  •  2
  •   Sam Harwell    15 年前

    像另一个回应者一样,正确处理这个问题的关键是预打印, 也就是说,从代码的抽象语法结构生成文本。

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

    棘手的部分:用来自树叶的格式化信息重新生成langauge文本(二进制浮点数有多少前导零?), 通过允许可选的框布局和回溯,以及模式匹配复杂的树结构以良好的方式预打印特定的树来处理右边距溢出(例如,嵌套的if-then-if-then-if…)

    a research paper 关于这个话题 (Full text PDF) .

    这是 what we did for prettyprinting DMS Software Reengineering Toolkit 预打印大规模元编程生成的AST。

        4
  •  1
  •   Community CDub    8 年前

    here .

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

    website ),不能用“缩进信息”来装饰解析树吗?

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

    作为期末考试(说实话,我差不多完了!:))注意:根据我的经验,Emacs文本编辑非常好。我不知道它是怎么工作的,但如果我尝试这个,那将是我第一次看到。。。之后,当然。:))