Gio*_*hal 6 architecture parsing language-design syntax-highlighting code-completion
一段时间以来,我一直在考虑从零开始设计一种小玩具语言,没有任何"统治世界",但主要是作为练习.我意识到要完成这项工作还有很多东西需要学习.
这个问题是关于三个不同的概念(解析,代码突出显示和完成),这些概念让我非常相似.当然,解析和ASTgen是编译的一部分,而代码突出显示和完成更多是IDE的一个功能,但我想知道有什么相似之处和不同之处.
我需要一些在这个主题上更有经验的人的提示.这些概念之间可以共享哪些代码,以及在这种意义上可以提供哪些架构注意事项?
您需要的是一个语法导向的结构编辑器。这是一种将解析与 AST 构建相结合的方法,并使用解析器来预测您接下来可以输入的内容(语法完成),或者与编译器的上次运行有关,以便它可以解释编辑点以查看有效的标识符可能是什么接下来,检查代码中该点最后相关的编译器符号表。
最困难的部分是为用户提供无缝的体验;她几乎必须相信她正在编辑文本,否则(结构编辑器的经验表明)她会因为尴尬而拒绝它。
这是需要协调很多机器并且付出相当大的努力。好消息是编译器无论如何都需要一个解析器;如果编辑也解析,那么编译器所需的 AST 基本上就可用了。(当然你也必须担心批量编译)。编译器必须建立一个符号表;这样您就可以在编辑完成过程中使用它。更困难的消息是解析器的构建要困难得多。他们不能只是声明用户可见的语法错误并退出;相反,它们必须容忍同时存在的许多错误,保留各个片段的部分 AST,并在用户删除错误时将它们缝合在一起。
伯克利哈莫尼亚人在这一领域做得很好。花点时间阅读他们的一些论文以详细了解问题以及处理这些问题的方法是非常值得的。
人们尝试的其他主要方法(特别是意向编程和XText)似乎是面向对象的编辑器,您可以将编辑操作附加到每个 AST 节点,并将屏幕上的每个点与 AST 节点相关联。然后编辑动作调用 AST 节点特定动作(插入字符、向右、向上……),它可以决定如何操作以及如何修改屏幕。可以说你可以让这些编辑做任何事情;实际操作起来有点困难。我用过这些编辑器;他们感觉不像文本编辑器。有一些热心用户,但是 YMMV。
我认为您可能应该在尝试构建这样的编辑器与尝试定义新语言之间做出选择。同时做这两件事可能会给你带来麻烦。