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.
Files changed (333) hide show
  1. Cython/Build/BuildExecutable.py +169 -0
  2. Cython/Build/Cache.py +199 -0
  3. Cython/Build/Cythonize.py +350 -0
  4. Cython/Build/Dependencies.py +1314 -0
  5. Cython/Build/Distutils.py +1 -0
  6. Cython/Build/Inline.py +463 -0
  7. Cython/Build/IpythonMagic.py +560 -0
  8. Cython/Build/SharedModule.py +94 -0
  9. Cython/Build/Tests/TestCyCache.py +194 -0
  10. Cython/Build/Tests/TestCythonizeArgsParser.py +481 -0
  11. Cython/Build/Tests/TestDependencies.py +133 -0
  12. Cython/Build/Tests/TestInline.py +177 -0
  13. Cython/Build/Tests/TestIpythonMagic.py +287 -0
  14. Cython/Build/Tests/TestRecythonize.py +212 -0
  15. Cython/Build/Tests/TestStripLiterals.py +155 -0
  16. Cython/Build/Tests/__init__.py +1 -0
  17. Cython/Build/__init__.py +11 -0
  18. Cython/CodeWriter.py +815 -0
  19. Cython/Compiler/AnalysedTreeTransforms.py +97 -0
  20. Cython/Compiler/Annotate.py +328 -0
  21. Cython/Compiler/AutoDocTransforms.py +320 -0
  22. Cython/Compiler/Buffer.py +680 -0
  23. Cython/Compiler/Builtin.py +984 -0
  24. Cython/Compiler/CmdLine.py +263 -0
  25. Cython/Compiler/Code.pxd +149 -0
  26. Cython/Compiler/Code.py +3746 -0
  27. Cython/Compiler/Code.pyd +0 -0
  28. Cython/Compiler/CodeGeneration.py +33 -0
  29. Cython/Compiler/CythonScope.py +191 -0
  30. Cython/Compiler/Dataclass.py +864 -0
  31. Cython/Compiler/DebugFlags.py +24 -0
  32. Cython/Compiler/Errors.py +297 -0
  33. Cython/Compiler/ExprNodes.py +15562 -0
  34. Cython/Compiler/FlowControl.pxd +97 -0
  35. Cython/Compiler/FlowControl.py +1451 -0
  36. Cython/Compiler/FlowControl.pyd +0 -0
  37. Cython/Compiler/FusedNode.py +971 -0
  38. Cython/Compiler/FusedNode.pyd +0 -0
  39. Cython/Compiler/Future.py +16 -0
  40. Cython/Compiler/Interpreter.py +57 -0
  41. Cython/Compiler/Lexicon.py +421 -0
  42. Cython/Compiler/LineTable.py +114 -0
  43. Cython/Compiler/LineTable.pyd +0 -0
  44. Cython/Compiler/Main.py +857 -0
  45. Cython/Compiler/MatchCaseNodes.py +259 -0
  46. Cython/Compiler/MemoryView.py +905 -0
  47. Cython/Compiler/ModuleNode.py +4235 -0
  48. Cython/Compiler/Naming.py +363 -0
  49. Cython/Compiler/Nodes.py +10831 -0
  50. Cython/Compiler/Optimize.py +5288 -0
  51. Cython/Compiler/Options.py +843 -0
  52. Cython/Compiler/ParseTreeTransforms.pxd +78 -0
  53. Cython/Compiler/ParseTreeTransforms.py +4638 -0
  54. Cython/Compiler/Parsing.pxd +9 -0
  55. Cython/Compiler/Parsing.py +4775 -0
  56. Cython/Compiler/Parsing.pyd +0 -0
  57. Cython/Compiler/Pipeline.py +439 -0
  58. Cython/Compiler/PyrexTypes.py +5870 -0
  59. Cython/Compiler/Pythran.py +232 -0
  60. Cython/Compiler/Scanning.pxd +48 -0
  61. Cython/Compiler/Scanning.py +701 -0
  62. Cython/Compiler/Scanning.pyd +0 -0
  63. Cython/Compiler/StringEncoding.py +298 -0
  64. Cython/Compiler/Symtab.py +3073 -0
  65. Cython/Compiler/Tests/TestBuffer.py +105 -0
  66. Cython/Compiler/Tests/TestBuiltin.py +72 -0
  67. Cython/Compiler/Tests/TestCmdLine.py +586 -0
  68. Cython/Compiler/Tests/TestCode.py +144 -0
  69. Cython/Compiler/Tests/TestFlowControl.py +65 -0
  70. Cython/Compiler/Tests/TestGrammar.py +202 -0
  71. Cython/Compiler/Tests/TestMemView.py +71 -0
  72. Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
  73. Cython/Compiler/Tests/TestScanning.py +134 -0
  74. Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
  75. Cython/Compiler/Tests/TestStringEncoding.py +21 -0
  76. Cython/Compiler/Tests/TestTreeFragment.py +63 -0
  77. Cython/Compiler/Tests/TestTreePath.py +103 -0
  78. Cython/Compiler/Tests/TestTypes.py +75 -0
  79. Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
  80. Cython/Compiler/Tests/TestVisitor.py +61 -0
  81. Cython/Compiler/Tests/Utils.py +36 -0
  82. Cython/Compiler/Tests/__init__.py +1 -0
  83. Cython/Compiler/TreeFragment.py +278 -0
  84. Cython/Compiler/TreePath.py +303 -0
  85. Cython/Compiler/TypeInference.py +591 -0
  86. Cython/Compiler/TypeSlots.py +1174 -0
  87. Cython/Compiler/UFuncs.py +311 -0
  88. Cython/Compiler/UtilNodes.py +389 -0
  89. Cython/Compiler/UtilityCode.py +344 -0
  90. Cython/Compiler/Version.py +8 -0
  91. Cython/Compiler/Visitor.pxd +53 -0
  92. Cython/Compiler/Visitor.py +861 -0
  93. Cython/Compiler/Visitor.pyd +0 -0
  94. Cython/Compiler/__init__.py +1 -0
  95. Cython/Coverage.py +448 -0
  96. Cython/Debugger/Cygdb.py +177 -0
  97. Cython/Debugger/DebugWriter.py +82 -0
  98. Cython/Debugger/Tests/TestLibCython.py +275 -0
  99. Cython/Debugger/Tests/__init__.py +1 -0
  100. Cython/Debugger/Tests/cfuncs.c +8 -0
  101. Cython/Debugger/Tests/codefile +49 -0
  102. Cython/Debugger/Tests/test_libcython_in_gdb.py +578 -0
  103. Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
  104. Cython/Debugger/__init__.py +1 -0
  105. Cython/Debugger/libcython.py +1548 -0
  106. Cython/Debugger/libpython.py +2821 -0
  107. Cython/Debugging.py +20 -0
  108. Cython/Distutils/__init__.py +2 -0
  109. Cython/Distutils/build_ext.py +139 -0
  110. Cython/Distutils/extension.py +96 -0
  111. Cython/Distutils/old_build_ext.py +351 -0
  112. Cython/Includes/cpython/__init__.pxd +173 -0
  113. Cython/Includes/cpython/array.pxd +178 -0
  114. Cython/Includes/cpython/bool.pxd +37 -0
  115. Cython/Includes/cpython/buffer.pxd +112 -0
  116. Cython/Includes/cpython/bytearray.pxd +33 -0
  117. Cython/Includes/cpython/bytes.pxd +200 -0
  118. Cython/Includes/cpython/cellobject.pxd +35 -0
  119. Cython/Includes/cpython/ceval.pxd +8 -0
  120. Cython/Includes/cpython/codecs.pxd +121 -0
  121. Cython/Includes/cpython/complex.pxd +60 -0
  122. Cython/Includes/cpython/contextvars.pxd +145 -0
  123. Cython/Includes/cpython/conversion.pxd +36 -0
  124. Cython/Includes/cpython/datetime.pxd +395 -0
  125. Cython/Includes/cpython/descr.pxd +26 -0
  126. Cython/Includes/cpython/dict.pxd +187 -0
  127. Cython/Includes/cpython/exc.pxd +263 -0
  128. Cython/Includes/cpython/fileobject.pxd +57 -0
  129. Cython/Includes/cpython/float.pxd +47 -0
  130. Cython/Includes/cpython/function.pxd +65 -0
  131. Cython/Includes/cpython/genobject.pxd +25 -0
  132. Cython/Includes/cpython/getargs.pxd +12 -0
  133. Cython/Includes/cpython/instance.pxd +25 -0
  134. Cython/Includes/cpython/iterator.pxd +36 -0
  135. Cython/Includes/cpython/iterobject.pxd +24 -0
  136. Cython/Includes/cpython/list.pxd +92 -0
  137. Cython/Includes/cpython/long.pxd +149 -0
  138. Cython/Includes/cpython/longintrepr.pxd +14 -0
  139. Cython/Includes/cpython/mapping.pxd +63 -0
  140. Cython/Includes/cpython/marshal.pxd +66 -0
  141. Cython/Includes/cpython/mem.pxd +120 -0
  142. Cython/Includes/cpython/memoryview.pxd +50 -0
  143. Cython/Includes/cpython/method.pxd +49 -0
  144. Cython/Includes/cpython/module.pxd +208 -0
  145. Cython/Includes/cpython/number.pxd +258 -0
  146. Cython/Includes/cpython/object.pxd +433 -0
  147. Cython/Includes/cpython/pycapsule.pxd +143 -0
  148. Cython/Includes/cpython/pylifecycle.pxd +68 -0
  149. Cython/Includes/cpython/pyport.pxd +8 -0
  150. Cython/Includes/cpython/pystate.pxd +95 -0
  151. Cython/Includes/cpython/pythread.pxd +53 -0
  152. Cython/Includes/cpython/ref.pxd +141 -0
  153. Cython/Includes/cpython/sequence.pxd +134 -0
  154. Cython/Includes/cpython/set.pxd +119 -0
  155. Cython/Includes/cpython/slice.pxd +70 -0
  156. Cython/Includes/cpython/time.pxd +129 -0
  157. Cython/Includes/cpython/tuple.pxd +72 -0
  158. Cython/Includes/cpython/type.pxd +53 -0
  159. Cython/Includes/cpython/unicode.pxd +639 -0
  160. Cython/Includes/cpython/version.pxd +32 -0
  161. Cython/Includes/cpython/weakref.pxd +78 -0
  162. Cython/Includes/libc/__init__.pxd +1 -0
  163. Cython/Includes/libc/complex.pxd +35 -0
  164. Cython/Includes/libc/errno.pxd +127 -0
  165. Cython/Includes/libc/float.pxd +43 -0
  166. Cython/Includes/libc/limits.pxd +28 -0
  167. Cython/Includes/libc/locale.pxd +46 -0
  168. Cython/Includes/libc/math.pxd +209 -0
  169. Cython/Includes/libc/setjmp.pxd +10 -0
  170. Cython/Includes/libc/signal.pxd +64 -0
  171. Cython/Includes/libc/stddef.pxd +9 -0
  172. Cython/Includes/libc/stdint.pxd +105 -0
  173. Cython/Includes/libc/stdio.pxd +80 -0
  174. Cython/Includes/libc/stdlib.pxd +72 -0
  175. Cython/Includes/libc/string.pxd +50 -0
  176. Cython/Includes/libc/threads.pxd +234 -0
  177. Cython/Includes/libc/time.pxd +52 -0
  178. Cython/Includes/libcpp/__init__.pxd +4 -0
  179. Cython/Includes/libcpp/algorithm.pxd +320 -0
  180. Cython/Includes/libcpp/any.pxd +16 -0
  181. Cython/Includes/libcpp/atomic.pxd +59 -0
  182. Cython/Includes/libcpp/barrier.pxd +22 -0
  183. Cython/Includes/libcpp/bit.pxd +29 -0
  184. Cython/Includes/libcpp/cast.pxd +12 -0
  185. Cython/Includes/libcpp/cmath.pxd +518 -0
  186. Cython/Includes/libcpp/complex.pxd +106 -0
  187. Cython/Includes/libcpp/condition_variable.pxd +322 -0
  188. Cython/Includes/libcpp/deque.pxd +165 -0
  189. Cython/Includes/libcpp/exception.pxd +86 -0
  190. Cython/Includes/libcpp/execution.pxd +15 -0
  191. Cython/Includes/libcpp/forward_list.pxd +63 -0
  192. Cython/Includes/libcpp/functional.pxd +26 -0
  193. Cython/Includes/libcpp/future.pxd +103 -0
  194. Cython/Includes/libcpp/iterator.pxd +34 -0
  195. Cython/Includes/libcpp/latch.pxd +17 -0
  196. Cython/Includes/libcpp/limits.pxd +61 -0
  197. Cython/Includes/libcpp/list.pxd +117 -0
  198. Cython/Includes/libcpp/map.pxd +252 -0
  199. Cython/Includes/libcpp/memory.pxd +115 -0
  200. Cython/Includes/libcpp/mutex.pxd +387 -0
  201. Cython/Includes/libcpp/numbers.pxd +15 -0
  202. Cython/Includes/libcpp/numeric.pxd +131 -0
  203. Cython/Includes/libcpp/optional.pxd +34 -0
  204. Cython/Includes/libcpp/pair.pxd +1 -0
  205. Cython/Includes/libcpp/queue.pxd +25 -0
  206. Cython/Includes/libcpp/random.pxd +166 -0
  207. Cython/Includes/libcpp/semaphore.pxd +43 -0
  208. Cython/Includes/libcpp/set.pxd +228 -0
  209. Cython/Includes/libcpp/shared_mutex.pxd +96 -0
  210. Cython/Includes/libcpp/span.pxd +87 -0
  211. Cython/Includes/libcpp/stack.pxd +11 -0
  212. Cython/Includes/libcpp/stop_token.pxd +117 -0
  213. Cython/Includes/libcpp/string.pxd +355 -0
  214. Cython/Includes/libcpp/string_view.pxd +183 -0
  215. Cython/Includes/libcpp/typeindex.pxd +15 -0
  216. Cython/Includes/libcpp/typeinfo.pxd +10 -0
  217. Cython/Includes/libcpp/unordered_map.pxd +193 -0
  218. Cython/Includes/libcpp/unordered_set.pxd +152 -0
  219. Cython/Includes/libcpp/utility.pxd +30 -0
  220. Cython/Includes/libcpp/vector.pxd +186 -0
  221. Cython/Includes/numpy/math.pxd +150 -0
  222. Cython/Includes/openmp.pxd +50 -0
  223. Cython/Includes/posix/__init__.pxd +1 -0
  224. Cython/Includes/posix/dlfcn.pxd +14 -0
  225. Cython/Includes/posix/fcntl.pxd +86 -0
  226. Cython/Includes/posix/ioctl.pxd +4 -0
  227. Cython/Includes/posix/mman.pxd +101 -0
  228. Cython/Includes/posix/resource.pxd +57 -0
  229. Cython/Includes/posix/select.pxd +21 -0
  230. Cython/Includes/posix/signal.pxd +73 -0
  231. Cython/Includes/posix/stat.pxd +98 -0
  232. Cython/Includes/posix/stdio.pxd +37 -0
  233. Cython/Includes/posix/stdlib.pxd +29 -0
  234. Cython/Includes/posix/strings.pxd +9 -0
  235. Cython/Includes/posix/time.pxd +71 -0
  236. Cython/Includes/posix/types.pxd +30 -0
  237. Cython/Includes/posix/uio.pxd +26 -0
  238. Cython/Includes/posix/unistd.pxd +271 -0
  239. Cython/Includes/posix/wait.pxd +38 -0
  240. Cython/Plex/Actions.pxd +24 -0
  241. Cython/Plex/Actions.py +119 -0
  242. Cython/Plex/Actions.pyd +0 -0
  243. Cython/Plex/DFA.pxd +14 -0
  244. Cython/Plex/DFA.py +164 -0
  245. Cython/Plex/DFA.pyd +0 -0
  246. Cython/Plex/Errors.py +48 -0
  247. Cython/Plex/Lexicons.py +178 -0
  248. Cython/Plex/Machines.pxd +36 -0
  249. Cython/Plex/Machines.py +238 -0
  250. Cython/Plex/Machines.pyd +0 -0
  251. Cython/Plex/Regexps.py +535 -0
  252. Cython/Plex/Scanners.pxd +45 -0
  253. Cython/Plex/Scanners.py +328 -0
  254. Cython/Plex/Scanners.pyd +0 -0
  255. Cython/Plex/Transitions.pxd +14 -0
  256. Cython/Plex/Transitions.py +239 -0
  257. Cython/Plex/Transitions.pyd +0 -0
  258. Cython/Plex/__init__.py +34 -0
  259. Cython/Runtime/__init__.py +1 -0
  260. Cython/Runtime/refnanny.pyd +0 -0
  261. Cython/Runtime/refnanny.pyx +237 -0
  262. Cython/Shadow.py +690 -0
  263. Cython/Shadow.pyi +521 -0
  264. Cython/StringIOTree.py +170 -0
  265. Cython/StringIOTree.pyd +0 -0
  266. Cython/Tempita/__init__.py +4 -0
  267. Cython/Tempita/_looper.py +154 -0
  268. Cython/Tempita/_tempita.py +1091 -0
  269. Cython/Tempita/_tempita.pyd +0 -0
  270. Cython/TestUtils.py +422 -0
  271. Cython/Tests/TestCodeWriter.py +128 -0
  272. Cython/Tests/TestCythonUtils.py +202 -0
  273. Cython/Tests/TestJediTyper.py +223 -0
  274. Cython/Tests/TestShadow.py +114 -0
  275. Cython/Tests/TestStringIOTree.py +67 -0
  276. Cython/Tests/TestTestUtils.py +90 -0
  277. Cython/Tests/__init__.py +1 -0
  278. Cython/Tests/xmlrunner.py +390 -0
  279. Cython/Utility/AsyncGen.c +1031 -0
  280. Cython/Utility/Buffer.c +865 -0
  281. Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
  282. Cython/Utility/Builtins.c +810 -0
  283. Cython/Utility/CConvert.pyx +134 -0
  284. Cython/Utility/CMath.c +104 -0
  285. Cython/Utility/CommonStructures.c +226 -0
  286. Cython/Utility/Complex.c +378 -0
  287. Cython/Utility/Coroutine.c +2300 -0
  288. Cython/Utility/CpdefEnums.pyx +103 -0
  289. Cython/Utility/CppConvert.pyx +282 -0
  290. Cython/Utility/CppSupport.cpp +151 -0
  291. Cython/Utility/CythonFunction.c +1832 -0
  292. Cython/Utility/Dataclasses.c +101 -0
  293. Cython/Utility/Embed.c +121 -0
  294. Cython/Utility/Exceptions.c +1016 -0
  295. Cython/Utility/ExtensionTypes.c +996 -0
  296. Cython/Utility/FunctionArguments.c +1043 -0
  297. Cython/Utility/FusedFunction.pyx +44 -0
  298. Cython/Utility/ImportExport.c +907 -0
  299. Cython/Utility/MemoryView.pxd +188 -0
  300. Cython/Utility/MemoryView.pyx +1482 -0
  301. Cython/Utility/MemoryView_C.c +927 -0
  302. Cython/Utility/ModuleSetupCode.c +3203 -0
  303. Cython/Utility/NumpyImportArray.c +46 -0
  304. Cython/Utility/ObjectHandling.c +3273 -0
  305. Cython/Utility/Optimize.c +1603 -0
  306. Cython/Utility/Overflow.c +384 -0
  307. Cython/Utility/Printing.c +86 -0
  308. Cython/Utility/Profile.c +732 -0
  309. Cython/Utility/StringTools.c +1379 -0
  310. Cython/Utility/Synchronization.c +399 -0
  311. Cython/Utility/TString.c +356 -0
  312. Cython/Utility/TestCyUtilityLoader.pyx +8 -0
  313. Cython/Utility/TestCythonScope.pyx +75 -0
  314. Cython/Utility/TestUtilityLoader.c +12 -0
  315. Cython/Utility/TypeConversion.c +1385 -0
  316. Cython/Utility/UFuncs.pyx +50 -0
  317. Cython/Utility/UFuncs_C.c +89 -0
  318. Cython/Utility/__init__.py +28 -0
  319. Cython/Utility/arrayarray.h +167 -0
  320. Cython/Utils.py +687 -0
  321. Cython/Utils.pyd +0 -0
  322. Cython/__init__.py +10 -0
  323. Cython/__init__.pyi +7 -0
  324. Cython/py.typed +0 -0
  325. cython-3.2.0.dist-info/METADATA +85 -0
  326. cython-3.2.0.dist-info/RECORD +333 -0
  327. cython-3.2.0.dist-info/WHEEL +5 -0
  328. cython-3.2.0.dist-info/entry_points.txt +4 -0
  329. cython-3.2.0.dist-info/top_level.txt +3 -0
  330. cython.py +29 -0
  331. pyximport/__init__.py +4 -0
  332. pyximport/pyxbuild.py +160 -0
  333. 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"
@@ -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 = *)