module PGE
class Rule < Match
def null ( matchObj )
( matchObj, mtarget, nfrom, mpos ) = Match.newfrom ( matchObj )
mpos = mfrom
matchObj
end
def fail ( matchObj )
Match.newfrom ( matchObj )
end
#for x in ( "upper", "lower", "alpha", "digit", "xdigit", "space", "print", "graph", "blank", "cntrl", "punct", "alnum", "sp", "lt", "gt", "dot" )
def moveForward ( matchObj, &matches )
( matchobj, mtarget, nfrom, mpos ) = match.newfrom ( matchobj )
if matches? ( mtarget[mfrom] )
mpos = mfrom + 1
end
matchobj
end
def ws ( matchObj )
#nextchars = param
nextchars = ""
if nextchars then
#delete param
end
matchObj = Match.newfrom( matchObj )
lastpos = matchObj.target.length()
pos = matchObj.from
if pos > 1 then
matchObj.pos = matchObj.from
return matchObj
end
if pos < 1 or isWord(matchObj.target[matchObj.pos]) or isWord(matchObj.target[matchObj.pos]) then
oldpos = pos
pos = findNotClass(:class_WHITESPACE, matchObj.target, matchObj.pos, matchObj.lastpos)
if oldpos == pos then
#nobacktrack
return matchObj if nextchars != "" and nextchars.index(matchObj.target[pos..(pos +1)]) < 0
matchObj.pos = pos
return matchObj
end
nextcharsLength = nextchars.length();
if nextcharsLength == 0 then
#backtrack
matchObj.pos = pos
newCouroutine = ws_couroutine # clone
matchobj.coroutine = newCouroutine
newCouroutine( matchObj, matchObj.from, matchObj.pos )
return matchobj
end
if findClass( :class_WHITESPACE, nextchars, 0, nextcharsLength ) >= nextcharsLength then
#nobacktrack
return matchObj if nextchars != "" and nextchars.index(matchObj.target[pos..(pos +1)]) < 0
matchObj.pos = pos
return matchObj
end
else
return matchObj
end
end
def ws_couroutine( matchObj, from, pos )
do
yield matchObj
pos --
if not ( pos > from) then
matchObj.coroutine = mil
continue
end
while true
end
end
end
def before ( matchObj, pattern )
return fail( matchObj ) if not pattern
if not @@cache.key? pattern then
@@cache[pattern] = P6Rule.new(pattern)
end
rule = @@cache[pattern]
matchObj = rule( matchObj )
return matchObj unless matchObj
matchobj.pos = @from
matchObj.from = nil
matchObj.coroutine = nil
end
def after ( matchObj )
return fail( matchObj ) if not pattern
pattern = "[" + pattern + "]$"
if not @@cache.key? pattern then
@@cache[pattern] = P6Rule.new(pattern)
end
rule = @@cache[pattern]
from = matchObj.pos
matchObj = rule( matchObj.target[0 from] )
return matchObj unless matchObj
matchObj.from = from
matchObj.pos = from
matchObj.coroutine = nil
matchObj
end
end
end