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

来源:互联网 发布:淘宝举报投诉 编辑:程序博客网 时间:2024/05/19 18:09

<..
========================================================
==
==
==
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 --