1 2# The contents of this file are subject to the Mozilla Public License 3# (MPL) Version 1.1 (the "License"); you may not use this file except 4# in compliance with the License. You may obtain a copy of the License 5# at http://www.mozilla.org/MPL/ 6# 7# Software distributed under the License is distributed on an "AS IS" 8# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See 9# the License for the specific language governing rights and 10# limitations under the License. 11# 12# The Original Code is LEPL (http://www.acooke.org/lepl) 13# The Initial Developer of the Original Code is Andrew Cooke. 14# Portions created by the Initial Developer are Copyright (C) 2009-2010 15# Andrew Cooke (andrew@acooke.org). All Rights Reserved. 16# 17# Alternatively, the contents of this file may be used under the terms 18# of the LGPL license (the GNU Lesser General Public License, 19# http://www.gnu.org/licenses/lgpl.html), in which case the provisions 20# of the LGPL License are applicable instead of those above. 21# 22# If you wish to allow use of your version of this file only under the 23# terms of the LGPL License and not to allow others to use your version 24# of this file under the MPL, indicate your decision by deleting the 25# provisions above and replace them with the notice and other provisions 26# required by the LGPL License. If you do not delete the provisions 27# above, a recipient may use your version of this file under either the 28# MPL or the LGPL License. 29 30''' 31Matchers that call the regular expression engine. 32 33These are used internally for rewriting; users typically use `Regexp` which 34calls the standard Python regular expression library (and so is faster). 35''' 36 37fromlepl.matchers.supportimportTransformable,NoTrampoline 38fromlepl.matchers.transformimportraise_ 39fromlepl.core.parserimporttagged 40fromlepl.regexp.coreimportCompiler 41fromlepl.regexp.unicodeimportUnicodeAlphabet

76''' 77 A matcher for NFA-based regular expressions. This will yield alternative 78 matches. 79 80 This doesn't suffer from the same limitations as `Regexp` (it can "see" 81 all the input data, if necessary), but currently has quite basic syntax 82 and no grouping (the syntax may improve, but grouping will not be added - 83 use LEPL itself for complex problems). 84 ''' 85

101'''102 Actually do the work of matching.103 '''104function=self.wrapper.function105matches=self._compile()(stream_in)106for(_terminal,match,stream_out)inmatches:107yieldfunction(stream_in,lambda:([match],stream_out)) \ 108iffunctionelse([match],stream_out)109whileTrue:110yieldfunction(stream_in,lambda:raise_(StopIteration))

136'''137 Actually do the work of matching.138 '''139function=self.wrapper.function140match=self._compile()(stream_in)141ifmatchisnotNone:142(_terminals,match,stream_out)=match143yieldfunction(stream_in,lambda:([match],stream_out)) \ 144iffunctionelse([match],stream_out)145whileTrue:146yieldfunction(stream_in,lambda:raise_(StopIteration))