昨晚抽空看了 Lua 的正则表达式,发现其实除了转义符用了 % ,还有非贪婪匹
配用了 -,其实和正常的正则表达式匹配没有啥区别。但是 Lua 的正则匹配有
三个不一样的地方,一个优点,一个缺点,还有一个新的特性。
优点是:有个 %b 元字符,可以用来匹配对称的符号,这意味着 Lua 的正则可
以非常简单地处理递归符号。
缺点是:Lua 所有的正则表达式量词都无法处理多个字符序列和量词的组合。比
方说,在 Lua 里面你能写 %a+,代表一个或者多个字母,但是你没办法写
(abc)+ ,这样是不合法的。
一个新的特性是: Lua 的空捕获代表这个捕获在字符串中的位置。这个特点看
上去很有用,但是还没想到怎么用,另外一点是,将这个功能用另一个特定的元
字符可能会好一点。
那么,这和 Vim 的正则表达式有什么关系呢?昨天看了这些以后,就想把那个
%b 移植到 Vim,另外还希望在 Vim 源码里面加上 v:0 到 v:9,用于上一次的
正则匹配的捕获。这本来是很简单的事情,但是我看了 Vim 的源代码了以后,
发现 Vim 的正则是有很多问题的。在 Vim 的文档中,有这样的说明:
substitute() 不允许递归的 \= 调用。
这个事实归根结底,还是由底层设计欠缺考虑造成的。原始的 regex 代码,底
层是不会管字符串如何如何的。因此首先 v:0 ~ v:9 会比较难实现:因为很可
能在你需要全局捕获的时候,这些捕获对应的字符串已经被释放了。其次,
regex 的代码大量充斥了全局变量,这样会导致 substitute 要支持递归会很难
改。最后,Vim 的函数功能太弱了,就算是拥有了递归的 substitute,也基本
上没有办法有 Lua 强大的替换能力。
而 Vim 是个专业的编辑器,这些问题可以说都是本行工作了。
所有的这些,都可以被加进 VimE 的计划中:
1. VimE 必须支持闭包。鉴于 Lua 的高效,考虑将 Lua 的修改版作为 VimE 的
底层语言。对 Lua 的修改包括:
- 添加标准类机制,添加 class 关键字。
- 将 Table 分离为 dict 和 list,去掉 Table 原生的 array,用函数调用的
stack 来代替,也就是说,新的语言函数调用的参数和结果将是一个 list。
- 去除标准库,将标准库改为字面量类型的方法。
- 去除所有内建函数,将无法归类的内建函数变成类名,这样调用就相当于
建立一个新的类。
- 添加一系列方便的操作符:位操作、方便的赋值操作。
- then 可以写成 : 或者 do。
- function 可以写成 def。
- 去掉 local 关键字,所有在 function 声明的变量都是 local。添加 global 关
键字。
- elseif 可以写成 elif。
- 添加字典构造和 list 构造。
因此,新的语言的关键字如下:
and break expect class do else
elseif/elif end false for function/def
global if in nil not nil
not or raise repeat/do return
then true try until while
新的语言支持的符号如下:
. ( ) [ ] { }
+ - * / // % **
& ^ | << >> >>>
== != <= >= < >
+= -= *= /= //= %= **=
&= ^= |= <<= >>= >>>=
? : ; , ..
2. 所有的数据类型都必须包含引用计数,在计数为 0 的时候才能释放。否则 regex 无
法持续拥有匹配后字符串。
阅读(1826) | 评论(0) | 转发(0) |