[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

AltStyle によって変換されたページ (->オリジナル) /