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

时间:2010-11-13 00:24:43

标签: regex parsing grammar bnf peg

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

以下是我看到的选项:

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

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

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

如果我走BNF路线,Todd Ditchendorf创建了一个非常棒的ParseKit框架,它可以很好地开箱即用。任何人都知道PEG的任何相似之处吗?

3 个答案:

答案 0 :(得分:7)

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

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

有时候最好不要太认真。您可以获得的98%解决方案优于从未实现的100%解决方案。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

除了使语法适用于某种语言的问题之外,还有一个额外的复杂性,即尝试使其适用于正在编辑的代码。