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