我们现在都知道,使用正则表达式解析 HTML 通常是不可能的,因为它会解析上下文相关的语法,而正则表达式只能解析正则语法。对于其他编程语言来说也是如此。
现在,最近,Rainbow.js语法荧光笔已发布。它的前提描述得非常简单:
Rainbow on its own is very simple. It goes through code blocks, processes regex patterns, and wraps matching patterns in tags.
我认为语法突出显示本质上是一项与语言解析具有相同复杂性的任务,如果我们假设它必须既好又适合多种语言。尽管如此,虽然有相当多的criticism该图书馆的,既不是那个也不是 HackerNews discussion (以技术倾向的讨论为例)提到,在一般情况下使用正则表达式突出显示语法基本上是不可能的,我认为这是一个重大的、令人惊叹的缺陷。
现在的问题是:我缺少什么吗?特别是:
- 一般情况下可以使用正则表达式进行语法突出显示吗?
- 这是应用 80/20 规则的一个实例吗?正则表达式的作用就足够了?
最佳答案
使用正则表达式进行语法突出显示是一门古老的艺术。我想甚至 Emacs 和 vi 也是这样开始的。
I figured syntax highlighting is essentially a task of the same complexity as language parsing,[...]
没有。区别在于:编译器需要真正的解析,因为它需要理解完整的程序,并且还需要根据这种理解生成内容。另一方面,语法高亮不需要理解代码。它只需要了解语言的一般结构 - 什么是字符串文字 - 什么是关键字......等等。这种差异的副作用是:您可以突出显示语法不正确的代码,但无法解析它。
对此的方法略有不同:解析语言通常是一个两步过程:词法分析(将字节流拆分为“ token ”流)和真正的解析(将 token 流带入某种复杂的结构 - 通常是一个抽象语法树)。词法分析通常使用 ---- 正则表达式来完成。请参阅 Flex 文档了解这一点。这基本上就是基本语法荧光笔需要理解的全部内容。
当然,有些特殊情况是仅靠正则表达式无法捕获的。一个典型的例子是:
foo(bla, bar);
这里foo
可能是对静态方法、实例方法、宏或其他东西的调用。但你的正则表达式荧光笔无法推断出这一点。它只能为“通用调用”添加颜色。
所以:如果您的要求较低(即没有上面的示例),那么这是一个 100/0% 的规则,对于现实世界的东西通常是 90/10 的规则。
关于regex - 使用正则表达式的语法高亮编程语言是否可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9955971/