什么是正则表达式的替代语法突出显示?

时间:2009-05-04 02:44:29

标签: regex parsing editor syntax-highlighting lexical-analysis

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

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

然而,我开始遇到编辑,乍一看,语法高亮更好地照顾。我一直认为正则表达式是那种东西的方式。

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

编辑-1:例如,像Emacs,Notepad2,Notepad ++,Visual Studio这样的编辑器,您是否知道它们用于syn的机制。高。 ?

4 个答案:

答案 0 :(得分:4)

想要使用而不是正则表达式进行语法突出显示的想法是解析。正则表达式有很多优点,但正如我们在vim的突出显示中看到的那样,存在限制。 (如果您查找有关使用正则表达式来分析XML的线程,您将找到关于为什么正则表达式无法执行解析器操作的大量材料。)

因为我们想要的语法高亮是因为它遵循语言的语法结构,正则表达式只能近似,所以你需要执行某种程度的真正解析来超越正则表达式所能做的。对于大多数语言来说,一个简单的递归下降词法分析器可能会很有用,我在想。

答案 1 :(得分:3)

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

*)未经核实

例如,C's BNF定义“只有五页长”。

答案 2 :(得分:2)

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

给出类似

的内容

static int field = 123;

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

•定位在“静态”之上的关键字将使用该关键字。因为“s”不是数字,所以文字匹配什么都不做。空白队长也没有做任何事情,因为“s”不是空格字符。

当然,你的循环继续将光标推进输入字符串,直到到达结尾。匹配器的排序当然很重要。

这种方法既灵活又能处理语法错误的片段,并且易于扩展和重用个别匹配器以支持其他语言的突出显示......

答案 3 :(得分:1)

我建议使用RE进行语法突出显示。如果它工作不正常,那么你的RE就不够强大或不够复杂:-)这是REs闪耀的领域之一。

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

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