(original) (raw)

Index: sre_compile.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/sre_compile.py,v retrieving revision 1.54 diff -c -r1.54 sre_compile.py *** sre_compile.py 27 Mar 2004 09:24:36 -0000 1.54 --- sre_compile.py 23 Apr 2004 23:56:33 -0000 *************** *** 27,174 **** def _compile(code, pattern, flags): # internal: compile a (sub)pattern emit = code.append _len = len ! LITERAL_CODES = {LITERAL:1, NOT_LITERAL:1} ! REPEATING_CODES = {REPEAT:1, MIN_REPEAT:1, MAX_REPEAT:1} ! SUCCESS_CODES = {SUCCESS:1, FAILURE:1} ! ASSERT_CODES = {ASSERT:1, ASSERT_NOT:1} ! for op, av in pattern: ! if op in LITERAL_CODES: ! if flags & SRE_FLAG_IGNORECASE: ! emit(OPCODES[OP_IGNORE[op]]) ! emit(_sre.getlower(av, flags)) ! else: ! emit(OPCODES[op]) ! emit(av) ! elif op is IN: ! if flags & SRE_FLAG_IGNORECASE: ! emit(OPCODES[OP_IGNORE[op]]) ! def fixup(literal, flags=flags): ! return _sre.getlower(literal, flags) ! else: ! emit(OPCODES[op]) ! fixup = _identityfunction ! skip = _len(code); emit(0) ! _compile_charset(av, flags, code, fixup) ! code[skip] = _len(code) - skip ! elif op is ANY: ! if flags & SRE_FLAG_DOTALL: ! emit(OPCODES[ANY_ALL]) ! else: ! emit(OPCODES[ANY]) ! elif op in REPEATING_CODES: ! if flags & SRE_FLAG_TEMPLATE: ! raise error, "internal: unsupported template operator" ! emit(OPCODES[REPEAT]) ! skip = _len(code); emit(0) ! emit(av[0]) ! emit(av[1]) ! _compile(code, av[2], flags) ! emit(OPCODES[SUCCESS]) ! code[skip] = _len(code) - skip ! elif _simple(av) and op is not REPEAT: ! if op is MAX_REPEAT: ! emit(OPCODES[REPEAT_ONE]) ! else: ! emit(OPCODES[MIN_REPEAT_ONE]) ! skip = _len(code); emit(0) ! emit(av[0]) ! emit(av[1]) ! _compile(code, av[2], flags) ! emit(OPCODES[SUCCESS]) ! code[skip] = _len(code) - skip ! else: ! emit(OPCODES[REPEAT]) ! skip = _len(code); emit(0) ! emit(av[0]) ! emit(av[1]) ! _compile(code, av[2], flags) ! code[skip] = _len(code) - skip ! if op is MAX_REPEAT: ! emit(OPCODES[MAX_UNTIL]) ! else: ! emit(OPCODES[MIN_UNTIL]) ! elif op is SUBPATTERN: ! if av[0]: ! emit(OPCODES[MARK]) ! emit((av[0]-1)*2) ! # _compile_info(code, av[1], flags) ! _compile(code, av[1], flags) ! if av[0]: ! emit(OPCODES[MARK]) ! emit((av[0]-1)*2+1) ! elif op in SUCCESS_CODES: emit(OPCODES[op]) ! elif op in ASSERT_CODES: emit(OPCODES[op]) skip = _len(code); emit(0) ! if av[0] >= 0: ! emit(0) # look ahead ! else: ! lo, hi = av[1].getwidth() ! if lo != hi: ! raise error, "look-behind requires fixed-width pattern" ! emit(lo) # look behind ! _compile(code, av[1], flags) emit(OPCODES[SUCCESS]) code[skip] = _len(code) - skip ! 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 AT: ! emit(OPCODES[op]) ! if flags & SRE_FLAG_MULTILINE: ! av = AT_MULTILINE.get(av, av) ! if flags & SRE_FLAG_LOCALE: ! av = AT_LOCALE.get(av, av) ! elif flags & SRE_FLAG_UNICODE: ! av = AT_UNICODE.get(av, av) ! emit(ATCODES[av]) ! elif op is BRANCH: ! emit(OPCODES[op]) ! tail = [] ! tailappend = tail.append ! for av in av[1]: ! skip = _len(code); emit(0) ! # _compile_info(code, av, flags) ! _compile(code, av, flags) ! emit(OPCODES[JUMP]) ! tailappend(_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: ! av = CH_LOCALE[av] ! elif flags & SRE_FLAG_UNICODE: ! av = CH_UNICODE[av] ! emit(CHCODES[av]) ! elif op is GROUPREF: ! if flags & SRE_FLAG_IGNORECASE: ! emit(OPCODES[OP_IGNORE[op]]) else: ! emit(OPCODES[op]) ! emit(av-1) ! elif op is GROUPREF_EXISTS: emit(OPCODES[op]) ! emit((av[0]-1)*2) ! skipyes = _len(code); emit(0) ! _compile(code, av[1], flags) ! if av[2]: ! emit(OPCODES[JUMP]) ! skipno = _len(code); emit(0) ! code[skipyes] = _len(code) - skipyes + 1 ! _compile(code, av[2], flags) ! code[skipno] = _len(code) - skipno ! else: ! code[skipyes] = _len(code) - skipyes + 1 else: ! raise ValueError, ("unsupported operand type", op) def _compile_charset(charset, flags, code, fixup=None): # compile charset subprogram --- 27,210 ---- def _compile(code, pattern, flags): # internal: compile a (sub)pattern emit = code.append + av = None _len = len ! ! def handle_literal(): ! if flags & SRE_FLAG_IGNORECASE: ! emit(OPCODES[OP_IGNORE[op]]) ! emit(_sre.getlower(av, flags)) ! else: emit(OPCODES[op]) ! emit(av) ! ! def handle_in(_len=len): ! if flags & SRE_FLAG_IGNORECASE: ! emit(OPCODES[OP_IGNORE[op]]) ! def fixup(literal, flags=flags): ! return _sre.getlower(literal, flags) ! else: emit(OPCODES[op]) + fixup = _identityfunction + skip = _len(code); emit(0) + _compile_charset(av, flags, code, fixup) + code[skip] = _len(code) - skip + + def handle_any(): + if flags & SRE_FLAG_DOTALL: + emit(OPCODES[ANY_ALL]) + else: + emit(OPCODES[ANY]) + + def handle_success(): + emit(OPCODES[op]) + + def handle_assert_codes(_len=len): + emit(OPCODES[op]) + skip = _len(code); emit(0) + if av[0] >= 0: + emit(0) # look ahead + else: + lo, hi = av[1].getwidth() + if lo != hi: + raise error, "look-behind requires fixed-width pattern" + emit(lo) # look behind + _compile(code, av[1], flags) + emit(OPCODES[SUCCESS]) + code[skip] = _len(code) - skip + + def handle_subpattern(): + if av[0]: + emit(OPCODES[MARK]) + emit((av[0]-1)*2) + # _compile_info(code, av[1], flags) + _compile(code, av[1], flags) + if av[0]: + emit(OPCODES[MARK]) + emit((av[0]-1)*2+1) + + def handle_call(_len=len): + emit(OPCODES[op]) + skip = _len(code); emit(0) + _compile(code, av, flags) + emit(OPCODES[SUCCESS]) + code[skip] = _len(code) - skip + + def handle_repeat_codes(_len=len): + if flags & SRE_FLAG_TEMPLATE: + raise error, "internal: unsupported template operator" + emit(OPCODES[REPEAT]) skip = _len(code); emit(0) ! emit(av[0]) ! emit(av[1]) ! _compile(code, av[2], flags) emit(OPCODES[SUCCESS]) code[skip] = _len(code) - skip ! elif _simple(av) and op is not REPEAT: ! if op is MAX_REPEAT: ! emit(OPCODES[REPEAT_ONE]) ! else: ! emit(OPCODES[MIN_REPEAT_ONE]) skip = _len(code); emit(0) ! emit(av[0]) ! emit(av[1]) ! _compile(code, av[2], flags) emit(OPCODES[SUCCESS]) code[skip] = _len(code) - skip ! else: ! emit(OPCODES[REPEAT]) ! skip = _len(code); emit(0) ! emit(av[0]) ! emit(av[1]) ! _compile(code, av[2], flags) ! code[skip] = _len(code) - skip ! if op is MAX_REPEAT: ! emit(OPCODES[MAX_UNTIL]) else: ! emit(OPCODES[MIN_UNTIL]) ! ! def handle_category(): ! emit(OPCODES[op]) ! if flags & SRE_FLAG_LOCALE: ! av = CH_LOCALE[av] ! elif flags & SRE_FLAG_UNICODE: ! av = CH_UNICODE[av] ! emit(CHCODES[av]) ! ! def handle_at(): ! _av = av ! emit(OPCODES[op]) ! if flags & SRE_FLAG_MULTILINE: ! _av = AT_MULTILINE.get(_av, _av) ! if flags & SRE_FLAG_LOCALE: ! _av = AT_LOCALE.get(_av, _av) ! elif flags & SRE_FLAG_UNICODE: ! _av = AT_UNICODE.get(_av, _av) ! emit(ATCODES[_av]) ! ! def handle_groupref(): ! if flags & SRE_FLAG_IGNORECASE: ! emit(OPCODES[OP_IGNORE[op]]) ! else: emit(OPCODES[op]) ! emit(av-1) ! ! def handle_groupref_exists(_len=len): ! emit(OPCODES[op]) ! emit((av[0]-1)*2) ! skipyes = _len(code); emit(0) ! _compile(code, av[1], flags) ! if av[2]: ! emit(OPCODES[JUMP]) ! skipno = _len(code); emit(0) ! code[skipyes] = _len(code) - skipyes + 1 ! _compile(code, av[2], flags) ! code[skipno] = _len(code) - skipno else: ! code[skipyes] = _len(code) - skipyes + 1 ! ! def handle_branch(): ! emit(OPCODES[op]) ! tail = [] ! tailappend = tail.append ! for _av in av[1]: ! skip = _len(code); emit(0) ! # _compile_info(code, _av, flags) ! _compile(code, _av, flags) ! emit(OPCODES[JUMP]) ! tailappend(_len(code)); emit(0) ! code[skip] = _len(code) - skip ! emit(0) # end of branch ! for tail in tail: ! code[tail] = _len(code) - tail ! ! def handle_default(): ! raise ValueError, ("unsupported operand type", op) ! ! dispatch = { ! LITERAL : handle_literal, ! NOT_LITERAL : handle_literal, ! IN : handle_in, ! ANY : handle_any, ! SUCCESS : handle_success, ! FAILURE : handle_success, ! ASSERT : handle_assert_codes, ! ASSERT_NOT : handle_assert_codes, ! SUBPATTERN : handle_subpattern, ! CALL : handle_call, ! REPEAT : handle_repeat_codes, ! MIN_REPEAT : handle_repeat_codes, ! MAX_REPEAT : handle_repeat_codes, ! CATEGORY : handle_category, ! GROUPREF : handle_groupref, ! GROUPREF_EXISTS : handle_groupref_exists, ! AT : handle_at, ! BRANCH : handle_branch, ! } ! ! for op, av in pattern: ! dispatch.get(op, handle_default)() ! def _compile_charset(charset, flags, code, fixup=None): # compile charset subprogram