现在,最近,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(以技术上倾向于讨论的例子)也提到了使用正则表达式的突出显示语法在一般情况下基本上是不可能的,‘考虑一个重大的,显示停止的缺陷.
现在的问题是:有没有我失踪的东西?尤其是:
I figured Syntax highlighting is essentially a task of the same complexity as language parsing,[…]
不同之处在于:编译器需要实际解析,因为他需要了解完整的程序,并且还需要从该理解中生成内容.语法突出显示在另一只手上并不需要理解代码.它只需要了解语言的一般结构 – 什么是字符串文字 – 什么是关键字…等等.这个区别的副作用是:您可以突出显示语法错误的代码,但无法解析.
一个稍微不同的方法:解析语言通常是两步的过程:词法(将字节流分解为“令牌”流)和实际解析(将令牌流导入一些复杂的结构 – 通常是抽象语法树).列表通常使用正则表达式完成.看到flex文档为此.这基本上都是基本的语法荧光笔需要理解的.
当然,还有一些角色的情况下,这个正则表达式单独无法捕获.一个典型的例子是:
foo(bla,bar);
这里foo可能是调用静态方法或实例方法或宏或其他方法.但是您的正则表达式荧光笔不能推导出这一点.它只能为“一般呼叫”添加颜色.
所以:如果你的要求是低水平的(即没有上面的例子),而且通常是90/10的现实世界的规则,这是一个100%的规则.
原文地址:https://www.jb51.cc/regex/356698.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。