一段时间以来,我一直在考虑从零开始设计一种小型玩具语言,没有任何“统治世界”,但主要是作为练习。我意识到要完成这项工作还有很多东西需要学习。
这个问题是关于三个不同的概念(解析,代码突出显示和完成),这些概念让我非常相似。当然,解析和ASTgen是编译的一部分,而代码突出显示和完成更多是IDE的一个功能,但我想知道它们的相似之处和不同之处。
我需要一些在这个主题上更有经验的人提示。这些概念之间可以共享哪些代码,以及在这个意义上可以提供哪些架构考虑因素?
答案 0 :(得分:2)
您想要的是语法导向的structure editor。这是一个将解析与AST构建相结合并使用解析器来预测下一步可以键入的内容(语法完成),或者与编译器的上一次运行有关系,以便它可以解释编辑点以查看哪些有效标识符可能通过检查代码中该点的最后相关的编译器符号表来接下来。
最困难的部分是为用户提供无缝体验;她几乎不得不相信她正在编辑文字或者(结构编辑节目的经验)她会拒绝它作为尴尬。
这是很多协调机制和相当大的努力。好消息是你无论如何都需要一个解析器来编译器;如果编辑也解析,编译器所需的AST基本上可用。 (当然你也要担心批量编译)。编译器必须构建一个符号表;所以你可以在编辑完成过程中使用它。更难的消息是解析器构建起来要困难得多;他们不能只声明用户可见的语法错误并退出;相反,他们必须容忍同一时刻存在的一些错误,为这些碎片保留部分AST,并在用户删除错误时将它们拼接在一起。
Berkeley Harmonia人在这方面做得很好。阅读他们的一些论文以详细了解问题和处理问题的方法是值得的。
人们(特别是Intentional Programming和XText)似乎尝试的其他主要方法是面向对象的编辑器,您可以在其中将编辑操作附加到每个AST节点,并将屏幕上的每个点与AST节点。然后编辑动作调用AST节点特定的动作(插入字符,向右,向上,......),它可以决定如何操作以及如何修改屏幕。可以说你可以让这些编辑做任何事情;它在实践中有点难度。我用过这些编辑;他们不喜欢文本编辑。有一些热心的用户,但是YMMV。
我认为您可能应该在尝试构建此类编辑器与尝试定义新语言之间做出选择。一次做两件事可能会让你无所适从。