现在,最近,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规则的实例,只要使用正则表达式才能有用吗?
I figured Syntax highlighting is essentially a task of the same complexity as language parsing,[…]
不同之处在于:编译器需要实际解析,因为他需要了解完整的程序,并且还需要从该理解中生成内容.语法突出显示在另一只手上并不需要理解代码.它只需要了解语言的一般结构 – 什么是字符串文字 – 什么是关键字…等等.这个区别的副作用是:您可以突出显示语法错误的代码,但无法解析.
一个稍微不同的方法:解析语言通常是两步的过程:词法(将字节流分解为“令牌”流)和实际解析(将令牌流导入一些复杂的结构 – 通常是抽象语法树).列表通常使用正则表达式完成.看到flex文档为此.这基本上都是基本的语法荧光笔需要理解的.
当然,还有一些角色的情况下,这个正则表达式单独无法捕获.一个典型的例子是:
foo(bla,bar);
这里foo可能是调用静态方法或实例方法或宏或其他方法.但是您的正则表达式荧光笔不能推导出这一点.它只能为“一般呼叫”添加颜色.
所以:如果你的要求是低水平的(即没有上面的例子),而且通常是90/10的现实世界的规则,这是一个100%的规则.