【问题标题】:Relationship between parsing, highlighting and completion解析、高亮和补全的关系
【发布时间】:2011-04-20 08:23:18
【问题描述】:

一段时间以来,我一直在考虑从头开始设计一种小型玩具语言,没有什么可以“统治世界”,但主要是作为一种练习。我意识到要实现这一目标需要学习很多东西。

这个问题是关于三个不同的概念(解析、代码突出显示和完成),我觉得它们非常相似。当然,解析和 ASTgen 是编译的一部分,而代码高亮和补全更多的是 IDE 的一个特性,但我想知道有什么相同点和不同点。

我需要一些在这个主题上更有经验的人的提示。哪些代码可以在这些概念之间共享,哪些架构考虑因素可以在这个意义上有所帮助?

【问题讨论】:

    标签: parsing architecture syntax-highlighting language-design code-completion


    【解决方案1】:

    你想要的是一个语法导向的structure editor。这是一个将解析与 AST 构建相结合并使用解析器来预测您接下来可以输入的内容(语法完成),或者与编译器的上次运行相关联,以便它可以解释编辑点以查看可能的有效标识符接下来通过检查在代码中该点最后相关的编译器符号表来进行。

    最困难的部分是为用户提供无缝体验;她几乎不得不相信她正在编辑文本,或者(结构编辑器的经验表明)她会因为尴尬而拒绝它。

    这是一个需要大量协调的机制,而且需要付出很大的努力。好消息是编译器无论如何都需要解析器。如果编辑也解析,则编译器所需的 AST 基本上是可用的。 (当然你也必须担心批量编译)。编译器必须建立一个符号表;所以你可以在编辑完成过程中使用它。更难的消息是解析器更难构建。他们不能只声明一个用户可见的语法错误并退出;相反,它们必须能够容忍同时存在的许多错误,保留部分 AST,并在用户删除错误时将它们缝合在一起。

    Berkeley Harmonia 的人们在这方面做得很好。阅读他们的一些论文以详细了解问题和解决问题的方法是值得您费心的。

    人们(尤其是Intentional ProgrammingXText)正在尝试的其他主要方法似乎是面向对象的编辑器,您可以在其中将编辑操作附加到每个 AST 节点,并将屏幕上的每个点与一个 AST 节点相关联。然后编辑动作调用 AST 节点特定的动作(插入字符、向右走、向上……),它可以决定如何操作以及如何修改屏幕。可以说你可以让这些编辑器做任何事情;在实践中有点困难。我用过这些编辑器;他们感觉不像文本编辑器。有一些热心的用户,但 YMMV。

    我认为您可能应该在尝试构建这样的编辑器与尝试定义新语言之间做出选择。同时做这两件事可能会让你不堪重负。

    【讨论】:

    • 感谢您的回答。虽然您提供了一些有价值的链接,但我仍然错过了一些关于您提到的编译器中的解析器和 IDE 中的解析器之间差异程度的见解。例如,我将 IDE 中的解析器想象为整个代码 + 当前行的某个函数 -> 某些编译器中已经存在的可能完成(例如,当您向函数提供错误的参数类型时,gcc 会提出替代方案)。
    • IDE 解析器必须比编译器解析器“做更多”,从某种意义上说(正如您所指出的)它需要知道接下来的 合法 是什么(作为编译器会这样做)以及接下来的可能是什么(编译器通常根本不关心)。 “可能”是基于整个应用程序的上下文;大部分来自编译器构建的符号表数据,并且可以说在您使用它时由 IDE 更新。 (GCC 为您提供替代方案实际上是在进行这种“可能”的诊断。当然,它很有帮助,这也是您希望在 IDE 中使用它的原因:)
    猜你喜欢
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 2015-05-01
    • 2020-12-02
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 2017-02-07
    相关资源
    最近更新 更多