Commit 049ade29 authored by Raymond Hettinger's avatar Raymond Hettinger

Complete the previous effort to factor out constant expressions

and improve the speed of the if/elif/else blocks.
parent 9533e340
...@@ -24,14 +24,25 @@ else: ...@@ -24,14 +24,25 @@ else:
def _identityfunction(x): def _identityfunction(x):
return x return x
def set(seq):
s = {}
for elem in seq:
s[elem] = 1
return s
_LITERAL_CODES = set([LITERAL, NOT_LITERAL])
_REPEATING_CODES = set([REPEAT, MIN_REPEAT, MAX_REPEAT])
_SUCCESS_CODES = set([SUCCESS, FAILURE])
_ASSERT_CODES = set([ASSERT, ASSERT_NOT])
def _compile(code, pattern, flags): def _compile(code, pattern, flags):
# internal: compile a (sub)pattern # internal: compile a (sub)pattern
emit = code.append emit = code.append
_len = len _len = len
LITERAL_CODES = {LITERAL:1, NOT_LITERAL:1} LITERAL_CODES = _LITERAL_CODES
REPEATING_CODES = {REPEAT:1, MIN_REPEAT:1, MAX_REPEAT:1} REPEATING_CODES = _REPEATING_CODES
SUCCESS_CODES = {SUCCESS:1, FAILURE:1} SUCCESS_CODES = _SUCCESS_CODES
ASSERT_CODES = {ASSERT:1, ASSERT_NOT:1} ASSERT_CODES = _ASSERT_CODES
for op, av in pattern: for op, av in pattern:
if op in LITERAL_CODES: if op in LITERAL_CODES:
if flags & SRE_FLAG_IGNORECASE: if flags & SRE_FLAG_IGNORECASE:
......
...@@ -16,15 +16,21 @@ import sys ...@@ -16,15 +16,21 @@ import sys
from sre_constants import * from sre_constants import *
def set(seq):
s = {}
for elem in seq:
s[elem] = 1
return s
SPECIAL_CHARS = ".\\[{()*+?^$|" SPECIAL_CHARS = ".\\[{()*+?^$|"
REPEAT_CHARS = "*+?{" REPEAT_CHARS = "*+?{"
DIGITS = tuple("0123456789") DIGITS = set("0123456789")
OCTDIGITS = tuple("01234567") OCTDIGITS = set("01234567")
HEXDIGITS = tuple("0123456789abcdefABCDEF") HEXDIGITS = set("0123456789abcdefABCDEF")
WHITESPACE = tuple(" \t\n\r\v\f") WHITESPACE = set(" \t\n\r\v\f")
ESCAPES = { ESCAPES = {
r"\a": (LITERAL, ord("\a")), r"\a": (LITERAL, ord("\a")),
...@@ -371,6 +377,11 @@ def _parse_sub_cond(source, state, condgroup): ...@@ -371,6 +377,11 @@ def _parse_sub_cond(source, state, condgroup):
subpattern.append((GROUPREF_EXISTS, (condgroup, item_yes, item_no))) subpattern.append((GROUPREF_EXISTS, (condgroup, item_yes, item_no)))
return subpattern return subpattern
_PATTERNENDERS = set("|)")
_ASSERTCHARS = set("=!<")
_LOOKBEHINDASSERTCHARS = set("=!")
_REPEATCODES = set([MIN_REPEAT, MAX_REPEAT])
def _parse(source, state): def _parse(source, state):
# parse a simple pattern # parse a simple pattern
subpattern = SubPattern(state) subpattern = SubPattern(state)
...@@ -380,10 +391,10 @@ def _parse(source, state): ...@@ -380,10 +391,10 @@ def _parse(source, state):
sourceget = source.get sourceget = source.get
sourcematch = source.match sourcematch = source.match
_len = len _len = len
PATTERNENDERS = ("|", ")") PATTERNENDERS = _PATTERNENDERS
ASSERTCHARS = ("=", "!", "<") ASSERTCHARS = _ASSERTCHARS
LOOKBEHINDASSERTCHARS = ("=", "!") LOOKBEHINDASSERTCHARS = _LOOKBEHINDASSERTCHARS
REPEATCODES = (MIN_REPEAT, MAX_REPEAT) REPEATCODES = _REPEATCODES
while 1: while 1:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment