<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://haritonov.wiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3ARe</id>
		<title>Модуль:Re - История изменений</title>
		<link rel="self" type="application/atom+xml" href="https://haritonov.wiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3ARe"/>
		<link rel="alternate" type="text/html" href="https://haritonov.wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Re&amp;action=history"/>
		<updated>2026-04-30T07:06:47Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.26.4</generator>

	<entry>
		<id>https://haritonov.wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Re&amp;diff=5310&amp;oldid=prev</id>
		<title>Alex Mashin: + back asserion</title>
		<link rel="alternate" type="text/html" href="https://haritonov.wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Re&amp;diff=5310&amp;oldid=prev"/>
				<updated>2017-06-22T03:18:51Z</updated>
		
		<summary type="html">&lt;p&gt;+ back asserion&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[&lt;br /&gt;
	Основано на коде Роберту Иерусалимски:&lt;br /&gt;
	https://github.com/lua/lpeg/blob/master/re.lua&lt;br /&gt;
	&lt;br /&gt;
	Требует для работы подключения lpeg к Lua.&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
-- $Id: re.lua,v 1.44 2013/03/26 20:11:40 roberto Exp $&lt;br /&gt;
&lt;br /&gt;
-- imported functions and modules&lt;br /&gt;
local tonumber, type, print, error = tonumber, type, print, error&lt;br /&gt;
local setmetatable = setmetatable&lt;br /&gt;
local m = lpeg --require&amp;quot;lpeg&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- 'm' will be used to parse expressions, and 'mm' will be used to&lt;br /&gt;
-- create expressions; that is, 're' runs on 'm', creating patterns&lt;br /&gt;
-- on 'mm'&lt;br /&gt;
local mm = m&lt;br /&gt;
&lt;br /&gt;
-- pattern's metatable&lt;br /&gt;
local mt = lpeg_meta -- getmetatable(mm.P(0))&lt;br /&gt;
&lt;br /&gt;
-- No more global accesses after this point&lt;br /&gt;
local version = _VERSION&lt;br /&gt;
if version == &amp;quot;Lua 5.2&amp;quot; then _ENV = nil end&lt;br /&gt;
&lt;br /&gt;
local any = m.P(1)&lt;br /&gt;
&lt;br /&gt;
-- Pre-defined names&lt;br /&gt;
local Predef = { nl = m.P&amp;quot;\n&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
local mem&lt;br /&gt;
local fmem&lt;br /&gt;
local gmem&lt;br /&gt;
&lt;br /&gt;
local function updatelocale ()&lt;br /&gt;
  mm.locale(Predef)&lt;br /&gt;
  Predef.a = Predef.alpha&lt;br /&gt;
  Predef.c = Predef.cntrl&lt;br /&gt;
  Predef.d = Predef.digit&lt;br /&gt;
  Predef.g = Predef.graph&lt;br /&gt;
  Predef.l = Predef.lower&lt;br /&gt;
  Predef.p = Predef.punct&lt;br /&gt;
  Predef.s = Predef.space&lt;br /&gt;
  Predef.u = Predef.upper&lt;br /&gt;
  Predef.w = Predef.alnum&lt;br /&gt;
  Predef.x = Predef.xdigit&lt;br /&gt;
  Predef.A = any - Predef.a&lt;br /&gt;
  Predef.C = any - Predef.c&lt;br /&gt;
  Predef.D = any - Predef.d&lt;br /&gt;
  Predef.G = any - Predef.g&lt;br /&gt;
  Predef.L = any - Predef.l&lt;br /&gt;
  Predef.P = any - Predef.p&lt;br /&gt;
  Predef.S = any - Predef.s&lt;br /&gt;
  Predef.U = any - Predef.u&lt;br /&gt;
  Predef.W = any - Predef.w&lt;br /&gt;
  Predef.X = any - Predef.x&lt;br /&gt;
  mem = {}    -- restart memoization&lt;br /&gt;
  fmem = {}&lt;br /&gt;
  gmem = {}&lt;br /&gt;
  local mt = {__mode = &amp;quot;v&amp;quot;}&lt;br /&gt;
  setmetatable(mem, mt)&lt;br /&gt;
  setmetatable(fmem, mt)&lt;br /&gt;
  setmetatable(gmem, mt)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
updatelocale()&lt;br /&gt;
&lt;br /&gt;
local I = m.P(function (s,i) print(i, s:sub(1, i-1)); return i end)&lt;br /&gt;
&lt;br /&gt;
local function getdef (id, defs)&lt;br /&gt;
  local c = defs and defs[id]&lt;br /&gt;
  if not c then error(&amp;quot;undefined name: &amp;quot; .. id) end&lt;br /&gt;
  return c&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function patt_error (s, i)&lt;br /&gt;
  local msg = (#s &amp;lt; i + 20) and s:sub(i)&lt;br /&gt;
                             or s:sub(i,i+20) .. &amp;quot;...&amp;quot;&lt;br /&gt;
  msg = (&amp;quot;pattern error near '%s'&amp;quot;):format(msg)&lt;br /&gt;
  error(msg, 2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function mult (p, n)&lt;br /&gt;
  local np = mm.P(true)&lt;br /&gt;
  while n &amp;gt;= 1 do&lt;br /&gt;
    if n%2 &amp;gt;= 1 then np = np * p end&lt;br /&gt;
    p = p * p&lt;br /&gt;
    n = n/2&lt;br /&gt;
  end&lt;br /&gt;
  return np&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function equalcap (s, i, c)&lt;br /&gt;
  if type(c) ~= &amp;quot;string&amp;quot; then return nil end&lt;br /&gt;
  local e = #c + i&lt;br /&gt;
  if s:sub(i, e - 1) == c then return e else return nil end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local S = (Predef.space + &amp;quot;--&amp;quot; * (any - Predef.nl)^0)^0&lt;br /&gt;
&lt;br /&gt;
local name = m.R(&amp;quot;AZ&amp;quot;, &amp;quot;az&amp;quot;, &amp;quot;__&amp;quot;) * m.R(&amp;quot;AZ&amp;quot;, &amp;quot;az&amp;quot;, &amp;quot;__&amp;quot;, &amp;quot;09&amp;quot;)^0&lt;br /&gt;
&lt;br /&gt;
local arrow = S * &amp;quot;&amp;lt;-&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;`}&amp;quot; -- constant capture. Inserted for traditio.wiki:&lt;br /&gt;
local seq_follow = m.P&amp;quot;/&amp;quot; + &amp;quot;)&amp;quot; + &amp;quot;}&amp;quot; + &amp;quot;:}&amp;quot; + &amp;quot;~}&amp;quot; + &amp;quot;|}&amp;quot; + &amp;quot;`}&amp;quot; + (name * arrow) + -1&lt;br /&gt;
&lt;br /&gt;
name = m.C(name)&lt;br /&gt;
&lt;br /&gt;
-- a defined name only have meaning in a given environment&lt;br /&gt;
local Def = name * m.Carg(1)&lt;br /&gt;
&lt;br /&gt;
local num = m.C(m.R&amp;quot;09&amp;quot;^1) * S / tonumber&lt;br /&gt;
&lt;br /&gt;
local String = &amp;quot;'&amp;quot; * m.C((any - &amp;quot;'&amp;quot;)^0) * &amp;quot;'&amp;quot; +&lt;br /&gt;
               '&amp;quot;' * m.C((any - '&amp;quot;')^0) * '&amp;quot;'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local defined = &amp;quot;%&amp;quot; * Def / function (c,Defs)&lt;br /&gt;
  local cat =  Defs and Defs[c] or Predef[c]&lt;br /&gt;
  if not cat then error (&amp;quot;name '&amp;quot; .. c .. &amp;quot;' undefined&amp;quot;) end&lt;br /&gt;
  return cat&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local Range = m.Cs(any * (m.P&amp;quot;-&amp;quot;/&amp;quot;&amp;quot;) * (any - &amp;quot;]&amp;quot;)) / mm.R&lt;br /&gt;
&lt;br /&gt;
local item = defined + Range + m.C(any)&lt;br /&gt;
&lt;br /&gt;
local Class =&lt;br /&gt;
    &amp;quot;[&amp;quot;&lt;br /&gt;
  * (m.C(m.P&amp;quot;^&amp;quot;^-1))    -- optional complement symbol&lt;br /&gt;
  * m.Cf(item * (item - &amp;quot;]&amp;quot;)^0, mt.__add) /&lt;br /&gt;
                          function (c, p) return c == &amp;quot;^&amp;quot; and any - p or p end&lt;br /&gt;
  * &amp;quot;]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local function adddef (t, k, exp)&lt;br /&gt;
  if t[k] then&lt;br /&gt;
    error(&amp;quot;'&amp;quot;..k..&amp;quot;' already defined as a rule&amp;quot;)&lt;br /&gt;
  else&lt;br /&gt;
    t[k] = exp&lt;br /&gt;
  end&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function firstdef (n, r) return adddef({n}, n, r) end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function NT (n, b)&lt;br /&gt;
  if not b then&lt;br /&gt;
    error(&amp;quot;rule '&amp;quot;..n..&amp;quot;' used outside a grammar&amp;quot;)&lt;br /&gt;
  else return mm.V(n)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local exp = m.P{ &amp;quot;Exp&amp;quot;,&lt;br /&gt;
  Exp = S * ( m.V&amp;quot;Grammar&amp;quot;&lt;br /&gt;
            + m.Cf(m.V&amp;quot;Seq&amp;quot; * (&amp;quot;/&amp;quot; * S * m.V&amp;quot;Seq&amp;quot;)^0, mt.__add) );&lt;br /&gt;
  Seq = m.Cf(m.Cc(m.P&amp;quot;&amp;quot;) * m.V&amp;quot;Prefix&amp;quot;^0 , mt.__mul)&lt;br /&gt;
        * (#seq_follow + patt_error);&lt;br /&gt;
  Prefix = &amp;quot;&amp;amp;&amp;quot; * S * m.V&amp;quot;Prefix&amp;quot; / mt.__len&lt;br /&gt;
         + &amp;quot;!&amp;quot; * S * m.V&amp;quot;Prefix&amp;quot; / mt.__unm&lt;br /&gt;
         -- &amp;lt; -- back assertion. Added for traditio.wiki by Alexander Mashin:&lt;br /&gt;
         + &amp;quot;&amp;lt;&amp;quot; * S * m.V&amp;quot;Prefix&amp;quot; / mm.B&lt;br /&gt;
         + m.V&amp;quot;Suffix&amp;quot;;&lt;br /&gt;
  Suffix = m.Cf(m.V&amp;quot;Primary&amp;quot; * S *&lt;br /&gt;
          ( ( m.P&amp;quot;+&amp;quot; * m.Cc(1, mt.__pow)&lt;br /&gt;
            + m.P&amp;quot;*&amp;quot; * m.Cc(0, mt.__pow)&lt;br /&gt;
            + m.P&amp;quot;?&amp;quot; * m.Cc(-1, mt.__pow)&lt;br /&gt;
            + &amp;quot;^&amp;quot; * ( m.Cg(num * m.Cc(mult))&lt;br /&gt;
                    + m.Cg(m.C(m.S&amp;quot;+-&amp;quot; * m.R&amp;quot;09&amp;quot;^1) * m.Cc(mt.__pow))&lt;br /&gt;
                    )&lt;br /&gt;
            + &amp;quot;-&amp;gt;&amp;quot; * S * ( m.Cg((String + num) * m.Cc(mt.__div))&lt;br /&gt;
                         + m.P&amp;quot;{}&amp;quot; * m.Cc(nil, m.Ct)&lt;br /&gt;
                         + m.Cg(Def / getdef * m.Cc(mt.__div))&lt;br /&gt;
                         )&lt;br /&gt;
            + &amp;quot;=&amp;gt;&amp;quot; * S * m.Cg(Def / getdef * m.Cc(m.Cmt))&lt;br /&gt;
            -- ~&amp;gt; -- fold capture. Inserted for traditio.wiki by Alexander Mashin:&lt;br /&gt;
            + &amp;quot;~&amp;gt;&amp;quot; * S * m.Cg(Def / getdef * m.Cc(m.Cf))            	&lt;br /&gt;
            ) * S&lt;br /&gt;
          )^0, function (a,b,f) return f(a,b) end );&lt;br /&gt;
  Primary = &amp;quot;(&amp;quot; * m.V&amp;quot;Exp&amp;quot; * &amp;quot;)&amp;quot;&lt;br /&gt;
            + String / mm.P&lt;br /&gt;
            + Class&lt;br /&gt;
            + defined&lt;br /&gt;
            + &amp;quot;{:&amp;quot; * (name * &amp;quot;:&amp;quot; + m.Cc(nil)) * m.V&amp;quot;Exp&amp;quot; * &amp;quot;:}&amp;quot; /&lt;br /&gt;
                     function (n, p) return mm.Cg(p, n) end&lt;br /&gt;
            + &amp;quot;=&amp;quot; * name / function (n) return mm.Cmt(mm.Cb(n), equalcap) end&lt;br /&gt;
            + m.P&amp;quot;{}&amp;quot; / mm.Cp&lt;br /&gt;
            + &amp;quot;{~&amp;quot; * m.V&amp;quot;Exp&amp;quot; * &amp;quot;~}&amp;quot; / mm.Cs&lt;br /&gt;
            + &amp;quot;{|&amp;quot; * m.V&amp;quot;Exp&amp;quot; * &amp;quot;|}&amp;quot; / mm.Ct&lt;br /&gt;
            + &amp;quot;{&amp;quot; * m.V&amp;quot;Exp&amp;quot; * &amp;quot;}&amp;quot; / mm.C&lt;br /&gt;
            -- {` `} -- constant capture. Inserted for traditio.wiki by Alexander Mashin:&lt;br /&gt;
            + &amp;quot;{`&amp;quot; * Predef.space^0 * m.C((any - &amp;quot;`&amp;quot;)^1) * S * &amp;quot;`}&amp;quot; / mm.Cc&lt;br /&gt;
            -- {# #} == argument capture. Inserted for traditio.wiki by Alexander Mashin:&lt;br /&gt;
            + &amp;quot;{#&amp;quot; * S * Def * &amp;quot;#}&amp;quot; / getdef&lt;br /&gt;
            + m.P&amp;quot;.&amp;quot; * m.Cc(any)&lt;br /&gt;
            + (name * -arrow + &amp;quot;&amp;lt;&amp;quot; * name * &amp;quot;&amp;gt;&amp;quot;) * m.Cb(&amp;quot;G&amp;quot;) / NT;&lt;br /&gt;
  Definition = name * arrow * m.V&amp;quot;Exp&amp;quot;;&lt;br /&gt;
  Grammar = m.Cg(m.Cc(true), &amp;quot;G&amp;quot;) *&lt;br /&gt;
            m.Cf(m.V&amp;quot;Definition&amp;quot; / firstdef * m.Cg(m.V&amp;quot;Definition&amp;quot;)^0,&lt;br /&gt;
              adddef) / mm.P&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local pattern = S * m.Cg(m.Cc(false), &amp;quot;G&amp;quot;) * exp / mm.P * (-any + patt_error)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function compile (p, defs)&lt;br /&gt;
  if mm.type(p) == &amp;quot;pattern&amp;quot; then return p end   -- already compiled&lt;br /&gt;
  local cp = pattern:match(p, 1, defs)&lt;br /&gt;
  if not cp then error(&amp;quot;incorrect pattern&amp;quot;, 3) end&lt;br /&gt;
  return cp&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function match (s, p, i)&lt;br /&gt;
  local cp = mem[p]&lt;br /&gt;
  if not cp then&lt;br /&gt;
    cp = compile(p)&lt;br /&gt;
    mem[p] = cp&lt;br /&gt;
  end&lt;br /&gt;
  return cp:match(s, i or 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function find (s, p, i)&lt;br /&gt;
  local cp = fmem[p]&lt;br /&gt;
  if not cp then&lt;br /&gt;
    cp = compile(p) / 0&lt;br /&gt;
    cp = mm.P{ mm.Cp() * cp * mm.Cp() + 1 * mm.V(1) }&lt;br /&gt;
    fmem[p] = cp&lt;br /&gt;
  end&lt;br /&gt;
  local i, e = cp:match(s, i or 1)&lt;br /&gt;
  if i then return i, e - 1&lt;br /&gt;
  else return i&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function gsub (s, p, rep)&lt;br /&gt;
  local g = gmem[p] or {}   -- ensure gmem[p] is not collected while here&lt;br /&gt;
  gmem[p] = g&lt;br /&gt;
  local cp = g[rep]&lt;br /&gt;
  if not cp then&lt;br /&gt;
    cp = compile(p)&lt;br /&gt;
    cp = mm.Cs((cp / rep + 1)^0)&lt;br /&gt;
    g[rep] = cp&lt;br /&gt;
  end&lt;br /&gt;
  return cp:match(s)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- exported names&lt;br /&gt;
local re = {&lt;br /&gt;
  compile = compile,&lt;br /&gt;
  match = match,&lt;br /&gt;
  find = find,&lt;br /&gt;
  gsub = gsub,&lt;br /&gt;
  updatelocale = updatelocale,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if version == &amp;quot;Lua 5.1&amp;quot; then _G.re = re end&lt;br /&gt;
&lt;br /&gt;
return re&lt;/div&gt;</summary>
		<author><name>Alex Mashin</name></author>	</entry>

	</feed>