Chinaunix首页 | 论坛 | 博客
  • 博客访问: 21804
  • 博文数量: 3
  • 博客积分: 565
  • 博客等级: 中士
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-28 03:04
文章分类
文章存档

2010年(3)

我的朋友

分类:

2010-09-01 09:48:20

昨晚抽空看了 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 无
法持续拥有匹配后字符串。

阅读(1822) | 评论(0) | 转发(0) |
0

上一篇:一个诡异的Vim全能补全缓慢的问题……

下一篇:没有了

给主人留下些什么吧!~~