1

在 Vim 中编辑这个和那个时,我经常发现它的语法高亮(对于某些文件类型)有一些缺陷。我现在不记得任何例子,但肯定有人会。通常,它包含在某些情况下严重突出显示的字符串,一些带有算术和布尔运算符的东西以及其他一些小东西。

现在,vim 使用正则表达式来处理那种东西(它自己的风格)。

但是,我开始遇到一些编辑器,乍一看,它们的语法突出显示得到了更好的照顾。我一直认为正则表达式是解决这类问题的方法。

所以我想知道,那些编辑只是有更好的书面正则表达式,还是他们以其他方式处理?什么 ?当您希望它“稳定”时,如何处理语法突出显示?在您看来,哪位编辑做得最好(在您选择的编辑中),他是如何做到的(语言方面)?

Edit-1:例如,像 Emacs、Notepad2、Notepad++、Visual Studio 这样的编辑器——你是否知道他们使用什么机制来进行 syn. 高的。?

4

4 回答 4

4

对于您想要使用什么而不是正则表达式来突出显示语法,立即想到的想法是parsing。正则表达式有很多优点,但正如我们在 vim 的突出显示中看到的那样,有一些限制。(如果您寻找有关使用正则表达式分析 XML 的主题,您会发现大量关于为什么正则表达式不能做解析器所做的事情的材料。)

由于我们希望语法高亮显示它遵循语言的语法结构,而正则表达式只能近似,因此您需要执行某种程度的实际解析以超越正则表达式的功能。我在想,一个简单的递归下降词法分析器可能对大多数语言都有好处。

于 2009-05-04T03:27:15.283 回答
3

一些编程语言具有以Backus-Naur 形式编写的正式定义/规范。所有*)编程语言都可以在其中描述。然后,您所需要的只是某种符号解析器。

*) 未经审核的

例如,C 的 BNF定义是“只有五页长”。

于 2009-05-04T03:46:44.583 回答
2

如果您想准确突出显示需要真正的编程而不是正则表达式。正则表达式很少是解决琐碎任务的答案。要以更好的方式突出显示,您需要编写一个简单的解析器。解析基本上具有单独的组件,每个组件都可以执行诸如识别和使用带引号的字符串或数字文字之类的操作。如果在查看该组件时,给定的光标不能消耗它下面的内容,它什么也不做。从中您可以轻松轻松地解析或突出显示。

鉴于类似

静态int字段= 123;

• 第一个 macher 将跳过“static”之前的空格。关键字、文字等匹配器不会做任何事情,因为处理空格不是他们的事。

• 定位在“静态”上时匹配的关键字会消耗它。因为“s”不是数字,所以匹配的文字什么也不做。因为“s”不是空格字符,所以空格跳过器也不做任何事情。

自然地,您的循环会继续将光标移到输入字符串上,直到到达结尾。匹配器的顺序当然很重要。

这种方法既灵活,因为它处理语法不正确的片段,也易于扩展和重用单个匹配器以支持其他语言的突出显示......

于 2009-05-04T03:30:06.870 回答
0

我建议使用 RE 进行语法高亮。如果它不能正常工作,那么你的 RE 不够强大或不够复杂 :-) 这是 RE 大放异彩的领域之一。

但是鉴于你无法提供任何失败的例子(所以我们可以告诉你问题出在哪里)或做得更好的编辑的名字(所以我们可以告诉你他们是如何做到的),没有更多我们将能够给你一个答案。

我从来没有遇到过使用主流语言的 Vim 问题,也从来不需要使用奇怪的深奥语言,所以它很适合我的目的。

于 2009-05-04T02:51:52.217 回答