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
@@ -0,0 +1,328 @@
1
+ """
2
+ Python Lexical Analyser
3
+
4
+ Scanning an input stream
5
+ """
6
+
7
+ import cython
8
+
9
+ cython.declare(BOL=object, EOL=object, EOF=object, NOT_FOUND=object) # noqa:E402
10
+
11
+ from . import Errors
12
+ from .Regexps import BOL, EOL, EOF
13
+
14
+ NOT_FOUND = object()
15
+
16
+
17
+ class Scanner:
18
+ """
19
+ A Scanner is used to read tokens from a stream of characters
20
+ using the token set specified by a Plex.Lexicon.
21
+
22
+ Constructor:
23
+
24
+ Scanner(lexicon, stream, name = '')
25
+
26
+ See the docstring of the __init__ method for details.
27
+
28
+ Methods:
29
+
30
+ See the docstrings of the individual methods for more
31
+ information.
32
+
33
+ read() --> (value, text)
34
+ Reads the next lexical token from the stream.
35
+
36
+ position() --> (name, line, col)
37
+ Returns the position of the last token read using the
38
+ read() method.
39
+
40
+ begin(state_name)
41
+ Causes scanner to change state.
42
+
43
+ produce(value [, text])
44
+ Causes return of a token value to the caller of the
45
+ Scanner.
46
+
47
+ """
48
+
49
+ # lexicon = None # Lexicon
50
+ # stream = None # file-like object
51
+ # name = ''
52
+ # buffer = ''
53
+ #
54
+ # These positions are used by the scanner to track its internal state:
55
+ # buf_start_pos = 0 # position in input of start of buffer
56
+ # next_pos = 0 # position in input of next char to read
57
+ # cur_pos = 0 # position in input of current char
58
+ # cur_line = 1 # line number of current char
59
+ # cur_line_start = 0 # position in input of start of current line
60
+ # start_pos = 0 # position in input of start of token
61
+ # current_scanner_position_tuple = ("", 0, 0)
62
+ # tuple of filename, line number and position in line, really mainly for error reporting
63
+ #
64
+ # These positions are used to track what was read from the queue
65
+ # (which may differ from the internal state when tokens are replaced onto the queue)
66
+ # last_token_position_tuple = ("", 0, 0) # tuple of filename, line number and position in line
67
+
68
+ # text = None # text of last token read
69
+ # initial_state = None # Node
70
+ # state_name = '' # Name of initial state
71
+ # queue = None # list of tokens and positions to be returned
72
+ # trace = 0
73
+
74
+ def __init__(self, lexicon, stream, name='', initial_pos=None):
75
+ """
76
+ Scanner(lexicon, stream, name = '')
77
+
78
+ |lexicon| is a Plex.Lexicon instance specifying the lexical tokens
79
+ to be recognised.
80
+
81
+ |stream| can be a file object or anything which implements a
82
+ compatible read() method.
83
+
84
+ |name| is optional, and may be the name of the file being
85
+ scanned or any other identifying string.
86
+ """
87
+ self.trace = 0
88
+
89
+ self.buffer = ''
90
+ self.buf_start_pos = 0
91
+ self.next_pos = 0
92
+ self.cur_pos = 0
93
+ self.cur_line = 1
94
+ self.start_pos = 0
95
+ self.current_scanner_position_tuple = ("", 0, 0)
96
+ self.last_token_position_tuple = ("", 0, 0)
97
+ self.text = None
98
+ self.state_name = None
99
+
100
+ self.lexicon = lexicon
101
+ self.stream = stream
102
+ self.name = name
103
+ self.queue = []
104
+ self.initial_state = None
105
+ self.begin('')
106
+ self.next_pos = 0
107
+ self.cur_pos = 0
108
+ self.cur_line_start = 0
109
+ self.cur_char = BOL
110
+ self.input_state = 1
111
+ if initial_pos is not None:
112
+ self.cur_line, self.cur_line_start = initial_pos[1], -initial_pos[2]
113
+
114
+ def read(self):
115
+ """
116
+ Read the next lexical token from the stream and return a
117
+ tuple (value, text), where |value| is the value associated with
118
+ the token as specified by the Lexicon, and |text| is the actual
119
+ string read from the stream. Returns (None, '') on end of file.
120
+ """
121
+ queue = self.queue
122
+ while not queue:
123
+ self.text, action = self.scan_a_token()
124
+ if action is None:
125
+ self.produce(None)
126
+ self.eof()
127
+ else:
128
+ value = action.perform(self, self.text)
129
+ if value is not None:
130
+ self.produce(value)
131
+ result, self.last_token_position_tuple = queue[0]
132
+ del queue[0]
133
+ return result
134
+
135
+ def unread(self, token, value, position):
136
+ self.queue.insert(0, ((token, value), position))
137
+
138
+ def get_current_scan_pos(self):
139
+ # distinct from the position of the last token due to the queue
140
+ return self.current_scanner_position_tuple
141
+
142
+ def scan_a_token(self):
143
+ """
144
+ Read the next input sequence recognised by the machine
145
+ and return (text, action). Returns ('', None) on end of
146
+ file.
147
+ """
148
+ self.start_pos = self.cur_pos
149
+ self.current_scanner_position_tuple = (
150
+ self.name, self.cur_line, self.cur_pos - self.cur_line_start
151
+ )
152
+ action = self.run_machine_inlined()
153
+ if action is not None:
154
+ if self.trace:
155
+ print("Scanner: read: Performing %s %d:%d" % (
156
+ action, self.start_pos, self.cur_pos))
157
+ text = self.buffer[
158
+ self.start_pos - self.buf_start_pos:
159
+ self.cur_pos - self.buf_start_pos]
160
+ return (text, action)
161
+ else:
162
+ if self.cur_pos == self.start_pos:
163
+ if self.cur_char is None or self.cur_char is EOF:
164
+ return ('', None)
165
+ raise Errors.UnrecognizedInput(self, self.state_name)
166
+
167
+ @cython.final
168
+ def run_machine_inlined(self):
169
+ """
170
+ Inlined version of run_machine for speed.
171
+ """
172
+ state: dict = self.initial_state
173
+ cur_pos: cython.Py_ssize_t = self.cur_pos
174
+ cur_line: cython.Py_ssize_t = self.cur_line
175
+ cur_line_start: cython.Py_ssize_t = self.cur_line_start
176
+ cur_char = self.cur_char
177
+ input_state: cython.long = self.input_state
178
+ next_pos: cython.Py_ssize_t = self.next_pos
179
+ data: str
180
+ buffer: str = self.buffer
181
+ buf_start_pos: cython.Py_ssize_t = self.buf_start_pos
182
+ buf_len: cython.Py_ssize_t = len(buffer)
183
+ buf_index: cython.Py_ssize_t
184
+ discard: cython.Py_ssize_t
185
+
186
+ b_action, b_cur_pos, b_cur_line, b_cur_line_start, b_cur_char, b_input_state, b_next_pos = \
187
+ None, 0, 0, 0, '', 0, 0
188
+
189
+ trace: cython.bint = self.trace
190
+ while 1:
191
+ if trace:
192
+ print("State %d, %d/%d:%s -->" % (
193
+ state['number'], input_state, cur_pos, repr(cur_char)))
194
+
195
+ # Begin inlined self.save_for_backup()
196
+ action = state['action']
197
+ if action is not None:
198
+ b_action, b_cur_pos, b_cur_line, b_cur_line_start, b_cur_char, b_input_state, b_next_pos = \
199
+ action, cur_pos, cur_line, cur_line_start, cur_char, input_state, next_pos
200
+ # End inlined self.save_for_backup()
201
+
202
+ c = cur_char
203
+ new_state = state.get(c, NOT_FOUND)
204
+ if new_state is NOT_FOUND:
205
+ new_state = c and state.get('else')
206
+
207
+ if new_state:
208
+ if trace:
209
+ print("State %d" % new_state['number'])
210
+ state = new_state
211
+ # Begin inlined: self.next_char()
212
+ if input_state == 1:
213
+ cur_pos = next_pos
214
+ # Begin inlined: c = self.read_char()
215
+ buf_index = next_pos - buf_start_pos
216
+ if buf_index < buf_len:
217
+ c = buffer[buf_index]
218
+ next_pos += 1
219
+ else:
220
+ discard = self.start_pos - buf_start_pos
221
+ data = self.stream.read(0x1000)
222
+ buffer = self.buffer[discard:] + data
223
+ self.buffer = buffer
224
+ buf_start_pos += discard
225
+ self.buf_start_pos = buf_start_pos
226
+ buf_len = len(buffer)
227
+ buf_index -= discard
228
+ if data:
229
+ c = buffer[buf_index]
230
+ next_pos += 1
231
+ else:
232
+ c = ''
233
+ # End inlined: c = self.read_char()
234
+ if c == '\n':
235
+ cur_char = EOL
236
+ input_state = 2
237
+ elif not c:
238
+ cur_char = EOL
239
+ input_state = 4
240
+ else:
241
+ cur_char = c
242
+ elif input_state == 2: # after EoL (1) -> BoL (3)
243
+ cur_char = '\n'
244
+ input_state = 3
245
+ elif input_state == 3: # start new code line
246
+ cur_line += 1
247
+ cur_line_start = cur_pos = next_pos
248
+ cur_char = BOL
249
+ input_state = 1
250
+ elif input_state == 4: # after final line (1) -> EoF (5)
251
+ cur_char = EOF
252
+ input_state = 5
253
+ else: # input_state == 5 (EoF)
254
+ cur_char = ''
255
+ # End inlined self.next_char()
256
+ else: # not new_state
257
+ if trace:
258
+ print("blocked")
259
+ # Begin inlined: action = self.back_up()
260
+ if b_action is not None:
261
+ (action, cur_pos, cur_line, cur_line_start,
262
+ cur_char, input_state, next_pos) = \
263
+ (b_action, b_cur_pos, b_cur_line, b_cur_line_start,
264
+ b_cur_char, b_input_state, b_next_pos)
265
+ else:
266
+ action = None
267
+ break # while 1
268
+ # End inlined: action = self.back_up()
269
+
270
+ self.cur_pos = cur_pos
271
+ self.cur_line = cur_line
272
+ self.cur_line_start = cur_line_start
273
+ self.cur_char = cur_char
274
+ self.input_state = input_state
275
+ self.next_pos = next_pos
276
+ if trace:
277
+ if action is not None:
278
+ print("Doing %s" % action)
279
+ return action
280
+
281
+ def position(self) -> tuple:
282
+ """
283
+ Return a tuple (name, line, col) representing the location of
284
+ the last token read using the read() method. |name| is the
285
+ name that was provided to the Scanner constructor; |line|
286
+ is the line number in the stream (1-based); |col| is the
287
+ position within the line of the first character of the token
288
+ (0-based).
289
+ """
290
+ return self.last_token_position_tuple
291
+
292
+ def get_position(self):
293
+ """
294
+ Python accessible wrapper around position(), only for error reporting.
295
+ """
296
+ return self.position()
297
+
298
+ def begin(self, state_name):
299
+ """Set the current state of the scanner to the named state."""
300
+ self.initial_state = (
301
+ self.lexicon.get_initial_state(state_name))
302
+ self.state_name = state_name
303
+
304
+ def produce(self, value, text=None):
305
+ """
306
+ Called from an action procedure, causes |value| to be returned
307
+ as the token value from read(). If |text| is supplied, it is
308
+ returned in place of the scanned text.
309
+
310
+ produce() can be called more than once during a single call to an action
311
+ procedure, in which case the tokens are queued up and returned one
312
+ at a time by subsequent calls to read(), until the queue is empty,
313
+ whereupon scanning resumes.
314
+ """
315
+ if text is None:
316
+ text = self.text
317
+ self.queue.append(((value, text), self.current_scanner_position_tuple))
318
+
319
+ def eof(self):
320
+ """
321
+ Override this method if you want something to be done at
322
+ end of file.
323
+ """
324
+ pass
325
+
326
+ @property
327
+ def start_line(self):
328
+ return self.last_token_position_tuple[1]
Binary file
@@ -0,0 +1,14 @@
1
+ cimport cython
2
+
3
+ cdef long maxint
4
+
5
+ @cython.final
6
+ cdef class TransitionMap:
7
+ cdef list map
8
+ cdef dict special
9
+
10
+ cpdef add(self, event, new_state)
11
+ cpdef add_set(self, event, new_set)
12
+ cpdef iteritems(self)
13
+ cdef Py_ssize_t split(self, long code)
14
+ cdef set get_special(self, event)
@@ -0,0 +1,239 @@
1
+ """
2
+ Plex - Transition Maps
3
+
4
+ This version represents state sets directly as dicts for speed.
5
+ """
6
+ import cython
7
+
8
+ maxint = 2**31-1 # sentinel value
9
+
10
+
11
+ class TransitionMap:
12
+ """
13
+ A TransitionMap maps an input event to a set of states.
14
+ An input event is one of: a range of character codes,
15
+ the empty string (representing an epsilon move), or one
16
+ of the special symbols BOL, EOL, EOF.
17
+
18
+ For characters, this implementation compactly represents
19
+ the map by means of a list:
20
+
21
+ [code_0, states_0, code_1, states_1, code_2, states_2,
22
+ ..., code_n-1, states_n-1, code_n]
23
+
24
+ where |code_i| is a character code, and |states_i| is a
25
+ set of states corresponding to characters with codes |c|
26
+ in the range |code_i| <= |c| <= |code_i+1|.
27
+
28
+ The following invariants hold:
29
+ n >= 1
30
+ code_0 == -maxint
31
+ code_n == maxint
32
+ code_i < code_i+1 for i in 0..n-1
33
+ states_0 == states_n-1
34
+
35
+ Mappings for the special events '', BOL, EOL, EOF are
36
+ kept separately in a dictionary.
37
+ """
38
+
39
+ def __init__(self, map=None, special=None):
40
+ if not map:
41
+ map = [-maxint, set(), maxint]
42
+ if not special:
43
+ special = {}
44
+ self.map = map # The list of codes and states
45
+ self.special = special # Mapping for special events
46
+
47
+ def add(self, event, new_state):
48
+ """
49
+ Add transition to |new_state| on |event|.
50
+ """
51
+ i: cython.Py_ssize_t
52
+ j: cython.Py_ssize_t
53
+ if type(event) is tuple:
54
+ code0, code1 = event
55
+ i = self.split(code0)
56
+ j = self.split(code1)
57
+ map = self.map
58
+ while i < j:
59
+ map[i + 1].add(new_state)
60
+ i += 2
61
+ else:
62
+ self.get_special(event).add(new_state)
63
+
64
+ def add_set(self, event, new_set):
65
+ """
66
+ Add transitions to the states in |new_set| on |event|.
67
+ """
68
+ i: cython.Py_ssize_t
69
+ j: cython.Py_ssize_t
70
+ if type(event) is tuple:
71
+ code0, code1 = event
72
+ i = self.split(code0)
73
+ j = self.split(code1)
74
+ map = self.map
75
+ while i < j:
76
+ map[i + 1].update(new_set)
77
+ i += 2
78
+ else:
79
+ self.get_special(event).update(new_set)
80
+
81
+ def get_epsilon(self):
82
+ """
83
+ Return the mapping for epsilon, or None.
84
+ """
85
+ return self.special.get('')
86
+
87
+ def iteritems(self):
88
+ """
89
+ Return the mapping as an iterable of ((code1, code2), state_set) and
90
+ (special_event, state_set) pairs.
91
+ """
92
+ result = []
93
+ map = self.map
94
+ else_set: cython.bint = map[1]
95
+ i: cython.Py_ssize_t = 0
96
+ n: cython.Py_ssize_t = len(map) - 1
97
+ code0 = map[0]
98
+ while i < n:
99
+ state_set = map[i + 1]
100
+ code1 = map[i + 2]
101
+ if state_set or else_set:
102
+ result.append(((code0, code1), state_set))
103
+ code0 = code1
104
+ i += 2
105
+ for event, state_set in self.special.items():
106
+ if state_set:
107
+ result.append((event, state_set))
108
+ return iter(result)
109
+
110
+ items = iteritems
111
+
112
+ # ------------------- Private methods --------------------
113
+
114
+ def split(self, code: cython.long):
115
+ """
116
+ Search the list for the position of the split point for |code|,
117
+ inserting a new split point if necessary. Returns index |i| such
118
+ that |code| == |map[i]|.
119
+ """
120
+ # We use a funky variation on binary search.
121
+ map = self.map
122
+ hi: cython.Py_ssize_t = len(map) - 1
123
+ # Special case: code == map[-1]
124
+ if code == maxint:
125
+ return hi
126
+
127
+ # General case
128
+ lo: cython.Py_ssize_t = 0
129
+ mid: cython.Py_ssize_t
130
+ # loop invariant: map[lo] <= code < map[hi] and hi - lo >= 2
131
+ while hi - lo >= 4:
132
+ # Find midpoint truncated to even index
133
+ mid = ((lo + hi) // 2) & ~1
134
+ if code < map[mid]:
135
+ hi = mid
136
+ else:
137
+ lo = mid
138
+ # map[lo] <= code < map[hi] and hi - lo == 2
139
+ if map[lo] == code:
140
+ return lo
141
+ else:
142
+ map[hi:hi] = [code, map[hi - 1].copy()]
143
+ return hi
144
+
145
+ def get_special(self, event) -> set:
146
+ """
147
+ Get state set for special event, adding a new entry if necessary.
148
+ """
149
+ special = self.special
150
+ state_set = special.get(event)
151
+ if state_set is None:
152
+ state_set = set()
153
+ special[event] = state_set
154
+ return state_set
155
+
156
+ # --------------------- Conversion methods -----------------------
157
+
158
+ def __str__(self):
159
+ map_strs = []
160
+ map = self.map
161
+ n: cython.Py_ssize_t = len(map)
162
+ i: cython.Py_ssize_t = 0
163
+ while i < n:
164
+ code = map[i]
165
+ if code == -maxint:
166
+ code_str = "-inf"
167
+ elif code == maxint:
168
+ code_str = "inf"
169
+ else:
170
+ code_str = str(code)
171
+ map_strs.append(code_str)
172
+ i += 1
173
+ if i < n:
174
+ map_strs.append(state_set_str(map[i]))
175
+ i += 1
176
+ special_strs = {}
177
+ for event, set in self.special.items():
178
+ special_strs[event] = state_set_str(set)
179
+ return "[%s]+%s" % (
180
+ ','.join(map_strs),
181
+ special_strs
182
+ )
183
+
184
+ # --------------------- Debugging methods -----------------------
185
+
186
+ def check(self):
187
+ """Check data structure integrity."""
188
+ if not self.map[-3] < self.map[-1]:
189
+ print(self)
190
+ assert 0
191
+
192
+ def dump(self, file):
193
+ map = self.map
194
+ i: cython.Py_ssize_t = 0
195
+ n: cython.Py_ssize_t = len(map) - 1
196
+ while i < n:
197
+ self.dump_range(map[i], map[i + 2], map[i + 1], file)
198
+ i += 2
199
+ for event, set in self.special.items():
200
+ if set:
201
+ if not event:
202
+ event = 'empty'
203
+ self.dump_trans(event, set, file)
204
+
205
+ def dump_range(self, code0, code1, set, file):
206
+ if set:
207
+ if code0 == -maxint:
208
+ if code1 == maxint:
209
+ k = "any"
210
+ else:
211
+ k = "< %s" % self.dump_char(code1)
212
+ elif code1 == maxint:
213
+ k = "> %s" % self.dump_char(code0 - 1)
214
+ elif code0 == code1 - 1:
215
+ k = self.dump_char(code0)
216
+ else:
217
+ k = "%s..%s" % (self.dump_char(code0),
218
+ self.dump_char(code1 - 1))
219
+ self.dump_trans(k, set, file)
220
+
221
+ def dump_char(self, code):
222
+ if 0 <= code <= 255:
223
+ return repr(chr(code))
224
+ else:
225
+ return "chr(%d)" % code
226
+
227
+ def dump_trans(self, key, set, file):
228
+ file.write(" %s --> %s\n" % (key, self.dump_set(set)))
229
+
230
+ def dump_set(self, set):
231
+ return state_set_str(set)
232
+
233
+
234
+ #
235
+ # State set manipulation functions
236
+ #
237
+
238
+ def state_set_str(set):
239
+ return "[%s]" % ','.join(["S%d" % state.number for state in set])
Binary file
@@ -0,0 +1,34 @@
1
+ """
2
+ Python Lexical Analyser
3
+
4
+ The Plex module provides lexical analysers with similar capabilities
5
+ to GNU Flex. The following classes and functions are exported;
6
+ see the attached docstrings for more information.
7
+
8
+ Scanner For scanning a character stream under the
9
+ direction of a Lexicon.
10
+
11
+ Lexicon For constructing a lexical definition
12
+ to be used by a Scanner.
13
+
14
+ Str, Any, AnyBut, AnyChar, Seq, Alt, Opt, Rep, Rep1,
15
+ Bol, Eol, Eof, Empty
16
+
17
+ Regular expression constructors, for building pattern
18
+ definitions for a Lexicon.
19
+
20
+ State For defining scanner states when creating a
21
+ Lexicon.
22
+
23
+ TEXT, IGNORE, Begin
24
+
25
+ Actions for associating with patterns when
26
+ creating a Lexicon.
27
+ """
28
+ # flake8: noqa:F401
29
+
30
+ from .Actions import TEXT, IGNORE, Begin, Method
31
+ from .Lexicons import Lexicon, State
32
+ from .Regexps import RE, Seq, Alt, Rep1, Empty, Str, Any, AnyBut, AnyChar, Range
33
+ from .Regexps import Opt, Rep, Bol, Eol, Eof, Case, NoCase
34
+ from .Scanners import Scanner
@@ -0,0 +1 @@
1
+ # empty file
Binary file