用于语法高亮的正则表达式有哪些替代方案?

问题描述 投票:0回答:5

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

现在,vim 使用正则表达式来处理类似的事情(它自己的风格)。

但是,我开始遇到一些编辑器,乍一看,它们可以更好地处理语法突出显示。我一直认为正则表达式是处理这类事情的方法。

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

Edit-1: 例如,像 Emacs、Notepad2、Notepad++、Visual Studio 这样的编辑器 - 你可能知道它们使用什么机制来实现 syn。高的。 ?

regex parsing editor syntax-highlighting lexical-analysis
5个回答
4
投票

您立即想到的想法是“解析”,而不是使用正则表达式来进行语法突出显示。正则表达式有很多优点,但正如我们在 vim 的突出显示中看到的那样,它也有局限性。 (如果您查找有关使用正则表达式分析 XML 的主题,您会发现大量关于为什么正则表达式无法完成解析器所做的事情的材料。) 由于我们希望语法高亮显示的是它遵循语言的语法结构,而正则表达式只能近似,因此您需要执行某种级别的真实解析以超越正则表达式的功能。我想,一个简单的递归下降词法分析器可能适用于大多数语言。


3
投票
Backus-Naur Form

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

*) 未验证

例如,

C 的 BNF

定义是“只有五页长”。


2
投票

给定类似的东西

静态 int 字段 = 123;

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

• 位于“static”上方时匹配的关键字将消耗该关键字。因为“s”不是数字,所以匹配的文字不执行任何操作。空白跳过符也不执行任何操作,因为“s”不是空白字符。

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

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


0
投票

但是鉴于您无法提供任何失败的示例(以便我们可以告诉您问题是什么)或做得更好的编辑的姓名(以便我们可以告诉您他们是如何做到的),所以没有太多更多我们可以给您答案。

我在使用主流语言时从未遇到过 Vim 的任何问题,而且我从来不需要使用奇怪的深奥语言,所以它非常适合我的目的。


0
投票
Tree-sitter

是基于正则表达式的语法突出显示的替代方案,在许多编辑器中使用,例如 NeovimLapcePulsarZed

© www.soinside.com 2019 - 2024. All rights reserved.