解析、高亮和补全之间的关系



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

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

我需要在这个话题上更有经验的人给我一些提示。哪些代码可以在这些概念之间共享,哪些架构考虑可以在这方面提供帮助?

您需要的是一个语法导向的结构编辑器。它将解析与AST构建结合起来,并使用解析器预测您接下来可以键入什么(语法完成),或者与编译器的最后一次运行相关联,这样它就可以通过检查编译器的符号表来解释编辑点,以查看接下来可能出现的有效标识符,该符号表与代码中该点最后相关。

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

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

Berkeley Harmonia的人在这方面做得很好。你很值得花时间去阅读他们的一些论文,以获得对问题的详细了解和解决问题的一种方法。

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

我认为你可能应该在尝试构建这样一个编辑器和尝试定义一种新语言之间做出选择。同时做这两件事很可能会给你带来很多麻烦。

相关内容

  • 没有找到相关文章

最新更新