为文本编辑器定义语法的最佳方法是什么?

Lyt*_*tol 3 regex grammar parsing bnf peg

我正在为Mac编写一个开源文本编辑器,并最终达到了我想要添加语法高亮的地步.过去几天我一直在寻找各种解决方案,最后我决定向更广泛的受众提出这个问题.

以下是我看到的选项:

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

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

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

如果我走BNF路线,Todd Ditchendorf创建了令人敬畏的ParseKit框架,它可以很好地开箱即用.任何人都知道PEG的任何类似的东西?

Ira*_*ter 7

除非你想要争取获得完全上下文免费(或者更糟糕的是,完整的上下文敏感)语法的战斗,这对于你想要处理的每种语言都是完全正确的(或者更糟糕的是,对于你想要处理的语言的每种方言而言 ......有多少种C++?),出于语法高亮的目的,你可能最好放弃完全正确并接受有时候你会弄错.在这种情况下,regexps似乎是一个非常好的答案.它们也可以非常快,因此它们不会干扰进行编辑的人.

如果你坚持做完整的语法检查/完成(我不认为你是),那么你将需要完整的语法.你也需要很长时间才能为真正的语言编写编辑器.

有时最好不要太严肃.您可以获得的98%解决方案优于从未实现的100%解决方案.