Cython 3.2.0__cp39-abi3-win32.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- Cython/Build/BuildExecutable.py +169 -0
- Cython/Build/Cache.py +199 -0
- Cython/Build/Cythonize.py +350 -0
- Cython/Build/Dependencies.py +1314 -0
- Cython/Build/Distutils.py +1 -0
- Cython/Build/Inline.py +463 -0
- Cython/Build/IpythonMagic.py +560 -0
- Cython/Build/SharedModule.py +94 -0
- Cython/Build/Tests/TestCyCache.py +194 -0
- Cython/Build/Tests/TestCythonizeArgsParser.py +481 -0
- Cython/Build/Tests/TestDependencies.py +133 -0
- Cython/Build/Tests/TestInline.py +177 -0
- Cython/Build/Tests/TestIpythonMagic.py +287 -0
- Cython/Build/Tests/TestRecythonize.py +212 -0
- Cython/Build/Tests/TestStripLiterals.py +155 -0
- Cython/Build/Tests/__init__.py +1 -0
- Cython/Build/__init__.py +11 -0
- Cython/CodeWriter.py +815 -0
- Cython/Compiler/AnalysedTreeTransforms.py +97 -0
- Cython/Compiler/Annotate.py +328 -0
- Cython/Compiler/AutoDocTransforms.py +320 -0
- Cython/Compiler/Buffer.py +680 -0
- Cython/Compiler/Builtin.py +984 -0
- Cython/Compiler/CmdLine.py +263 -0
- Cython/Compiler/Code.pxd +149 -0
- Cython/Compiler/Code.py +3746 -0
- Cython/Compiler/Code.pyd +0 -0
- Cython/Compiler/CodeGeneration.py +33 -0
- Cython/Compiler/CythonScope.py +191 -0
- Cython/Compiler/Dataclass.py +864 -0
- Cython/Compiler/DebugFlags.py +24 -0
- Cython/Compiler/Errors.py +297 -0
- Cython/Compiler/ExprNodes.py +15562 -0
- Cython/Compiler/FlowControl.pxd +97 -0
- Cython/Compiler/FlowControl.py +1451 -0
- Cython/Compiler/FlowControl.pyd +0 -0
- Cython/Compiler/FusedNode.py +971 -0
- Cython/Compiler/FusedNode.pyd +0 -0
- Cython/Compiler/Future.py +16 -0
- Cython/Compiler/Interpreter.py +57 -0
- Cython/Compiler/Lexicon.py +421 -0
- Cython/Compiler/LineTable.py +114 -0
- Cython/Compiler/LineTable.pyd +0 -0
- Cython/Compiler/Main.py +857 -0
- Cython/Compiler/MatchCaseNodes.py +259 -0
- Cython/Compiler/MemoryView.py +905 -0
- Cython/Compiler/ModuleNode.py +4235 -0
- Cython/Compiler/Naming.py +363 -0
- Cython/Compiler/Nodes.py +10831 -0
- Cython/Compiler/Optimize.py +5288 -0
- Cython/Compiler/Options.py +843 -0
- Cython/Compiler/ParseTreeTransforms.pxd +78 -0
- Cython/Compiler/ParseTreeTransforms.py +4638 -0
- Cython/Compiler/Parsing.pxd +9 -0
- Cython/Compiler/Parsing.py +4775 -0
- Cython/Compiler/Parsing.pyd +0 -0
- Cython/Compiler/Pipeline.py +439 -0
- Cython/Compiler/PyrexTypes.py +5870 -0
- Cython/Compiler/Pythran.py +232 -0
- Cython/Compiler/Scanning.pxd +48 -0
- Cython/Compiler/Scanning.py +701 -0
- Cython/Compiler/Scanning.pyd +0 -0
- Cython/Compiler/StringEncoding.py +298 -0
- Cython/Compiler/Symtab.py +3073 -0
- Cython/Compiler/Tests/TestBuffer.py +105 -0
- Cython/Compiler/Tests/TestBuiltin.py +72 -0
- Cython/Compiler/Tests/TestCmdLine.py +586 -0
- Cython/Compiler/Tests/TestCode.py +144 -0
- Cython/Compiler/Tests/TestFlowControl.py +65 -0
- Cython/Compiler/Tests/TestGrammar.py +202 -0
- Cython/Compiler/Tests/TestMemView.py +71 -0
- Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
- Cython/Compiler/Tests/TestScanning.py +134 -0
- Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
- Cython/Compiler/Tests/TestStringEncoding.py +21 -0
- Cython/Compiler/Tests/TestTreeFragment.py +63 -0
- Cython/Compiler/Tests/TestTreePath.py +103 -0
- Cython/Compiler/Tests/TestTypes.py +75 -0
- Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
- Cython/Compiler/Tests/TestVisitor.py +61 -0
- Cython/Compiler/Tests/Utils.py +36 -0
- Cython/Compiler/Tests/__init__.py +1 -0
- Cython/Compiler/TreeFragment.py +278 -0
- Cython/Compiler/TreePath.py +303 -0
- Cython/Compiler/TypeInference.py +591 -0
- Cython/Compiler/TypeSlots.py +1174 -0
- Cython/Compiler/UFuncs.py +311 -0
- Cython/Compiler/UtilNodes.py +389 -0
- Cython/Compiler/UtilityCode.py +344 -0
- Cython/Compiler/Version.py +8 -0
- Cython/Compiler/Visitor.pxd +53 -0
- Cython/Compiler/Visitor.py +861 -0
- Cython/Compiler/Visitor.pyd +0 -0
- Cython/Compiler/__init__.py +1 -0
- Cython/Coverage.py +448 -0
- Cython/Debugger/Cygdb.py +177 -0
- Cython/Debugger/DebugWriter.py +82 -0
- Cython/Debugger/Tests/TestLibCython.py +275 -0
- Cython/Debugger/Tests/__init__.py +1 -0
- Cython/Debugger/Tests/cfuncs.c +8 -0
- Cython/Debugger/Tests/codefile +49 -0
- Cython/Debugger/Tests/test_libcython_in_gdb.py +578 -0
- Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
- Cython/Debugger/__init__.py +1 -0
- Cython/Debugger/libcython.py +1548 -0
- Cython/Debugger/libpython.py +2821 -0
- Cython/Debugging.py +20 -0
- Cython/Distutils/__init__.py +2 -0
- Cython/Distutils/build_ext.py +139 -0
- Cython/Distutils/extension.py +96 -0
- Cython/Distutils/old_build_ext.py +351 -0
- Cython/Includes/cpython/__init__.pxd +173 -0
- Cython/Includes/cpython/array.pxd +178 -0
- Cython/Includes/cpython/bool.pxd +37 -0
- Cython/Includes/cpython/buffer.pxd +112 -0
- Cython/Includes/cpython/bytearray.pxd +33 -0
- Cython/Includes/cpython/bytes.pxd +200 -0
- Cython/Includes/cpython/cellobject.pxd +35 -0
- Cython/Includes/cpython/ceval.pxd +8 -0
- Cython/Includes/cpython/codecs.pxd +121 -0
- Cython/Includes/cpython/complex.pxd +60 -0
- Cython/Includes/cpython/contextvars.pxd +145 -0
- Cython/Includes/cpython/conversion.pxd +36 -0
- Cython/Includes/cpython/datetime.pxd +395 -0
- Cython/Includes/cpython/descr.pxd +26 -0
- Cython/Includes/cpython/dict.pxd +187 -0
- Cython/Includes/cpython/exc.pxd +263 -0
- Cython/Includes/cpython/fileobject.pxd +57 -0
- Cython/Includes/cpython/float.pxd +47 -0
- Cython/Includes/cpython/function.pxd +65 -0
- Cython/Includes/cpython/genobject.pxd +25 -0
- Cython/Includes/cpython/getargs.pxd +12 -0
- Cython/Includes/cpython/instance.pxd +25 -0
- Cython/Includes/cpython/iterator.pxd +36 -0
- Cython/Includes/cpython/iterobject.pxd +24 -0
- Cython/Includes/cpython/list.pxd +92 -0
- Cython/Includes/cpython/long.pxd +149 -0
- Cython/Includes/cpython/longintrepr.pxd +14 -0
- Cython/Includes/cpython/mapping.pxd +63 -0
- Cython/Includes/cpython/marshal.pxd +66 -0
- Cython/Includes/cpython/mem.pxd +120 -0
- Cython/Includes/cpython/memoryview.pxd +50 -0
- Cython/Includes/cpython/method.pxd +49 -0
- Cython/Includes/cpython/module.pxd +208 -0
- Cython/Includes/cpython/number.pxd +258 -0
- Cython/Includes/cpython/object.pxd +433 -0
- Cython/Includes/cpython/pycapsule.pxd +143 -0
- Cython/Includes/cpython/pylifecycle.pxd +68 -0
- Cython/Includes/cpython/pyport.pxd +8 -0
- Cython/Includes/cpython/pystate.pxd +95 -0
- Cython/Includes/cpython/pythread.pxd +53 -0
- Cython/Includes/cpython/ref.pxd +141 -0
- Cython/Includes/cpython/sequence.pxd +134 -0
- Cython/Includes/cpython/set.pxd +119 -0
- Cython/Includes/cpython/slice.pxd +70 -0
- Cython/Includes/cpython/time.pxd +129 -0
- Cython/Includes/cpython/tuple.pxd +72 -0
- Cython/Includes/cpython/type.pxd +53 -0
- Cython/Includes/cpython/unicode.pxd +639 -0
- Cython/Includes/cpython/version.pxd +32 -0
- Cython/Includes/cpython/weakref.pxd +78 -0
- Cython/Includes/libc/__init__.pxd +1 -0
- Cython/Includes/libc/complex.pxd +35 -0
- Cython/Includes/libc/errno.pxd +127 -0
- Cython/Includes/libc/float.pxd +43 -0
- Cython/Includes/libc/limits.pxd +28 -0
- Cython/Includes/libc/locale.pxd +46 -0
- Cython/Includes/libc/math.pxd +209 -0
- Cython/Includes/libc/setjmp.pxd +10 -0
- Cython/Includes/libc/signal.pxd +64 -0
- Cython/Includes/libc/stddef.pxd +9 -0
- Cython/Includes/libc/stdint.pxd +105 -0
- Cython/Includes/libc/stdio.pxd +80 -0
- Cython/Includes/libc/stdlib.pxd +72 -0
- Cython/Includes/libc/string.pxd +50 -0
- Cython/Includes/libc/threads.pxd +234 -0
- Cython/Includes/libc/time.pxd +52 -0
- Cython/Includes/libcpp/__init__.pxd +4 -0
- Cython/Includes/libcpp/algorithm.pxd +320 -0
- Cython/Includes/libcpp/any.pxd +16 -0
- Cython/Includes/libcpp/atomic.pxd +59 -0
- Cython/Includes/libcpp/barrier.pxd +22 -0
- Cython/Includes/libcpp/bit.pxd +29 -0
- Cython/Includes/libcpp/cast.pxd +12 -0
- Cython/Includes/libcpp/cmath.pxd +518 -0
- Cython/Includes/libcpp/complex.pxd +106 -0
- Cython/Includes/libcpp/condition_variable.pxd +322 -0
- Cython/Includes/libcpp/deque.pxd +165 -0
- Cython/Includes/libcpp/exception.pxd +86 -0
- Cython/Includes/libcpp/execution.pxd +15 -0
- Cython/Includes/libcpp/forward_list.pxd +63 -0
- Cython/Includes/libcpp/functional.pxd +26 -0
- Cython/Includes/libcpp/future.pxd +103 -0
- Cython/Includes/libcpp/iterator.pxd +34 -0
- Cython/Includes/libcpp/latch.pxd +17 -0
- Cython/Includes/libcpp/limits.pxd +61 -0
- Cython/Includes/libcpp/list.pxd +117 -0
- Cython/Includes/libcpp/map.pxd +252 -0
- Cython/Includes/libcpp/memory.pxd +115 -0
- Cython/Includes/libcpp/mutex.pxd +387 -0
- Cython/Includes/libcpp/numbers.pxd +15 -0
- Cython/Includes/libcpp/numeric.pxd +131 -0
- Cython/Includes/libcpp/optional.pxd +34 -0
- Cython/Includes/libcpp/pair.pxd +1 -0
- Cython/Includes/libcpp/queue.pxd +25 -0
- Cython/Includes/libcpp/random.pxd +166 -0
- Cython/Includes/libcpp/semaphore.pxd +43 -0
- Cython/Includes/libcpp/set.pxd +228 -0
- Cython/Includes/libcpp/shared_mutex.pxd +96 -0
- Cython/Includes/libcpp/span.pxd +87 -0
- Cython/Includes/libcpp/stack.pxd +11 -0
- Cython/Includes/libcpp/stop_token.pxd +117 -0
- Cython/Includes/libcpp/string.pxd +355 -0
- Cython/Includes/libcpp/string_view.pxd +183 -0
- Cython/Includes/libcpp/typeindex.pxd +15 -0
- Cython/Includes/libcpp/typeinfo.pxd +10 -0
- Cython/Includes/libcpp/unordered_map.pxd +193 -0
- Cython/Includes/libcpp/unordered_set.pxd +152 -0
- Cython/Includes/libcpp/utility.pxd +30 -0
- Cython/Includes/libcpp/vector.pxd +186 -0
- Cython/Includes/numpy/math.pxd +150 -0
- Cython/Includes/openmp.pxd +50 -0
- Cython/Includes/posix/__init__.pxd +1 -0
- Cython/Includes/posix/dlfcn.pxd +14 -0
- Cython/Includes/posix/fcntl.pxd +86 -0
- Cython/Includes/posix/ioctl.pxd +4 -0
- Cython/Includes/posix/mman.pxd +101 -0
- Cython/Includes/posix/resource.pxd +57 -0
- Cython/Includes/posix/select.pxd +21 -0
- Cython/Includes/posix/signal.pxd +73 -0
- Cython/Includes/posix/stat.pxd +98 -0
- Cython/Includes/posix/stdio.pxd +37 -0
- Cython/Includes/posix/stdlib.pxd +29 -0
- Cython/Includes/posix/strings.pxd +9 -0
- Cython/Includes/posix/time.pxd +71 -0
- Cython/Includes/posix/types.pxd +30 -0
- Cython/Includes/posix/uio.pxd +26 -0
- Cython/Includes/posix/unistd.pxd +271 -0
- Cython/Includes/posix/wait.pxd +38 -0
- Cython/Plex/Actions.pxd +24 -0
- Cython/Plex/Actions.py +119 -0
- Cython/Plex/Actions.pyd +0 -0
- Cython/Plex/DFA.pxd +14 -0
- Cython/Plex/DFA.py +164 -0
- Cython/Plex/DFA.pyd +0 -0
- Cython/Plex/Errors.py +48 -0
- Cython/Plex/Lexicons.py +178 -0
- Cython/Plex/Machines.pxd +36 -0
- Cython/Plex/Machines.py +238 -0
- Cython/Plex/Machines.pyd +0 -0
- Cython/Plex/Regexps.py +535 -0
- Cython/Plex/Scanners.pxd +45 -0
- Cython/Plex/Scanners.py +328 -0
- Cython/Plex/Scanners.pyd +0 -0
- Cython/Plex/Transitions.pxd +14 -0
- Cython/Plex/Transitions.py +239 -0
- Cython/Plex/Transitions.pyd +0 -0
- Cython/Plex/__init__.py +34 -0
- Cython/Runtime/__init__.py +1 -0
- Cython/Runtime/refnanny.pyd +0 -0
- Cython/Runtime/refnanny.pyx +237 -0
- Cython/Shadow.py +690 -0
- Cython/Shadow.pyi +521 -0
- Cython/StringIOTree.py +170 -0
- Cython/StringIOTree.pyd +0 -0
- Cython/Tempita/__init__.py +4 -0
- Cython/Tempita/_looper.py +154 -0
- Cython/Tempita/_tempita.py +1091 -0
- Cython/Tempita/_tempita.pyd +0 -0
- Cython/TestUtils.py +422 -0
- Cython/Tests/TestCodeWriter.py +128 -0
- Cython/Tests/TestCythonUtils.py +202 -0
- Cython/Tests/TestJediTyper.py +223 -0
- Cython/Tests/TestShadow.py +114 -0
- Cython/Tests/TestStringIOTree.py +67 -0
- Cython/Tests/TestTestUtils.py +90 -0
- Cython/Tests/__init__.py +1 -0
- Cython/Tests/xmlrunner.py +390 -0
- Cython/Utility/AsyncGen.c +1031 -0
- Cython/Utility/Buffer.c +865 -0
- Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
- Cython/Utility/Builtins.c +810 -0
- Cython/Utility/CConvert.pyx +134 -0
- Cython/Utility/CMath.c +104 -0
- Cython/Utility/CommonStructures.c +226 -0
- Cython/Utility/Complex.c +378 -0
- Cython/Utility/Coroutine.c +2300 -0
- Cython/Utility/CpdefEnums.pyx +103 -0
- Cython/Utility/CppConvert.pyx +282 -0
- Cython/Utility/CppSupport.cpp +151 -0
- Cython/Utility/CythonFunction.c +1832 -0
- Cython/Utility/Dataclasses.c +101 -0
- Cython/Utility/Embed.c +121 -0
- Cython/Utility/Exceptions.c +1016 -0
- Cython/Utility/ExtensionTypes.c +996 -0
- Cython/Utility/FunctionArguments.c +1043 -0
- Cython/Utility/FusedFunction.pyx +44 -0
- Cython/Utility/ImportExport.c +907 -0
- Cython/Utility/MemoryView.pxd +188 -0
- Cython/Utility/MemoryView.pyx +1482 -0
- Cython/Utility/MemoryView_C.c +927 -0
- Cython/Utility/ModuleSetupCode.c +3203 -0
- Cython/Utility/NumpyImportArray.c +46 -0
- Cython/Utility/ObjectHandling.c +3273 -0
- Cython/Utility/Optimize.c +1603 -0
- Cython/Utility/Overflow.c +384 -0
- Cython/Utility/Printing.c +86 -0
- Cython/Utility/Profile.c +732 -0
- Cython/Utility/StringTools.c +1379 -0
- Cython/Utility/Synchronization.c +399 -0
- Cython/Utility/TString.c +356 -0
- Cython/Utility/TestCyUtilityLoader.pyx +8 -0
- Cython/Utility/TestCythonScope.pyx +75 -0
- Cython/Utility/TestUtilityLoader.c +12 -0
- Cython/Utility/TypeConversion.c +1385 -0
- Cython/Utility/UFuncs.pyx +50 -0
- Cython/Utility/UFuncs_C.c +89 -0
- Cython/Utility/__init__.py +28 -0
- Cython/Utility/arrayarray.h +167 -0
- Cython/Utils.py +687 -0
- Cython/Utils.pyd +0 -0
- Cython/__init__.py +10 -0
- Cython/__init__.pyi +7 -0
- Cython/py.typed +0 -0
- cython-3.2.0.dist-info/METADATA +85 -0
- cython-3.2.0.dist-info/RECORD +333 -0
- cython-3.2.0.dist-info/WHEEL +5 -0
- cython-3.2.0.dist-info/entry_points.txt +4 -0
- cython-3.2.0.dist-info/top_level.txt +3 -0
- cython.py +29 -0
- pyximport/__init__.py +4 -0
- pyximport/pyxbuild.py +160 -0
- pyximport/pyximport.py +482 -0
Cython/Plex/Regexps.py
ADDED
|
@@ -0,0 +1,535 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Python Lexical Analyser
|
|
3
|
+
|
|
4
|
+
Regular Expressions
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import types
|
|
8
|
+
|
|
9
|
+
from . import Errors
|
|
10
|
+
|
|
11
|
+
maxint = 2**31-1 # sentinel value
|
|
12
|
+
|
|
13
|
+
#
|
|
14
|
+
# Constants
|
|
15
|
+
#
|
|
16
|
+
|
|
17
|
+
BOL = 'bol'
|
|
18
|
+
EOL = 'eol'
|
|
19
|
+
EOF = 'eof'
|
|
20
|
+
|
|
21
|
+
nl_code = ord('\n')
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
#
|
|
25
|
+
# Helper functions
|
|
26
|
+
#
|
|
27
|
+
|
|
28
|
+
def chars_to_ranges(s):
|
|
29
|
+
"""
|
|
30
|
+
Return a list of character codes consisting of pairs
|
|
31
|
+
[code1a, code1b, code2a, code2b,...] which cover all
|
|
32
|
+
the characters in |s|.
|
|
33
|
+
"""
|
|
34
|
+
char_list = list(s)
|
|
35
|
+
char_list.sort()
|
|
36
|
+
i = 0
|
|
37
|
+
n = len(char_list)
|
|
38
|
+
result = []
|
|
39
|
+
while i < n:
|
|
40
|
+
code1 = ord(char_list[i])
|
|
41
|
+
code2 = code1 + 1
|
|
42
|
+
i += 1
|
|
43
|
+
while i < n and code2 >= ord(char_list[i]):
|
|
44
|
+
code2 += 1
|
|
45
|
+
i += 1
|
|
46
|
+
result.append(code1)
|
|
47
|
+
result.append(code2)
|
|
48
|
+
return result
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def uppercase_range(code1, code2):
|
|
52
|
+
"""
|
|
53
|
+
If the range of characters from code1 to code2-1 includes any
|
|
54
|
+
lower case letters, return the corresponding upper case range.
|
|
55
|
+
"""
|
|
56
|
+
code3 = max(code1, ord('a'))
|
|
57
|
+
code4 = min(code2, ord('z') + 1)
|
|
58
|
+
if code3 < code4:
|
|
59
|
+
d = ord('A') - ord('a')
|
|
60
|
+
return (code3 + d, code4 + d)
|
|
61
|
+
else:
|
|
62
|
+
return None
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def lowercase_range(code1, code2):
|
|
66
|
+
"""
|
|
67
|
+
If the range of characters from code1 to code2-1 includes any
|
|
68
|
+
upper case letters, return the corresponding lower case range.
|
|
69
|
+
"""
|
|
70
|
+
code3 = max(code1, ord('A'))
|
|
71
|
+
code4 = min(code2, ord('Z') + 1)
|
|
72
|
+
if code3 < code4:
|
|
73
|
+
d = ord('a') - ord('A')
|
|
74
|
+
return (code3 + d, code4 + d)
|
|
75
|
+
else:
|
|
76
|
+
return None
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def CodeRanges(code_list):
|
|
80
|
+
"""
|
|
81
|
+
Given a list of codes as returned by chars_to_ranges, return
|
|
82
|
+
an RE which will match a character in any of the ranges.
|
|
83
|
+
"""
|
|
84
|
+
re_list = [CodeRange(code_list[i], code_list[i + 1]) for i in range(0, len(code_list), 2)]
|
|
85
|
+
return Alt(*re_list)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def CodeRange(code1, code2):
|
|
89
|
+
"""
|
|
90
|
+
CodeRange(code1, code2) is an RE which matches any character
|
|
91
|
+
with a code |c| in the range |code1| <= |c| < |code2|.
|
|
92
|
+
"""
|
|
93
|
+
if code1 <= nl_code < code2:
|
|
94
|
+
return Alt(RawCodeRange(code1, nl_code),
|
|
95
|
+
RawNewline,
|
|
96
|
+
RawCodeRange(nl_code + 1, code2))
|
|
97
|
+
else:
|
|
98
|
+
return RawCodeRange(code1, code2)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
#
|
|
102
|
+
# Abstract classes
|
|
103
|
+
#
|
|
104
|
+
|
|
105
|
+
class RE:
|
|
106
|
+
"""RE is the base class for regular expression constructors.
|
|
107
|
+
The following operators are defined on REs:
|
|
108
|
+
|
|
109
|
+
re1 + re2 is an RE which matches |re1| followed by |re2|
|
|
110
|
+
re1 | re2 is an RE which matches either |re1| or |re2|
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
nullable = 1 # True if this RE can match 0 input symbols
|
|
114
|
+
match_nl = 1 # True if this RE can match a string ending with '\n'
|
|
115
|
+
str = None # Set to a string to override the class's __str__ result
|
|
116
|
+
|
|
117
|
+
def build_machine(self, machine, initial_state, final_state,
|
|
118
|
+
match_bol, nocase):
|
|
119
|
+
"""
|
|
120
|
+
This method should add states to |machine| to implement this
|
|
121
|
+
RE, starting at |initial_state| and ending at |final_state|.
|
|
122
|
+
If |match_bol| is true, the RE must be able to match at the
|
|
123
|
+
beginning of a line. If nocase is true, upper and lower case
|
|
124
|
+
letters should be treated as equivalent.
|
|
125
|
+
"""
|
|
126
|
+
raise NotImplementedError("%s.build_machine not implemented" %
|
|
127
|
+
self.__class__.__name__)
|
|
128
|
+
|
|
129
|
+
def build_opt(self, m, initial_state, c):
|
|
130
|
+
"""
|
|
131
|
+
Given a state |s| of machine |m|, return a new state
|
|
132
|
+
reachable from |s| on character |c| or epsilon.
|
|
133
|
+
"""
|
|
134
|
+
s = m.new_state()
|
|
135
|
+
initial_state.link_to(s)
|
|
136
|
+
initial_state.add_transition(c, s)
|
|
137
|
+
return s
|
|
138
|
+
|
|
139
|
+
def __add__(self, other):
|
|
140
|
+
return Seq(self, other)
|
|
141
|
+
|
|
142
|
+
def __or__(self, other):
|
|
143
|
+
return Alt(self, other)
|
|
144
|
+
|
|
145
|
+
def __str__(self):
|
|
146
|
+
if self.str:
|
|
147
|
+
return self.str
|
|
148
|
+
else:
|
|
149
|
+
return self.calc_str()
|
|
150
|
+
|
|
151
|
+
def check_re(self, num, value):
|
|
152
|
+
if not isinstance(value, RE):
|
|
153
|
+
self.wrong_type(num, value, "Plex.RE instance")
|
|
154
|
+
|
|
155
|
+
def check_string(self, num, value):
|
|
156
|
+
if type(value) is not str:
|
|
157
|
+
self.wrong_type(num, value, "string")
|
|
158
|
+
|
|
159
|
+
def check_char(self, num, value):
|
|
160
|
+
self.check_string(num, value)
|
|
161
|
+
if len(value) != 1:
|
|
162
|
+
raise Errors.PlexValueError("Invalid value for argument %d of Plex.%s."
|
|
163
|
+
"Expected a string of length 1, got: %s" % (
|
|
164
|
+
num, self.__class__.__name__, repr(value)))
|
|
165
|
+
|
|
166
|
+
def wrong_type(self, num, value, expected):
|
|
167
|
+
raise Errors.PlexTypeError(
|
|
168
|
+
f"Invalid type for argument {num:d} of {self.__class__.__qualname__} "
|
|
169
|
+
f"(expected {expected}, got {type(value).__name__}"
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
#
|
|
173
|
+
# Primitive RE constructors
|
|
174
|
+
# -------------------------
|
|
175
|
+
#
|
|
176
|
+
# These are the basic REs from which all others are built.
|
|
177
|
+
#
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def Char(c):
|
|
181
|
+
"""
|
|
182
|
+
Char(c) is an RE which matches the character |c|.
|
|
183
|
+
"""
|
|
184
|
+
if len(c) == 1:
|
|
185
|
+
result = CodeRange(ord(c), ord(c) + 1)
|
|
186
|
+
else:
|
|
187
|
+
result = SpecialSymbol(c)
|
|
188
|
+
result.str = "Char(%s)" % repr(c)
|
|
189
|
+
return result
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
class RawCodeRange(RE):
|
|
193
|
+
"""
|
|
194
|
+
RawCodeRange(code1, code2) is a low-level RE which matches any character
|
|
195
|
+
with a code |c| in the range |code1| <= |c| < |code2|, where the range
|
|
196
|
+
does not include newline. For internal use only.
|
|
197
|
+
"""
|
|
198
|
+
nullable = 0
|
|
199
|
+
match_nl = 0
|
|
200
|
+
range = None # (code, code)
|
|
201
|
+
uppercase_range = None # (code, code) or None
|
|
202
|
+
lowercase_range = None # (code, code) or None
|
|
203
|
+
|
|
204
|
+
def __init__(self, code1, code2):
|
|
205
|
+
self.range = (code1, code2)
|
|
206
|
+
self.uppercase_range = uppercase_range(code1, code2)
|
|
207
|
+
self.lowercase_range = lowercase_range(code1, code2)
|
|
208
|
+
|
|
209
|
+
def build_machine(self, m, initial_state, final_state, match_bol, nocase):
|
|
210
|
+
if match_bol:
|
|
211
|
+
initial_state = self.build_opt(m, initial_state, BOL)
|
|
212
|
+
initial_state.add_transition(self.range, final_state)
|
|
213
|
+
if nocase:
|
|
214
|
+
if self.uppercase_range:
|
|
215
|
+
initial_state.add_transition(self.uppercase_range, final_state)
|
|
216
|
+
if self.lowercase_range:
|
|
217
|
+
initial_state.add_transition(self.lowercase_range, final_state)
|
|
218
|
+
|
|
219
|
+
def calc_str(self):
|
|
220
|
+
return "CodeRange(%d,%d)" % (self.code1, self.code2)
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
class _RawNewline(RE):
|
|
224
|
+
"""
|
|
225
|
+
RawNewline is a low-level RE which matches a newline character.
|
|
226
|
+
For internal use only.
|
|
227
|
+
"""
|
|
228
|
+
nullable = 0
|
|
229
|
+
match_nl = 1
|
|
230
|
+
|
|
231
|
+
def build_machine(self, m, initial_state, final_state, match_bol, nocase):
|
|
232
|
+
if match_bol:
|
|
233
|
+
initial_state = self.build_opt(m, initial_state, BOL)
|
|
234
|
+
s = self.build_opt(m, initial_state, EOL)
|
|
235
|
+
s.add_transition((nl_code, nl_code + 1), final_state)
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
RawNewline = _RawNewline()
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
class SpecialSymbol(RE):
|
|
242
|
+
"""
|
|
243
|
+
SpecialSymbol(sym) is an RE which matches the special input
|
|
244
|
+
symbol |sym|, which is one of BOL, EOL or EOF.
|
|
245
|
+
"""
|
|
246
|
+
nullable = 0
|
|
247
|
+
match_nl = 0
|
|
248
|
+
sym = None
|
|
249
|
+
|
|
250
|
+
def __init__(self, sym):
|
|
251
|
+
self.sym = sym
|
|
252
|
+
|
|
253
|
+
def build_machine(self, m, initial_state, final_state, match_bol, nocase):
|
|
254
|
+
# Sequences 'bol bol' and 'bol eof' are impossible, so only need
|
|
255
|
+
# to allow for bol if sym is eol
|
|
256
|
+
if match_bol and self.sym == EOL:
|
|
257
|
+
initial_state = self.build_opt(m, initial_state, BOL)
|
|
258
|
+
initial_state.add_transition(self.sym, final_state)
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
class Seq(RE):
|
|
262
|
+
"""Seq(re1, re2, re3...) is an RE which matches |re1| followed by
|
|
263
|
+
|re2| followed by |re3|..."""
|
|
264
|
+
|
|
265
|
+
def __init__(self, *re_list):
|
|
266
|
+
nullable = 1
|
|
267
|
+
for i, re in enumerate(re_list):
|
|
268
|
+
self.check_re(i, re)
|
|
269
|
+
nullable = nullable and re.nullable
|
|
270
|
+
self.re_list = re_list
|
|
271
|
+
self.nullable = nullable
|
|
272
|
+
i = len(re_list)
|
|
273
|
+
match_nl = 0
|
|
274
|
+
while i:
|
|
275
|
+
i -= 1
|
|
276
|
+
re = re_list[i]
|
|
277
|
+
if re.match_nl:
|
|
278
|
+
match_nl = 1
|
|
279
|
+
break
|
|
280
|
+
if not re.nullable:
|
|
281
|
+
break
|
|
282
|
+
self.match_nl = match_nl
|
|
283
|
+
|
|
284
|
+
def build_machine(self, m, initial_state, final_state, match_bol, nocase):
|
|
285
|
+
re_list = self.re_list
|
|
286
|
+
if len(re_list) == 0:
|
|
287
|
+
initial_state.link_to(final_state)
|
|
288
|
+
else:
|
|
289
|
+
s1 = initial_state
|
|
290
|
+
n = len(re_list)
|
|
291
|
+
for i, re in enumerate(re_list):
|
|
292
|
+
if i < n - 1:
|
|
293
|
+
s2 = m.new_state()
|
|
294
|
+
else:
|
|
295
|
+
s2 = final_state
|
|
296
|
+
re.build_machine(m, s1, s2, match_bol, nocase)
|
|
297
|
+
s1 = s2
|
|
298
|
+
match_bol = re.match_nl or (match_bol and re.nullable)
|
|
299
|
+
|
|
300
|
+
def calc_str(self):
|
|
301
|
+
return "Seq(%s)" % ','.join(map(str, self.re_list))
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
class Alt(RE):
|
|
305
|
+
"""Alt(re1, re2, re3...) is an RE which matches either |re1| or
|
|
306
|
+
|re2| or |re3|..."""
|
|
307
|
+
|
|
308
|
+
def __init__(self, *re_list):
|
|
309
|
+
self.re_list = re_list
|
|
310
|
+
nullable = 0
|
|
311
|
+
match_nl = 0
|
|
312
|
+
nullable_res = []
|
|
313
|
+
non_nullable_res = []
|
|
314
|
+
i = 1
|
|
315
|
+
for re in re_list:
|
|
316
|
+
self.check_re(i, re)
|
|
317
|
+
if re.nullable:
|
|
318
|
+
nullable_res.append(re)
|
|
319
|
+
nullable = 1
|
|
320
|
+
else:
|
|
321
|
+
non_nullable_res.append(re)
|
|
322
|
+
if re.match_nl:
|
|
323
|
+
match_nl = 1
|
|
324
|
+
i += 1
|
|
325
|
+
self.nullable_res = nullable_res
|
|
326
|
+
self.non_nullable_res = non_nullable_res
|
|
327
|
+
self.nullable = nullable
|
|
328
|
+
self.match_nl = match_nl
|
|
329
|
+
|
|
330
|
+
def build_machine(self, m, initial_state, final_state, match_bol, nocase):
|
|
331
|
+
for re in self.nullable_res:
|
|
332
|
+
re.build_machine(m, initial_state, final_state, match_bol, nocase)
|
|
333
|
+
if self.non_nullable_res:
|
|
334
|
+
if match_bol:
|
|
335
|
+
initial_state = self.build_opt(m, initial_state, BOL)
|
|
336
|
+
for re in self.non_nullable_res:
|
|
337
|
+
re.build_machine(m, initial_state, final_state, 0, nocase)
|
|
338
|
+
|
|
339
|
+
def calc_str(self):
|
|
340
|
+
return "Alt(%s)" % ','.join(map(str, self.re_list))
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
class Rep1(RE):
|
|
344
|
+
"""Rep1(re) is an RE which matches one or more repetitions of |re|."""
|
|
345
|
+
|
|
346
|
+
def __init__(self, re):
|
|
347
|
+
self.check_re(1, re)
|
|
348
|
+
self.re = re
|
|
349
|
+
self.nullable = re.nullable
|
|
350
|
+
self.match_nl = re.match_nl
|
|
351
|
+
|
|
352
|
+
def build_machine(self, m, initial_state, final_state, match_bol, nocase):
|
|
353
|
+
s1 = m.new_state()
|
|
354
|
+
s2 = m.new_state()
|
|
355
|
+
initial_state.link_to(s1)
|
|
356
|
+
self.re.build_machine(m, s1, s2, match_bol or self.re.match_nl, nocase)
|
|
357
|
+
s2.link_to(s1)
|
|
358
|
+
s2.link_to(final_state)
|
|
359
|
+
|
|
360
|
+
def calc_str(self):
|
|
361
|
+
return "Rep1(%s)" % self.re
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
class SwitchCase(RE):
|
|
365
|
+
"""
|
|
366
|
+
SwitchCase(re, nocase) is an RE which matches the same strings as RE,
|
|
367
|
+
but treating upper and lower case letters according to |nocase|. If
|
|
368
|
+
|nocase| is true, case is ignored, otherwise it is not.
|
|
369
|
+
"""
|
|
370
|
+
re = None
|
|
371
|
+
nocase = None
|
|
372
|
+
|
|
373
|
+
def __init__(self, re, nocase):
|
|
374
|
+
self.re = re
|
|
375
|
+
self.nocase = nocase
|
|
376
|
+
self.nullable = re.nullable
|
|
377
|
+
self.match_nl = re.match_nl
|
|
378
|
+
|
|
379
|
+
def build_machine(self, m, initial_state, final_state, match_bol, nocase):
|
|
380
|
+
self.re.build_machine(m, initial_state, final_state, match_bol,
|
|
381
|
+
self.nocase)
|
|
382
|
+
|
|
383
|
+
def calc_str(self):
|
|
384
|
+
if self.nocase:
|
|
385
|
+
name = "NoCase"
|
|
386
|
+
else:
|
|
387
|
+
name = "Case"
|
|
388
|
+
return "%s(%s)" % (name, self.re)
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
#
|
|
392
|
+
# Composite RE constructors
|
|
393
|
+
# -------------------------
|
|
394
|
+
#
|
|
395
|
+
# These REs are defined in terms of the primitive REs.
|
|
396
|
+
#
|
|
397
|
+
|
|
398
|
+
Empty = Seq()
|
|
399
|
+
Empty.__doc__ = \
|
|
400
|
+
"""
|
|
401
|
+
Empty is an RE which matches the empty string.
|
|
402
|
+
"""
|
|
403
|
+
Empty.str = "Empty"
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
def Str1(s):
|
|
407
|
+
"""
|
|
408
|
+
Str1(s) is an RE which matches the literal string |s|.
|
|
409
|
+
"""
|
|
410
|
+
result = Seq(*tuple(map(Char, s)))
|
|
411
|
+
result.str = "Str(%s)" % repr(s)
|
|
412
|
+
return result
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
def Str(*strs):
|
|
416
|
+
"""
|
|
417
|
+
Str(s) is an RE which matches the literal string |s|.
|
|
418
|
+
Str(s1, s2, s3, ...) is an RE which matches any of |s1| or |s2| or |s3|...
|
|
419
|
+
"""
|
|
420
|
+
if len(strs) == 1:
|
|
421
|
+
return Str1(strs[0])
|
|
422
|
+
else:
|
|
423
|
+
result = Alt(*tuple(map(Str1, strs)))
|
|
424
|
+
result.str = "Str(%s)" % ','.join(map(repr, strs))
|
|
425
|
+
return result
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
def Any(s):
|
|
429
|
+
"""
|
|
430
|
+
Any(s) is an RE which matches any character in the string |s|.
|
|
431
|
+
"""
|
|
432
|
+
result = CodeRanges(chars_to_ranges(s))
|
|
433
|
+
result.str = "Any(%s)" % repr(s)
|
|
434
|
+
return result
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
def AnyBut(s):
|
|
438
|
+
"""
|
|
439
|
+
AnyBut(s) is an RE which matches any character (including
|
|
440
|
+
newline) which is not in the string |s|.
|
|
441
|
+
"""
|
|
442
|
+
ranges = chars_to_ranges(s)
|
|
443
|
+
ranges.insert(0, -maxint)
|
|
444
|
+
ranges.append(maxint)
|
|
445
|
+
result = CodeRanges(ranges)
|
|
446
|
+
result.str = "AnyBut(%s)" % repr(s)
|
|
447
|
+
return result
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
AnyChar = AnyBut("")
|
|
451
|
+
AnyChar.__doc__ = \
|
|
452
|
+
"""
|
|
453
|
+
AnyChar is an RE which matches any single character (including a newline).
|
|
454
|
+
"""
|
|
455
|
+
AnyChar.str = "AnyChar"
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
def Range(s1, s2=None):
|
|
459
|
+
"""
|
|
460
|
+
Range(c1, c2) is an RE which matches any single character in the range
|
|
461
|
+
|c1| to |c2| inclusive.
|
|
462
|
+
Range(s) where |s| is a string of even length is an RE which matches
|
|
463
|
+
any single character in the ranges |s[0]| to |s[1]|, |s[2]| to |s[3]|,...
|
|
464
|
+
"""
|
|
465
|
+
if s2:
|
|
466
|
+
result = CodeRange(ord(s1), ord(s2) + 1)
|
|
467
|
+
result.str = "Range(%s,%s)" % (s1, s2)
|
|
468
|
+
else:
|
|
469
|
+
ranges = []
|
|
470
|
+
for i in range(0, len(s1), 2):
|
|
471
|
+
ranges.append(CodeRange(ord(s1[i]), ord(s1[i + 1]) + 1))
|
|
472
|
+
result = Alt(*ranges)
|
|
473
|
+
result.str = "Range(%s)" % repr(s1)
|
|
474
|
+
return result
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
def Opt(re):
|
|
478
|
+
"""
|
|
479
|
+
Opt(re) is an RE which matches either |re| or the empty string.
|
|
480
|
+
"""
|
|
481
|
+
result = Alt(re, Empty)
|
|
482
|
+
result.str = "Opt(%s)" % re
|
|
483
|
+
return result
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
def Rep(re):
|
|
487
|
+
"""
|
|
488
|
+
Rep(re) is an RE which matches zero or more repetitions of |re|.
|
|
489
|
+
"""
|
|
490
|
+
result = Opt(Rep1(re))
|
|
491
|
+
result.str = "Rep(%s)" % re
|
|
492
|
+
return result
|
|
493
|
+
|
|
494
|
+
|
|
495
|
+
def NoCase(re):
|
|
496
|
+
"""
|
|
497
|
+
NoCase(re) is an RE which matches the same strings as RE, but treating
|
|
498
|
+
upper and lower case letters as equivalent.
|
|
499
|
+
"""
|
|
500
|
+
return SwitchCase(re, nocase=1)
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
def Case(re):
|
|
504
|
+
"""
|
|
505
|
+
Case(re) is an RE which matches the same strings as RE, but treating
|
|
506
|
+
upper and lower case letters as distinct, i.e. it cancels the effect
|
|
507
|
+
of any enclosing NoCase().
|
|
508
|
+
"""
|
|
509
|
+
return SwitchCase(re, nocase=0)
|
|
510
|
+
|
|
511
|
+
|
|
512
|
+
#
|
|
513
|
+
# RE Constants
|
|
514
|
+
#
|
|
515
|
+
|
|
516
|
+
Bol = Char(BOL)
|
|
517
|
+
Bol.__doc__ = \
|
|
518
|
+
"""
|
|
519
|
+
Bol is an RE which matches the beginning of a line.
|
|
520
|
+
"""
|
|
521
|
+
Bol.str = "Bol"
|
|
522
|
+
|
|
523
|
+
Eol = Char(EOL)
|
|
524
|
+
Eol.__doc__ = \
|
|
525
|
+
"""
|
|
526
|
+
Eol is an RE which matches the end of a line.
|
|
527
|
+
"""
|
|
528
|
+
Eol.str = "Eol"
|
|
529
|
+
|
|
530
|
+
Eof = Char(EOF)
|
|
531
|
+
Eof.__doc__ = \
|
|
532
|
+
"""
|
|
533
|
+
Eof is an RE which matches the end of the file.
|
|
534
|
+
"""
|
|
535
|
+
Eof.str = "Eof"
|
Cython/Plex/Scanners.pxd
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from __future__ import absolute_import
|
|
2
|
+
|
|
3
|
+
import cython
|
|
4
|
+
|
|
5
|
+
from Cython.Plex.Actions cimport Action
|
|
6
|
+
|
|
7
|
+
cdef class Scanner:
|
|
8
|
+
|
|
9
|
+
cdef public lexicon
|
|
10
|
+
cdef public stream
|
|
11
|
+
cdef public name
|
|
12
|
+
cdef public unicode buffer
|
|
13
|
+
cdef public Py_ssize_t buf_start_pos
|
|
14
|
+
cdef public Py_ssize_t next_pos
|
|
15
|
+
cdef public Py_ssize_t cur_pos
|
|
16
|
+
cdef public Py_ssize_t cur_line
|
|
17
|
+
cdef public Py_ssize_t cur_line_start
|
|
18
|
+
cdef public Py_ssize_t start_pos
|
|
19
|
+
cdef tuple current_scanner_position_tuple
|
|
20
|
+
cdef public tuple last_token_position_tuple
|
|
21
|
+
cdef public str text
|
|
22
|
+
cdef public initial_state # int?
|
|
23
|
+
cdef public state_name
|
|
24
|
+
cdef public list queue
|
|
25
|
+
cdef public bint trace
|
|
26
|
+
cdef public cur_char
|
|
27
|
+
cdef public long input_state
|
|
28
|
+
|
|
29
|
+
cdef public level
|
|
30
|
+
|
|
31
|
+
@cython.locals(action=Action)
|
|
32
|
+
cpdef tuple read(self)
|
|
33
|
+
cdef inline unread(self, token, value, position)
|
|
34
|
+
cdef inline get_current_scan_pos(self)
|
|
35
|
+
cdef inline tuple scan_a_token(self)
|
|
36
|
+
|
|
37
|
+
# This could be @final and @cfunc, but that would hide it from Parsing.py
|
|
38
|
+
# unless that's compiled as well (which it isn't with "minimal" compilation).
|
|
39
|
+
#@cython.final
|
|
40
|
+
cpdef tuple position(self) # used frequently by Parsing.py
|
|
41
|
+
|
|
42
|
+
cdef run_machine_inlined(self)
|
|
43
|
+
|
|
44
|
+
cdef inline begin(self, state)
|
|
45
|
+
cdef inline produce(self, value, text = *)
|