Nuva 示例代码(每日一帖)之 正则表达式(递归)

<..========================================================
==                                                       ==
==                Macrobject Nuva Samples                ==
==                                                       ==
==      Copyright (c) 2004-2006 Macrobject Software      ==
==                                                       ==
==                  ALL RIGHTS RESERVED                  ==
==                                                       ==
==               http://www.macrobject.com               ==
==                                                       ==
========================================================..>
<.
  function Test(theContent, thePattern)
    function DoMatch(Index, Length, Value, Match)
      Result := Value ~ \r\n ~ '-- End --' ~ \r\n;
    end function
    ? theContent.RegexMatch(thePattern, Function = 'DoMatch', Option = 'sx')
  end function
  
  var content
  assign(content).>
(case (what-would-you-like-to-do?)
  ((learn)
   (choose-from FAQ
                textbooks
                blogs
                standards
                tutorials
                bibliography
                other documents
                education))
  ((program)
   (choose-from implementations
                libraries
                environments
                SRFIs))
  ((socialize)
   (choose-from Scheme Boston and bothton - Boston, MA, USA
                Denver Lispers - Denver, CO, USA
                Scheme UK - London, UK
                Montreal Scheme/Lisp User Group - Montr¨¦al, Canada
                CRACL - Los Angeles, CA, USA
                Metro Schemers (no current URL) - Washington, DC, USA))
  ((work)
   (choose-from jobs))
  ((stay-informed)
   (choose-from events))
  (else
   (choose-from the lighter side
                wares
		other resources)))
<.end assign

  var pattern
  assign(pattern).>
\( ( (?>[^()]+) | (?R) )* \)
<.end assign

  Test(content, pattern)
.>

<..
【简介】
    本例是一个复杂的正则表达式程序,其中用到了正则的递归匹配。

    众所周知,正规语言通常不能表示一个递归结构(上下文无关语言则可)。这是一种扩展功能,使正则表达式可以匹配一个递归结构。如上图的复杂结构(来自 http://www.schemers.org),使用带递归的正则表达式可以成功的匹配出该语言(LISP 的括号嵌套语言)。

【看点】
    1、本例演示了复杂的正则操作,如正则的递归功能:
         ?R 即递归整个正则表达式
         本例为了正则式的可读性,特意使用了 x 选项,忽略了正则中的空白成分
        
    2、本例也演示了 Nuva 语言的特殊结构:assign
         assign 是一种赋值结构,将该结构内的所有输出赋值给一个变量(左值表达式),该结构内可以任意复杂,嵌套任意成分,其所有的输出都将赋值给这个变量,从而省去了字符串连缀的麻烦。

【扩展】
    本例可以进一步扩展以增强其实用性,比如可以匹配诸如 C 语言风格带嵌套 {} 的语法结构。
..>

 本例运行结果如下:

(case (what-would-you-like-to-do?)
  ((learn)
   (choose-from FAQ
                textbooks
                blogs
                standards
                tutorials
                bibliography
                other documents
                education))
  ((program)
   (choose-from implementations
                libraries
                environments
                SRFIs))
  ((socialize)
   (choose-from Scheme Boston and bothton - Boston, MA, USA
                Denver Lispers - Denver, CO, USA
                Scheme UK - London, UK
                Montreal Scheme/Lisp User Group - Montréal, Canada
                CRACL - Los Angeles, CA, USA
                Metro Schemers (no current URL) - Washington, DC, USA))
  ((work)
   (choose-from jobs))
  ((stay-informed)
   (choose-from events))
  (else
   (choose-from the lighter side
                wares
  other resources)))
-- End --

posted on 2006-08-31 18:21  Wisdom-zh  阅读(539)  评论(0编辑  收藏  举报

导航