parsing - 解析、突出显示和补全之间的关系

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

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

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

我需要在这个主题上更有经验的人的一些提示。这些概念之间可以共享哪些代码以及在这个意义上可以提供帮助的架构注意事项是什么?

最佳答案

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

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

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

Berkeley Harmonia人们在这一领域做得很好。花点时间阅读他们的一些论文以详细了解问题以及处理这些问题的方法是非常值得的。

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

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

关于parsing - 解析、突出显示和补全之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5727470/

相关文章:

python - 解析 XML 异常

ios - 如何从 CGPDFDocumentRef 获取预告片字典?

.net - 在客户端或业务层构建对象?

javascript - Atom 文本编辑器如何解析/标记代码? (语法高亮)

css - *.less Geany 中的语法高亮显示

PHP 解析 Amazon EC2 实例 'launchTime'

parsing - PEG.js - 如何解析 C 风格的注释?

c# - 在 Windows Azure 中部署 WCF 应用程序

azure - 消息队列触发器在可扩展性方面是否比 Http 触发器更好?

javascript - Reveal.js 中的语法高亮代码如何?