3

我正在为 Mac 编写一个开源文本编辑器,终于达到了我想要添加语法高亮的地步。在过去的几天里,我一直在反复讨论各种解决方案,最后我决定向更广泛的受众开放这个问题。

以下是我看到的选项:

  • 基本上用一系列正则表达式模式匹配来定义语言(类似于 TextMate 定义其语言的方式)
  • 使用BNF 或 PEG 等形式语法定义语言

使用正则表达式模式匹配似乎不太理想,因为它不能像正式语法一样正式地表示一种语言;然而,一些不太正式的语言将很难适应 BNF(即 Markdown——尽管我知道有一个很棒的PEG 实现)。

实时语法突出显示的性能权衡是什么?多种语言的灵活性如何?

如果我走 BNF 路线,Todd Ditchendorf 创建了很棒的ParseKit框架,它可以很好地开箱即用。有人知道PEG有什么类似的吗?

4

2 回答 2

10

除非你想为你想要处理的每一种语言(或更糟糕的是,你想要处理的语言的每一种方言)完全正确的完全上下文自由(或更糟糕的是,完全上下文相关)语法进行战斗。 . 有多少种 C++?),出于语法高亮的目的,你最好放弃完全正确并接受有时你会弄错的事实。在这种情况下,正则表达式似乎是一个非常好的答案。它们也可以非常快,因此它们不会干扰进行编辑的人。

如果您坚持进行完整的语法检查/完成(我认为您不是),那么您将需要完整的语法。您还将在很长一段时间内为真实语言制作编辑器。

有时最好不要太认真。你可以获得的 98% 的解决方案比永远不会实现的 100% 的解决方案要好。

于 2010-11-13T16:44:29.460 回答
3

它可能不是您所需要的,因为您自己编写了编辑器,但是有一个很棒的框架叫做 Xtext,它实际上会生成一个完整的编辑器,具有语法着色、可自定义的大纲视图和自动完成等,基于语法你的语言:http ://eclipse.org/Xtext

于 2010-11-13T00:55:59.120 回答