Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 为文本编辑器定义语法的最佳方式是什么?_Regex_Parsing_Grammar_Bnf_Peg - Fatal编程技术网

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

Regex 为文本编辑器定义语法的最佳方式是什么?,regex,parsing,grammar,bnf,peg,Regex,Parsing,Grammar,Bnf,Peg,我正在自虐地为Mac编写一个开源文本编辑器,终于达到了我想要添加语法突出显示的程度。在过去的几天里,我一直在反复讨论各种解决方案,最后我决定向更广泛的受众开放这个问题 以下是我看到的选项: 基本上通过一系列正则表达式模式匹配定义语言(类似于TextMate定义其语言的方式) 使用形式语法定义语言,如BNF或PEG 使用正则表达式模式匹配似乎不太理想,因为它不能像正式语法那样正式地表示一种语言;然而,一些不太正式的语言将很难适应BNF(即Markdown——尽管我知道有一个很好的例子) 实时语

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

以下是我看到的选项:

  • 基本上通过一系列正则表达式模式匹配定义语言(类似于TextMate定义其语言的方式)
  • 使用形式语法定义语言,如BNF或PEG
使用正则表达式模式匹配似乎不太理想,因为它不能像正式语法那样正式地表示一种语言;然而,一些不太正式的语言将很难适应BNF(即Markdown——尽管我知道有一个很好的例子)

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


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

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

< P>除非你想打一场完全上下文无关的战斗(或者更糟的是,一个完全上下文敏感的)语法完全正确地处理你想要处理的每一种语言(或者更糟的是,对于你想处理的每种语言的方言……有多少种C++)?为了突出显示语法,您可能最好放弃完全正确,接受有时会出错的事实。在这种情况下,regexp似乎是一个非常好的答案。它们也可以非常快,因此不会干扰编辑人员

如果你坚持做完整的语法检查/完成(我认为你不是),那么你需要完整的语法。你还需要花很长时间为真正的语言制作编辑器


有时候最好不要太严肃。你能得到的98%个解决方案比一个从未实现的100%个解决方案要好。

< P>除了一个语法为一个语言工作的问题之外,还有一个更复杂的问题,就是让它在被编辑的代码中工作。

是的,这是我的核心问题。除了形式语法的复杂性,它们在语言的部分块上的工作情况如何(对于大多数语言来说不是很好)——这就是如何减少实时语法突出显示的开销。人们已经构建了语法驱动的文本编辑器。首先,要完成这项工作,需要在上面安装很多机器/将它们集成到普通解析器中。然后,让编辑器在“代码中间”任意编辑不仅是最难的部分,而且是在出错时最容易被拒绝的部分。