diff options
author | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2013-09-30 06:59:11 +0000 |
---|---|---|
committer | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2013-09-30 06:59:11 +0000 |
commit | 132aa8a77685ec92bc90c03f987650d275a7b639 (patch) | |
tree | 330e586f7a865c6c43a08f074ee401985e10aed6 /sca-java-2.x/tags/2.0.1-RC1/modules/implementation-python-runtime/src/main/resources/django/utils/simplejson/scanner.py | |
parent | 024e31156a43ff8db12813d6f7fb1fdd87f4a5a3 (diff) |
2.0.1 RC1 release tag
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1527464 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-java-2.x/tags/2.0.1-RC1/modules/implementation-python-runtime/src/main/resources/django/utils/simplejson/scanner.py')
-rw-r--r-- | sca-java-2.x/tags/2.0.1-RC1/modules/implementation-python-runtime/src/main/resources/django/utils/simplejson/scanner.py | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/sca-java-2.x/tags/2.0.1-RC1/modules/implementation-python-runtime/src/main/resources/django/utils/simplejson/scanner.py b/sca-java-2.x/tags/2.0.1-RC1/modules/implementation-python-runtime/src/main/resources/django/utils/simplejson/scanner.py new file mode 100644 index 0000000000..64f4999fb5 --- /dev/null +++ b/sca-java-2.x/tags/2.0.1-RC1/modules/implementation-python-runtime/src/main/resources/django/utils/simplejson/scanner.py @@ -0,0 +1,63 @@ +""" +Iterator based sre token scanner +""" +import sre_parse, sre_compile, sre_constants +from sre_constants import BRANCH, SUBPATTERN +from re import VERBOSE, MULTILINE, DOTALL +import re + +__all__ = ['Scanner', 'pattern'] + +FLAGS = (VERBOSE | MULTILINE | DOTALL) +class Scanner(object): + def __init__(self, lexicon, flags=FLAGS): + self.actions = [None] + # combine phrases into a compound pattern + s = sre_parse.Pattern() + s.flags = flags + p = [] + for idx, token in enumerate(lexicon): + phrase = token.pattern + try: + subpattern = sre_parse.SubPattern(s, + [(SUBPATTERN, (idx + 1, sre_parse.parse(phrase, flags)))]) + except sre_constants.error: + raise + p.append(subpattern) + self.actions.append(token) + + p = sre_parse.SubPattern(s, [(BRANCH, (None, p))]) + self.scanner = sre_compile.compile(p) + + + def iterscan(self, string, idx=0, context=None): + """ + Yield match, end_idx for each match + """ + match = self.scanner.scanner(string, idx).match + actions = self.actions + lastend = idx + end = len(string) + while True: + m = match() + if m is None: + break + matchbegin, matchend = m.span() + if lastend == matchend: + break + action = actions[m.lastindex] + if action is not None: + rval, next_pos = action(m, context) + if next_pos is not None and next_pos != matchend: + # "fast forward" the scanner + matchend = next_pos + match = self.scanner.scanner(string, matchend).match + yield rval, matchend + lastend = matchend + +def pattern(pattern, flags=FLAGS): + def decorator(fn): + fn.pattern = pattern + fn.regex = re.compile(pattern, flags) + return fn + return decorator |