我正在为Mac编写一个开源文本编辑器,并最终达到了我想要添加语法高亮的地步。过去几天我一直在寻找各种解决方案,最后我决定向更广泛的受众提出这个问题。
以下是我看到的选项:
使用正则表达式模式匹配似乎不太理想,因为它不能正式表示语言几乎和正式语法一样好;然而,一些不太正式的语言会很难适应BNF(即Markdown - 虽然我知道有一个很棒的PEG implementation)。
实时语法突出显示的性能权衡是什么?多种语言的灵活性如何?
如果我走BNF路线,Todd Ditchendorf创建了一个非常棒的ParseKit框架,它可以很好地开箱即用。任何人都知道PEG的任何相似之处吗?
答案 0 :(得分:7)
除非你想要争取获得完全上下文免费(或者更糟糕的是,完整的上下文敏感)语法的战斗,否则你想要处理的每种语言都是完全正确的(或者更糟糕的是,对于每个方言你想要处理的语言...有多少种C ++?),出于语法高亮显示的目的,你可能最好放弃完整的正确性并接受有时你的'我弄错了。在这种情况下,regexps似乎是一个非常好的答案。它们也可以非常快,因此它们不会干扰进行编辑的人。
如果你坚持做完整的语法检查/完成(我认为你不是),那么你需要完整的语法。你也将在很长一段时间内为真正的语言编写编辑器。
有时候最好不要太认真。您可以获得的98%解决方案优于从未实现的100%解决方案。
答案 1 :(得分:3)
由于你自己编写编辑器,它可能不是你需要的,但是有一个很棒的框架叫做Xtext,它实际上会生成一个完整的编辑器,它有语法着色,可自定义的轮廓视图和自动完成等等,基于语言的语法:http://eclipse.org/Xtext
答案 2 :(得分:0)
除了使语法适用于某种语言的问题之外,还有一个额外的复杂性,即尝试使其适用于正在编辑的代码。