[Python-checkins] CVS: python/dist/src/Lib sre_compile.py,1.14,1.15 sre_constants.py,1.11,1.12 sre_parse.py,1.14,1.15
Fredrik Lundh
python-dev@python.org
2000年6月30日 03:41:33 -0700
Update of /cvsroot/python/python/dist/src/Lib
In directory slayer.i.sourceforge.net:/tmp/cvs-serv26572/Lib
Modified Files:
sre_compile.py sre_constants.py sre_parse.py
Log Message:
- fixed lookahead assertions (#10, #11, #12)
- untabified sre_constants.py
Index: sre_compile.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/sre_compile.py,v
retrieving revision 1.14
retrieving revision 1.15
diff -C2 -r1.14 -r1.15
*** sre_compile.py 2000年06月30日 07:50:59 1.14
--- sre_compile.py 2000年06月30日 10:41:30 1.15
***************
*** 27,76 ****
emit = code.append
for op, av in pattern:
! if op is ANY:
! if flags & SRE_FLAG_DOTALL:
! emit(OPCODES[op])
! else:
! emit(OPCODES[CATEGORY])
! emit(CHCODES[CATEGORY_NOT_LINEBREAK])
! elif op in (SUCCESS, FAILURE):
! emit(OPCODES[op])
! elif op is AT:
! emit(OPCODES[op])
! if flags & SRE_FLAG_MULTILINE:
! emit(ATCODES[AT_MULTILINE[av]])
! else:
! emit(ATCODES[av])
! elif op is BRANCH:
! emit(OPCODES[op])
! tail = []
! for av in av[1]:
! skip = len(code); emit(0)
! _compile(code, av, flags)
! emit(OPCODES[JUMP])
! tail.append(len(code)); emit(0)
! code[skip] = len(code) - skip
! emit(0) # end of branch
! for tail in tail:
! code[tail] = len(code) - tail
! elif op is CALL:
! emit(OPCODES[op])
! skip = len(code); emit(0)
! _compile(code, av, flags)
! emit(OPCODES[SUCCESS])
! code[skip] = len(code) - skip
! elif op is CATEGORY:
! emit(OPCODES[op])
! if flags & SRE_FLAG_LOCALE:
! emit(CHCODES[CH_LOCALE[av]])
! elif flags & SRE_FLAG_UNICODE:
! emit(CHCODES[CH_UNICODE[av]])
! else:
! emit(CHCODES[av])
! elif op is GROUP:
if flags & SRE_FLAG_IGNORECASE:
emit(OPCODES[OP_IGNORE[op]])
else:
emit(OPCODES[op])
! emit(av-1)
elif op is IN:
if flags & SRE_FLAG_IGNORECASE:
--- 27,36 ----
emit = code.append
for op, av in pattern:
! if op in (LITERAL, NOT_LITERAL):
if flags & SRE_FLAG_IGNORECASE:
emit(OPCODES[OP_IGNORE[op]])
else:
emit(OPCODES[op])
! emit(ord(av))
elif op is IN:
if flags & SRE_FLAG_IGNORECASE:
***************
*** 102,114 ****
emit(OPCODES[FAILURE])
code[skip] = len(code) - skip
! elif op in (LITERAL, NOT_LITERAL):
! if flags & SRE_FLAG_IGNORECASE:
! emit(OPCODES[OP_IGNORE[op]])
! else:
emit(OPCODES[op])
! emit(ord(av))
! elif op is MARK:
! emit(OPCODES[op])
! emit(av)
elif op in (REPEAT, MIN_REPEAT, MAX_REPEAT):
if flags & SRE_FLAG_TEMPLATE:
--- 62,71 ----
emit(OPCODES[FAILURE])
code[skip] = len(code) - skip
! elif op is ANY:
! if flags & SRE_FLAG_DOTALL:
emit(OPCODES[op])
! else:
! emit(OPCODES[CATEGORY])
! emit(CHCODES[CATEGORY_NOT_LINEBREAK])
elif op in (REPEAT, MIN_REPEAT, MAX_REPEAT):
if flags & SRE_FLAG_TEMPLATE:
***************
*** 151,154 ****
--- 108,154 ----
emit(OPCODES[MARK])
emit((group-1)*2+1)
+ elif op in (SUCCESS, FAILURE):
+ emit(OPCODES[op])
+ elif op in (ASSERT, ASSERT_NOT, CALL):
+ emit(OPCODES[op])
+ skip = len(code); emit(0)
+ _compile(code, av, flags)
+ emit(OPCODES[SUCCESS])
+ code[skip] = len(code) - skip
+ elif op is AT:
+ emit(OPCODES[op])
+ if flags & SRE_FLAG_MULTILINE:
+ emit(ATCODES[AT_MULTILINE[av]])
+ else:
+ emit(ATCODES[av])
+ elif op is BRANCH:
+ emit(OPCODES[op])
+ tail = []
+ for av in av[1]:
+ skip = len(code); emit(0)
+ _compile(code, av, flags)
+ emit(OPCODES[JUMP])
+ tail.append(len(code)); emit(0)
+ code[skip] = len(code) - skip
+ emit(0) # end of branch
+ for tail in tail:
+ code[tail] = len(code) - tail
+ elif op is CATEGORY:
+ emit(OPCODES[op])
+ if flags & SRE_FLAG_LOCALE:
+ emit(CHCODES[CH_LOCALE[av]])
+ elif flags & SRE_FLAG_UNICODE:
+ emit(CHCODES[CH_UNICODE[av]])
+ else:
+ emit(CHCODES[av])
+ elif op is GROUP:
+ if flags & SRE_FLAG_IGNORECASE:
+ emit(OPCODES[OP_IGNORE[op]])
+ else:
+ emit(OPCODES[op])
+ emit(av-1)
+ elif op is MARK:
+ emit(OPCODES[op])
+ emit(av)
else:
raise ValueError, ("unsupported operand type", op)
Index: sre_constants.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/sre_constants.py,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -r1.11 -r1.12
*** sre_constants.py 2000年06月29日 18:03:25 1.11
--- sre_constants.py 2000年06月30日 10:41:30 1.12
***************
*** 24,27 ****
--- 24,28 ----
ANY = "any"
ASSERT = "assert"
+ ASSERT_NOT = "assert_not"
AT = "at"
BRANCH = "branch"
***************
*** 82,86 ****
ANY,
! ASSERT,
AT,
BRANCH,
--- 83,87 ----
ANY,
! ASSERT, ASSERT_NOT,
AT,
BRANCH,
***************
*** 122,127 ****
i = 0
for item in list:
! d[item] = i
! i = i + 1
return d
--- 123,128 ----
i = 0
for item in list:
! d[item] = i
! i = i + 1
return d
***************
*** 177,186 ****
import string
def dump(f, d, prefix):
! items = d.items()
! items.sort(lambda a, b: cmp(a[1], b[1]))
! for k, v in items:
! f.write("#define %s_%s %s\n" % (prefix, string.upper(k), v))
f = open("sre_constants.h", "w")
! f.write("/* generated from sre_constants.py */\n")
dump(f, OPCODES, "SRE_OP")
dump(f, ATCODES, "SRE")
--- 178,202 ----
import string
def dump(f, d, prefix):
! items = d.items()
! items.sort(lambda a, b: cmp(a[1], b[1]))
! for k, v in items:
! f.write("#define %s_%s %s\n" % (prefix, string.upper(k), v))
f = open("sre_constants.h", "w")
! f.write("""\
! /*
! * Secret Labs' Regular Expression Engine
! *
! * regular expression matching engine
! *
! * NOTE: This file is generated by sre_constants.py. If you need
! * to change anything in here, edit sre_constants.py and run it.
! *
! * Copyright (c) 1997-2000 by Secret Labs AB. All rights reserved.
! *
! * See the _sre.c file for information on usage and redistribution.
! */
!
! """)
!
dump(f, OPCODES, "SRE_OP")
dump(f, ATCODES, "SRE")
Index: sre_parse.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/sre_parse.py,v
retrieving revision 1.14
retrieving revision 1.15
diff -C2 -r1.14 -r1.15
*** sre_parse.py 2000年06月30日 09:13:05 1.14
--- sre_parse.py 2000年06月30日 10:41:30 1.15
***************
*** 471,474 ****
--- 471,493 ----
break
source.get()
+ elif source.next in ("=", "!"):
+ # lookahead assertions
+ char = source.get()
+ b = []
+ while 1:
+ p = _parse(source, state, flags)
+ if source.next == ")":
+ if b:
+ b.append(p)
+ p = _branch(state, b)
+ if char == "=":
+ subpattern.append((ASSERT, p))
+ else:
+ subpattern.append((ASSERT_NOT, p))
+ break
+ elif source.match("|"):
+ b.append(p)
+ else:
+ raise error, "pattern not properly closed"
else:
# flags