Cython 3.3.0a1__cp315-cp315-win_amd64.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 (335) hide show
  1. Cython/Build/BuildExecutable.py +156 -0
  2. Cython/Build/Cache.py +199 -0
  3. Cython/Build/Cythonize.py +349 -0
  4. Cython/Build/Dependencies.py +1276 -0
  5. Cython/Build/Distutils.py +1 -0
  6. Cython/Build/Inline.py +467 -0
  7. Cython/Build/IpythonMagic.py +559 -0
  8. Cython/Build/SharedModule.py +84 -0
  9. Cython/Build/Tests/TestCyCache.py +195 -0
  10. Cython/Build/Tests/TestCythonizeArgsParser.py +480 -0
  11. Cython/Build/Tests/TestDependencies.py +133 -0
  12. Cython/Build/Tests/TestInline.py +177 -0
  13. Cython/Build/Tests/TestIpythonMagic.py +303 -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 +997 -0
  24. Cython/Compiler/CmdLine.py +263 -0
  25. Cython/Compiler/Code.cp315-win_amd64.pyd +0 -0
  26. Cython/Compiler/Code.pxd +152 -0
  27. Cython/Compiler/Code.py +3907 -0
  28. Cython/Compiler/CodeGeneration.py +33 -0
  29. Cython/Compiler/CythonScope.py +194 -0
  30. Cython/Compiler/Dataclass.py +890 -0
  31. Cython/Compiler/DebugFlags.py +24 -0
  32. Cython/Compiler/Errors.py +310 -0
  33. Cython/Compiler/ExprNodes.py +15983 -0
  34. Cython/Compiler/FlowControl.cp315-win_amd64.pyd +0 -0
  35. Cython/Compiler/FlowControl.pxd +99 -0
  36. Cython/Compiler/FlowControl.py +1571 -0
  37. Cython/Compiler/FusedNode.cp315-win_amd64.pyd +0 -0
  38. Cython/Compiler/FusedNode.py +976 -0
  39. Cython/Compiler/Future.py +16 -0
  40. Cython/Compiler/Interpreter.py +57 -0
  41. Cython/Compiler/Lexicon.py +422 -0
  42. Cython/Compiler/LineTable.cp315-win_amd64.pyd +0 -0
  43. Cython/Compiler/LineTable.py +114 -0
  44. Cython/Compiler/Main.py +856 -0
  45. Cython/Compiler/MatchCaseNodes.py +2197 -0
  46. Cython/Compiler/MemoryView.py +930 -0
  47. Cython/Compiler/ModuleNode.py +4517 -0
  48. Cython/Compiler/Naming.py +367 -0
  49. Cython/Compiler/Nodes.py +10941 -0
  50. Cython/Compiler/Optimize.py +5455 -0
  51. Cython/Compiler/Options.py +838 -0
  52. Cython/Compiler/ParseTreeTransforms.pxd +79 -0
  53. Cython/Compiler/ParseTreeTransforms.py +4744 -0
  54. Cython/Compiler/Parsing.cp315-win_amd64.pyd +0 -0
  55. Cython/Compiler/Parsing.pxd +9 -0
  56. Cython/Compiler/Parsing.py +4792 -0
  57. Cython/Compiler/Pipeline.py +439 -0
  58. Cython/Compiler/PyrexTypes.py +6111 -0
  59. Cython/Compiler/Pythran.py +232 -0
  60. Cython/Compiler/Scanning.cp315-win_amd64.pyd +0 -0
  61. Cython/Compiler/Scanning.pxd +70 -0
  62. Cython/Compiler/Scanning.py +720 -0
  63. Cython/Compiler/StringEncoding.py +297 -0
  64. Cython/Compiler/Symtab.py +3092 -0
  65. Cython/Compiler/Tests/TestBuffer.py +105 -0
  66. Cython/Compiler/Tests/TestBuiltin.py +117 -0
  67. Cython/Compiler/Tests/TestCmdLine.py +587 -0
  68. Cython/Compiler/Tests/TestCode.py +145 -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 +132 -0
  74. Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
  75. Cython/Compiler/Tests/TestStringEncoding.py +20 -0
  76. Cython/Compiler/Tests/TestTreeFragment.py +63 -0
  77. Cython/Compiler/Tests/TestTreePath.py +103 -0
  78. Cython/Compiler/Tests/TestTypes.py +118 -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 +611 -0
  86. Cython/Compiler/TypeSlots.py +1329 -0
  87. Cython/Compiler/UFuncs.py +311 -0
  88. Cython/Compiler/UtilNodes.py +413 -0
  89. Cython/Compiler/UtilityCode.py +348 -0
  90. Cython/Compiler/Version.py +8 -0
  91. Cython/Compiler/Visitor.cp315-win_amd64.pyd +0 -0
  92. Cython/Compiler/Visitor.pxd +53 -0
  93. Cython/Compiler/Visitor.py +864 -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 +280 -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 +580 -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 +152 -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 +268 -0
  127. Cython/Includes/cpython/exc.pxd +263 -0
  128. Cython/Includes/cpython/fileobject.pxd +57 -0
  129. Cython/Includes/cpython/float.pxd +56 -0
  130. Cython/Includes/cpython/frozendict.pxd +37 -0
  131. Cython/Includes/cpython/function.pxd +65 -0
  132. Cython/Includes/cpython/genobject.pxd +25 -0
  133. Cython/Includes/cpython/getargs.pxd +12 -0
  134. Cython/Includes/cpython/instance.pxd +25 -0
  135. Cython/Includes/cpython/iterator.pxd +36 -0
  136. Cython/Includes/cpython/iterobject.pxd +24 -0
  137. Cython/Includes/cpython/list.pxd +144 -0
  138. Cython/Includes/cpython/long.pxd +180 -0
  139. Cython/Includes/cpython/longintrepr.pxd +14 -0
  140. Cython/Includes/cpython/mapping.pxd +63 -0
  141. Cython/Includes/cpython/marshal.pxd +66 -0
  142. Cython/Includes/cpython/mem.pxd +120 -0
  143. Cython/Includes/cpython/memoryview.pxd +50 -0
  144. Cython/Includes/cpython/method.pxd +49 -0
  145. Cython/Includes/cpython/module.pxd +208 -0
  146. Cython/Includes/cpython/number.pxd +258 -0
  147. Cython/Includes/cpython/object.pxd +430 -0
  148. Cython/Includes/cpython/pycapsule.pxd +143 -0
  149. Cython/Includes/cpython/pylifecycle.pxd +68 -0
  150. Cython/Includes/cpython/pyport.pxd +8 -0
  151. Cython/Includes/cpython/pystate.pxd +95 -0
  152. Cython/Includes/cpython/pythread.pxd +53 -0
  153. Cython/Includes/cpython/ref.pxd +141 -0
  154. Cython/Includes/cpython/sentinel.pxd +17 -0
  155. Cython/Includes/cpython/sequence.pxd +134 -0
  156. Cython/Includes/cpython/set.pxd +119 -0
  157. Cython/Includes/cpython/slice.pxd +70 -0
  158. Cython/Includes/cpython/time.pxd +129 -0
  159. Cython/Includes/cpython/tuple.pxd +72 -0
  160. Cython/Includes/cpython/type.pxd +146 -0
  161. Cython/Includes/cpython/unicode.pxd +639 -0
  162. Cython/Includes/cpython/version.pxd +32 -0
  163. Cython/Includes/cpython/weakref.pxd +78 -0
  164. Cython/Includes/libc/__init__.pxd +1 -0
  165. Cython/Includes/libc/complex.pxd +35 -0
  166. Cython/Includes/libc/errno.pxd +127 -0
  167. Cython/Includes/libc/float.pxd +43 -0
  168. Cython/Includes/libc/limits.pxd +28 -0
  169. Cython/Includes/libc/locale.pxd +46 -0
  170. Cython/Includes/libc/math.pxd +209 -0
  171. Cython/Includes/libc/setjmp.pxd +10 -0
  172. Cython/Includes/libc/signal.pxd +64 -0
  173. Cython/Includes/libc/stddef.pxd +9 -0
  174. Cython/Includes/libc/stdint.pxd +105 -0
  175. Cython/Includes/libc/stdio.pxd +80 -0
  176. Cython/Includes/libc/stdlib.pxd +72 -0
  177. Cython/Includes/libc/string.pxd +50 -0
  178. Cython/Includes/libc/threads.pxd +234 -0
  179. Cython/Includes/libc/time.pxd +52 -0
  180. Cython/Includes/libcpp/__init__.pxd +4 -0
  181. Cython/Includes/libcpp/algorithm.pxd +320 -0
  182. Cython/Includes/libcpp/any.pxd +16 -0
  183. Cython/Includes/libcpp/atomic.pxd +59 -0
  184. Cython/Includes/libcpp/barrier.pxd +22 -0
  185. Cython/Includes/libcpp/bit.pxd +29 -0
  186. Cython/Includes/libcpp/cast.pxd +12 -0
  187. Cython/Includes/libcpp/cmath.pxd +518 -0
  188. Cython/Includes/libcpp/complex.pxd +106 -0
  189. Cython/Includes/libcpp/condition_variable.pxd +322 -0
  190. Cython/Includes/libcpp/deque.pxd +165 -0
  191. Cython/Includes/libcpp/exception.pxd +216 -0
  192. Cython/Includes/libcpp/execution.pxd +15 -0
  193. Cython/Includes/libcpp/forward_list.pxd +63 -0
  194. Cython/Includes/libcpp/functional.pxd +26 -0
  195. Cython/Includes/libcpp/future.pxd +103 -0
  196. Cython/Includes/libcpp/iterator.pxd +34 -0
  197. Cython/Includes/libcpp/latch.pxd +17 -0
  198. Cython/Includes/libcpp/limits.pxd +61 -0
  199. Cython/Includes/libcpp/list.pxd +117 -0
  200. Cython/Includes/libcpp/map.pxd +252 -0
  201. Cython/Includes/libcpp/memory.pxd +115 -0
  202. Cython/Includes/libcpp/mutex.pxd +387 -0
  203. Cython/Includes/libcpp/numbers.pxd +15 -0
  204. Cython/Includes/libcpp/numeric.pxd +131 -0
  205. Cython/Includes/libcpp/optional.pxd +34 -0
  206. Cython/Includes/libcpp/pair.pxd +1 -0
  207. Cython/Includes/libcpp/queue.pxd +25 -0
  208. Cython/Includes/libcpp/random.pxd +166 -0
  209. Cython/Includes/libcpp/semaphore.pxd +43 -0
  210. Cython/Includes/libcpp/set.pxd +228 -0
  211. Cython/Includes/libcpp/shared_mutex.pxd +96 -0
  212. Cython/Includes/libcpp/span.pxd +87 -0
  213. Cython/Includes/libcpp/stack.pxd +11 -0
  214. Cython/Includes/libcpp/stop_token.pxd +117 -0
  215. Cython/Includes/libcpp/string.pxd +355 -0
  216. Cython/Includes/libcpp/string_view.pxd +183 -0
  217. Cython/Includes/libcpp/typeindex.pxd +15 -0
  218. Cython/Includes/libcpp/typeinfo.pxd +10 -0
  219. Cython/Includes/libcpp/unordered_map.pxd +193 -0
  220. Cython/Includes/libcpp/unordered_set.pxd +152 -0
  221. Cython/Includes/libcpp/utility.pxd +30 -0
  222. Cython/Includes/libcpp/vector.pxd +186 -0
  223. Cython/Includes/numpy/math.pxd +150 -0
  224. Cython/Includes/openmp.pxd +50 -0
  225. Cython/Includes/posix/__init__.pxd +1 -0
  226. Cython/Includes/posix/dlfcn.pxd +14 -0
  227. Cython/Includes/posix/fcntl.pxd +86 -0
  228. Cython/Includes/posix/ioctl.pxd +4 -0
  229. Cython/Includes/posix/mman.pxd +101 -0
  230. Cython/Includes/posix/resource.pxd +57 -0
  231. Cython/Includes/posix/select.pxd +21 -0
  232. Cython/Includes/posix/signal.pxd +73 -0
  233. Cython/Includes/posix/stat.pxd +98 -0
  234. Cython/Includes/posix/stdio.pxd +37 -0
  235. Cython/Includes/posix/stdlib.pxd +29 -0
  236. Cython/Includes/posix/strings.pxd +9 -0
  237. Cython/Includes/posix/time.pxd +71 -0
  238. Cython/Includes/posix/types.pxd +30 -0
  239. Cython/Includes/posix/uio.pxd +26 -0
  240. Cython/Includes/posix/unistd.pxd +271 -0
  241. Cython/Includes/posix/wait.pxd +38 -0
  242. Cython/LZSS.py +170 -0
  243. Cython/Plex/Actions.cp315-win_amd64.pyd +0 -0
  244. Cython/Plex/Actions.pxd +24 -0
  245. Cython/Plex/Actions.py +119 -0
  246. Cython/Plex/DFA.cp315-win_amd64.pyd +0 -0
  247. Cython/Plex/DFA.pxd +14 -0
  248. Cython/Plex/DFA.py +164 -0
  249. Cython/Plex/Errors.py +48 -0
  250. Cython/Plex/Lexicons.py +178 -0
  251. Cython/Plex/Machines.cp315-win_amd64.pyd +0 -0
  252. Cython/Plex/Machines.pxd +36 -0
  253. Cython/Plex/Machines.py +238 -0
  254. Cython/Plex/Regexps.py +535 -0
  255. Cython/Plex/Scanners.cp315-win_amd64.pyd +0 -0
  256. Cython/Plex/Scanners.pxd +45 -0
  257. Cython/Plex/Scanners.py +328 -0
  258. Cython/Plex/Transitions.cp315-win_amd64.pyd +0 -0
  259. Cython/Plex/Transitions.pxd +14 -0
  260. Cython/Plex/Transitions.py +239 -0
  261. Cython/Plex/__init__.py +34 -0
  262. Cython/Runtime/__init__.py +1 -0
  263. Cython/Runtime/refnanny.cp315-win_amd64.pyd +0 -0
  264. Cython/Runtime/refnanny.pyx +237 -0
  265. Cython/Shadow.py +1167 -0
  266. Cython/StringIOTree.cp315-win_amd64.pyd +0 -0
  267. Cython/StringIOTree.py +169 -0
  268. Cython/Tempita/__init__.py +4 -0
  269. Cython/Tempita/_looper.py +154 -0
  270. Cython/Tempita/_tempita.cp315-win_amd64.pyd +0 -0
  271. Cython/Tempita/_tempita.py +1087 -0
  272. Cython/TestUtils.py +464 -0
  273. Cython/Tests/TestCodeWriter.py +128 -0
  274. Cython/Tests/TestCythonUtils.py +202 -0
  275. Cython/Tests/TestJediTyper.py +223 -0
  276. Cython/Tests/TestShadow.py +110 -0
  277. Cython/Tests/TestStringIOTree.py +68 -0
  278. Cython/Tests/TestTestUtils.py +89 -0
  279. Cython/Tests/__init__.py +1 -0
  280. Cython/Tests/xmlrunner.py +390 -0
  281. Cython/Utility/AsyncGen.c +1073 -0
  282. Cython/Utility/Buffer.c +866 -0
  283. Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
  284. Cython/Utility/Builtins.c +933 -0
  285. Cython/Utility/CConvert.pyx +149 -0
  286. Cython/Utility/CMath.c +104 -0
  287. Cython/Utility/CommonStructures.c +244 -0
  288. Cython/Utility/Complex.c +378 -0
  289. Cython/Utility/Coroutine.c +2337 -0
  290. Cython/Utility/CpdefEnums.pyx +107 -0
  291. Cython/Utility/CppConvert.pyx +282 -0
  292. Cython/Utility/CppSupport.cpp +151 -0
  293. Cython/Utility/CythonFunction.c +2072 -0
  294. Cython/Utility/Dataclasses.c +101 -0
  295. Cython/Utility/Embed.c +129 -0
  296. Cython/Utility/Exceptions.c +1038 -0
  297. Cython/Utility/ExtensionTypes.c +1158 -0
  298. Cython/Utility/FunctionArguments.c +1045 -0
  299. Cython/Utility/FusedFunction.pyx +44 -0
  300. Cython/Utility/ImportExport.c +930 -0
  301. Cython/Utility/MatchCase.c +979 -0
  302. Cython/Utility/MatchCase_Cy.pyx +12 -0
  303. Cython/Utility/MemoryView.pxd +108 -0
  304. Cython/Utility/MemoryView.pyx +1499 -0
  305. Cython/Utility/MemoryView_C.c +1056 -0
  306. Cython/Utility/ModuleSetupCode.c +3352 -0
  307. Cython/Utility/NumpyImportArray.c +46 -0
  308. Cython/Utility/ObjectHandling.c +3372 -0
  309. Cython/Utility/Optimize.c +2563 -0
  310. Cython/Utility/Overflow.c +378 -0
  311. Cython/Utility/Profile.c +736 -0
  312. Cython/Utility/StringTools.c +1414 -0
  313. Cython/Utility/Synchronization.c +438 -0
  314. Cython/Utility/TString.c +369 -0
  315. Cython/Utility/TestCyUtilityLoader.pyx +8 -0
  316. Cython/Utility/TestCythonScope.pyx +75 -0
  317. Cython/Utility/TestUtilityLoader.c +12 -0
  318. Cython/Utility/TypeConversion.c +1556 -0
  319. Cython/Utility/UFuncs.pyx +50 -0
  320. Cython/Utility/UFuncs_C.c +89 -0
  321. Cython/Utility/__init__.py +28 -0
  322. Cython/Utility/arrayarray.h +172 -0
  323. Cython/Utils.cp315-win_amd64.pyd +0 -0
  324. Cython/Utils.py +677 -0
  325. Cython/__init__.py +12 -0
  326. Cython/py.typed +0 -0
  327. cython-3.3.0a1.dist-info/METADATA +394 -0
  328. cython-3.3.0a1.dist-info/RECORD +335 -0
  329. cython-3.3.0a1.dist-info/WHEEL +5 -0
  330. cython-3.3.0a1.dist-info/entry_points.txt +4 -0
  331. cython-3.3.0a1.dist-info/top_level.txt +3 -0
  332. cython.py +29 -0
  333. pyximport/__init__.py +4 -0
  334. pyximport/pyxbuild.py +160 -0
  335. pyximport/pyximport.py +482 -0
Cython/Plex/Actions.py ADDED
@@ -0,0 +1,119 @@
1
+ """
2
+ Python Lexical Analyser
3
+
4
+ Actions for use in token specifications
5
+ """
6
+
7
+ class Action:
8
+ def perform(self, token_stream, text):
9
+ pass # abstract
10
+
11
+ def __copy__(self):
12
+ return self # immutable, no need to copy
13
+
14
+ def __deepcopy__(self, memo):
15
+ return self # immutable, no need to copy
16
+
17
+
18
+ class Return(Action):
19
+ """
20
+ Internal Plex action which causes |value| to
21
+ be returned as the value of the associated token
22
+ """
23
+
24
+ def __init__(self, value):
25
+ self.value = value
26
+
27
+ def perform(self, token_stream, text):
28
+ return self.value
29
+
30
+ def __repr__(self):
31
+ return "Return(%r)" % self.value
32
+
33
+
34
+ class Call(Action):
35
+ """
36
+ Internal Plex action which causes a function to be called.
37
+ """
38
+
39
+ def __init__(self, function):
40
+ self.function = function
41
+
42
+ def perform(self, token_stream, text):
43
+ return self.function(token_stream, text)
44
+
45
+ def __repr__(self):
46
+ return "Call(%s)" % self.function.__name__
47
+
48
+
49
+ class Method(Action):
50
+ """
51
+ Plex action that calls a specific method on the token stream,
52
+ passing the matched text and any provided constant keyword arguments.
53
+ """
54
+
55
+ def __init__(self, name, **kwargs):
56
+ self.name = name
57
+ self.kwargs = kwargs or None
58
+
59
+ def perform(self, token_stream, text):
60
+ method = getattr(token_stream, self.name)
61
+ # self.kwargs is almost always unused => avoid call overhead
62
+ return method(text, **self.kwargs) if self.kwargs is not None else method(text)
63
+
64
+ def __repr__(self):
65
+ kwargs = (
66
+ ', '.join(sorted(['%s=%r' % item for item in self.kwargs.items()]))
67
+ if self.kwargs is not None else '')
68
+ return "Method(%s%s%s)" % (self.name, ', ' if kwargs else '', kwargs)
69
+
70
+
71
+ class Begin(Action):
72
+ """
73
+ Begin(state_name) is a Plex action which causes the Scanner to
74
+ enter the state |state_name|. See the docstring of Plex.Lexicon
75
+ for more information.
76
+ """
77
+
78
+ def __init__(self, state_name):
79
+ self.state_name = state_name
80
+
81
+ def perform(self, token_stream, text):
82
+ token_stream.begin(self.state_name)
83
+
84
+ def __repr__(self):
85
+ return "Begin(%s)" % self.state_name
86
+
87
+
88
+ class Ignore(Action):
89
+ """
90
+ IGNORE is a Plex action which causes its associated token
91
+ to be ignored. See the docstring of Plex.Lexicon for more
92
+ information.
93
+ """
94
+
95
+ def perform(self, token_stream, text):
96
+ return None
97
+
98
+ def __repr__(self):
99
+ return "IGNORE"
100
+
101
+
102
+ IGNORE = Ignore()
103
+
104
+
105
+ class Text(Action):
106
+ """
107
+ TEXT is a Plex action which causes the text of a token to
108
+ be returned as the value of the token. See the docstring of
109
+ Plex.Lexicon for more information.
110
+ """
111
+
112
+ def perform(self, token_stream, text):
113
+ return text
114
+
115
+ def __repr__(self):
116
+ return "TEXT"
117
+
118
+
119
+ TEXT = Text()
Binary file
Cython/Plex/DFA.pxd ADDED
@@ -0,0 +1,14 @@
1
+ cimport cython
2
+
3
+ from . cimport Machines
4
+
5
+
6
+ @cython.final
7
+ cdef class StateMap:
8
+ cdef Machines.FastMachine new_machine
9
+ cdef dict old_to_new_dict
10
+ cdef dict new_to_old_dict
11
+
12
+ cdef old_to_new(self, set old_state_set)
13
+ cdef highest_priority_action(self, set state_set)
14
+ cdef make_key(self, set state_set)
Cython/Plex/DFA.py ADDED
@@ -0,0 +1,164 @@
1
+ # cython: auto_cpdef=True
2
+ """
3
+ Python Lexical Analyser
4
+
5
+ Converting NFA to DFA
6
+ """
7
+
8
+ import cython
9
+ from . import Machines
10
+ from .Machines import LOWEST_PRIORITY
11
+ from .Transitions import TransitionMap
12
+
13
+ if cython.compiled:
14
+ from cython.cimports.Cython.Plex.Machines import Node, FastMachine
15
+ from cython.cimports.Cython.Plex.Transitions import TransitionMap as type_TransitionMap
16
+ else:
17
+ from Cython.Plex.Machines import Node, FastMachine
18
+ from Cython.Plex.Transitions import TransitionMap as type_TransitionMap
19
+
20
+
21
+ def nfa_to_dfa(old_machine, debug=None):
22
+ """
23
+ Given a nondeterministic Machine, return a new equivalent
24
+ Machine which is deterministic.
25
+ """
26
+ # We build a new machine whose states correspond to sets of states
27
+ # in the old machine. Initially we add a new state corresponding to
28
+ # the epsilon-closure of each initial old state. Then we give transitions
29
+ # to each new state which are the union of all transitions out of any
30
+ # of the corresponding old states. The new state reached on a given
31
+ # character is the one corresponding to the set of states reachable
32
+ # on that character from any of the old states. As new combinations of
33
+ # old states are created, new states are added as needed until closure
34
+ # is reached.
35
+ transitions: type_TransitionMap
36
+ new_machine: FastMachine = Machines.FastMachine()
37
+ state_map: StateMap = StateMap(new_machine)
38
+
39
+ # Seed the process using the initial states of the old machine.
40
+ # Make the corresponding new states into initial states of the new
41
+ # machine with the same names.
42
+ for (key, old_state) in old_machine.initial_states.items():
43
+ new_state = state_map.old_to_new(epsilon_closure(old_state))
44
+ new_machine.make_initial_state(key, new_state)
45
+
46
+ # Tricky bit here: we add things to the end of this list while we're
47
+ # iterating over it. The iteration stops when closure is achieved.
48
+ for new_state in new_machine.states:
49
+ transitions = TransitionMap()
50
+ for old_state in state_map.new_to_old(new_state):
51
+ for event, old_target_states in old_state.transitions.items():
52
+ if event and old_target_states:
53
+ transitions.add_set(event, set_epsilon_closure(old_target_states))
54
+ for event, old_states in transitions.items():
55
+ new_machine.add_transitions(new_state, event, state_map.old_to_new(old_states))
56
+
57
+ if debug:
58
+ debug.write("\n===== State Mapping =====\n")
59
+ state_map.dump(debug)
60
+ return new_machine
61
+
62
+
63
+ @cython.cfunc
64
+ def set_epsilon_closure(state_set: set) -> set:
65
+ """
66
+ Given a set of states, return the union of the epsilon
67
+ closures of its member states.
68
+ """
69
+ result = set()
70
+ for state1 in state_set:
71
+ for state2 in epsilon_closure(state1):
72
+ result.add(state2)
73
+ return result
74
+
75
+
76
+ @cython.cfunc
77
+ def epsilon_closure(state: Node) -> set:
78
+ """
79
+ Return the set of states reachable from the given state
80
+ by epsilon moves.
81
+ """
82
+ # Cache the result
83
+ result = state.epsilon_closure
84
+ if result is None:
85
+ result = set()
86
+ state.epsilon_closure = result
87
+ add_to_epsilon_closure(result, state)
88
+ return result
89
+
90
+
91
+ @cython.cfunc
92
+ def add_to_epsilon_closure(state_set: set, state: Node):
93
+ """
94
+ Recursively add to |state_set| states reachable from the given state
95
+ by epsilon moves.
96
+ """
97
+ state_set_2: set
98
+ state2: Node
99
+
100
+ if state not in state_set:
101
+ state_set.add(state)
102
+ state_set_2 = state.transitions.get_epsilon()
103
+ if state_set_2:
104
+ for state2 in state_set_2:
105
+ add_to_epsilon_closure(state_set, state2)
106
+
107
+
108
+ class StateMap:
109
+ """
110
+ Helper class used by nfa_to_dfa() to map back and forth between
111
+ sets of states from the old machine and states of the new machine.
112
+ """
113
+
114
+ def __init__(self, new_machine):
115
+ self.new_machine = new_machine # Machine
116
+ self.old_to_new_dict = {} # {(old_state,...) : new_state}
117
+ self.new_to_old_dict = {} # {id(new_state) : old_state_set}
118
+
119
+ def old_to_new(self, old_state_set: set):
120
+ """
121
+ Return the state of the new machine corresponding to the
122
+ set of old machine states represented by |state_set|. A new
123
+ state will be created if necessary. If any of the old states
124
+ are accepting states, the new state will be an accepting state
125
+ with the highest priority action from the old states.
126
+ """
127
+ key = self.make_key(old_state_set)
128
+ new_state = self.old_to_new_dict.get(key, None)
129
+ if not new_state:
130
+ action = self.highest_priority_action(old_state_set)
131
+ new_state = self.new_machine.new_state(action)
132
+ self.old_to_new_dict[key] = new_state
133
+ self.new_to_old_dict[id(new_state)] = old_state_set
134
+ return new_state
135
+
136
+ def highest_priority_action(self, state_set: set):
137
+ best_action = None
138
+ best_priority = LOWEST_PRIORITY
139
+ state: Node
140
+ for state in state_set:
141
+ priority = state.action_priority
142
+ if priority > best_priority:
143
+ best_action = state.action
144
+ best_priority = priority
145
+ return best_action
146
+
147
+ def new_to_old(self, new_state):
148
+ """Given a new state, return a set of corresponding old states."""
149
+ return self.new_to_old_dict[id(new_state)]
150
+
151
+ def make_key(self, state_set: set):
152
+ """
153
+ Convert a set of states into a uniquified
154
+ sorted tuple suitable for use as a dictionary key.
155
+ """
156
+ return tuple(sorted(state_set))
157
+
158
+ def dump(self, file):
159
+ from .Transitions import state_set_str
160
+
161
+ for new_state in self.new_machine.states:
162
+ old_state_set = self.new_to_old_dict[id(new_state)]
163
+ file.write(" State %s <-- %s\n" % (
164
+ new_state['number'], state_set_str(old_state_set)))
Cython/Plex/Errors.py ADDED
@@ -0,0 +1,48 @@
1
+ """
2
+ Python Lexical Analyser
3
+
4
+ Exception classes
5
+ """
6
+
7
+
8
+ class PlexError(Exception):
9
+ message = ""
10
+
11
+
12
+ class PlexTypeError(PlexError, TypeError):
13
+ pass
14
+
15
+
16
+ class PlexValueError(PlexError, ValueError):
17
+ pass
18
+
19
+
20
+ class InvalidToken(PlexError):
21
+ def __init__(self, token_number, message):
22
+ PlexError.__init__(self, "Token number %d: %s" % (token_number, message))
23
+
24
+
25
+ class InvalidScanner(PlexError):
26
+ pass
27
+
28
+
29
+ class AmbiguousAction(PlexError):
30
+ message = "Two tokens with different actions can match the same string"
31
+
32
+ def __init__(self):
33
+ pass
34
+
35
+
36
+ class UnrecognizedInput(PlexError):
37
+ scanner = None
38
+ position = None
39
+ state_name = None
40
+
41
+ def __init__(self, scanner, state_name):
42
+ self.scanner = scanner
43
+ self.position = scanner.get_position()
44
+ self.state_name = state_name
45
+
46
+ def __str__(self):
47
+ return ("'%s', line %d, char %d: Token not recognised in state %r" % (
48
+ self.position + (self.state_name,)))
@@ -0,0 +1,178 @@
1
+ """
2
+ Python Lexical Analyser
3
+
4
+ Lexical Analyser Specification
5
+ """
6
+
7
+ from . import Actions
8
+ from . import DFA
9
+ from . import Errors
10
+ from . import Machines
11
+ from . import Regexps
12
+
13
+ # debug_flags for Lexicon constructor
14
+ DUMP_NFA = 1
15
+ DUMP_DFA = 2
16
+
17
+
18
+ class State:
19
+ """
20
+ This class is used as part of a Plex.Lexicon specification to
21
+ introduce a user-defined state.
22
+
23
+ Constructor:
24
+
25
+ State(name, token_specifications)
26
+ """
27
+
28
+ name = None
29
+ tokens = None
30
+
31
+ def __init__(self, name, tokens):
32
+ self.name = name
33
+ self.tokens = tokens
34
+
35
+
36
+ class Lexicon:
37
+ """
38
+ Lexicon(specification) builds a lexical analyser from the given
39
+ |specification|. The specification consists of a list of
40
+ specification items. Each specification item may be either:
41
+
42
+ 1) A token definition, which is a tuple:
43
+
44
+ (pattern, action)
45
+
46
+ The |pattern| is a regular axpression built using the
47
+ constructors defined in the Plex module.
48
+
49
+ The |action| is the action to be performed when this pattern
50
+ is recognised (see below).
51
+
52
+ 2) A state definition:
53
+
54
+ State(name, tokens)
55
+
56
+ where |name| is a character string naming the state,
57
+ and |tokens| is a list of token definitions as
58
+ above. The meaning and usage of states is described
59
+ below.
60
+
61
+ Actions
62
+ -------
63
+
64
+ The |action| in a token specification may be one of three things:
65
+
66
+ 1) A function, which is called as follows:
67
+
68
+ function(scanner, text)
69
+
70
+ where |scanner| is the relevant Scanner instance, and |text|
71
+ is the matched text. If the function returns anything
72
+ other than None, that value is returned as the value of the
73
+ token. If it returns None, scanning continues as if the IGNORE
74
+ action were specified (see below).
75
+
76
+ 2) One of the following special actions:
77
+
78
+ IGNORE means that the recognised characters will be treated as
79
+ white space and ignored. Scanning will continue until
80
+ the next non-ignored token is recognised before returning.
81
+
82
+ TEXT causes the scanned text itself to be returned as the
83
+ value of the token.
84
+
85
+ 3) Any other value, which is returned as the value of the token.
86
+
87
+ States
88
+ ------
89
+
90
+ At any given time, the scanner is in one of a number of states.
91
+ Associated with each state is a set of possible tokens. When scanning,
92
+ only tokens associated with the current state are recognised.
93
+
94
+ There is a default state, whose name is the empty string. Token
95
+ definitions which are not inside any State definition belong to
96
+ the default state.
97
+
98
+ The initial state of the scanner is the default state. The state can
99
+ be changed in one of two ways:
100
+
101
+ 1) Using Begin(state_name) as the action of a token.
102
+
103
+ 2) Calling the begin(state_name) method of the Scanner.
104
+
105
+ To change back to the default state, use '' as the state name.
106
+ """
107
+
108
+ machine = None # Machine
109
+ tables = None # StateTableMachine
110
+
111
+ def __init__(self, specifications, debug=None, debug_flags=7):
112
+ if not isinstance(specifications, list):
113
+ raise Errors.InvalidScanner("Scanner definition is not a list")
114
+
115
+ nfa = Machines.Machine()
116
+ default_initial_state = nfa.new_initial_state('')
117
+ token_number = 1
118
+
119
+ for spec in specifications:
120
+ if isinstance(spec, State):
121
+ user_initial_state = nfa.new_initial_state(spec.name)
122
+ for token in spec.tokens:
123
+ self.add_token_to_machine(
124
+ nfa, user_initial_state, token, token_number)
125
+ token_number += 1
126
+ elif isinstance(spec, tuple):
127
+ self.add_token_to_machine(
128
+ nfa, default_initial_state, spec, token_number)
129
+ token_number += 1
130
+ else:
131
+ raise Errors.InvalidToken(
132
+ token_number,
133
+ "Expected a token definition (tuple) or State instance")
134
+
135
+ if debug and (debug_flags & 1):
136
+ debug.write("\n============= NFA ===========\n")
137
+ nfa.dump(debug)
138
+
139
+ dfa = DFA.nfa_to_dfa(nfa, debug=(debug_flags & 3) == 3 and debug)
140
+
141
+ if debug and (debug_flags & 2):
142
+ debug.write("\n============= DFA ===========\n")
143
+ dfa.dump(debug)
144
+
145
+ self.machine = dfa
146
+
147
+ def add_token_to_machine(self, machine, initial_state, token_spec, token_number):
148
+ try:
149
+ (re, action_spec) = self.parse_token_definition(token_spec)
150
+ if isinstance(action_spec, Actions.Action):
151
+ action = action_spec
152
+ else:
153
+ try:
154
+ action_spec.__call__
155
+ except AttributeError:
156
+ action = Actions.Return(action_spec)
157
+ else:
158
+ action = Actions.Call(action_spec)
159
+ final_state = machine.new_state()
160
+ re.build_machine(machine, initial_state, final_state,
161
+ match_bol=1, nocase=0)
162
+ final_state.set_action(action, priority=-token_number)
163
+ except Errors.PlexError as e:
164
+ raise e.__class__("Token number %d: %s" % (token_number, e))
165
+
166
+ def parse_token_definition(self, token_spec):
167
+ if not isinstance(token_spec, tuple):
168
+ raise Errors.InvalidToken("Token definition is not a tuple")
169
+ if len(token_spec) != 2:
170
+ raise Errors.InvalidToken("Wrong number of items in token definition")
171
+
172
+ pattern, action = token_spec
173
+ if not isinstance(pattern, Regexps.RE):
174
+ raise Errors.InvalidToken("Pattern is not an RE instance")
175
+ return (pattern, action)
176
+
177
+ def get_initial_state(self, name):
178
+ return self.machine.get_initial_state(name)
Binary file
@@ -0,0 +1,36 @@
1
+ cimport cython
2
+
3
+ from .Actions cimport Action
4
+ from .Transitions cimport TransitionMap
5
+
6
+ cdef int maxint
7
+
8
+
9
+ @cython.final
10
+ cdef class Machine:
11
+ cdef readonly list states
12
+ cdef readonly dict initial_states
13
+ cdef readonly Py_ssize_t next_state_number
14
+
15
+ cpdef new_state(self)
16
+ cpdef new_initial_state(self, name)
17
+ cpdef make_initial_state(self, name, state)
18
+
19
+
20
+ @cython.final
21
+ cdef class Node:
22
+ cdef readonly TransitionMap transitions
23
+ cdef readonly Action action
24
+ cdef public set epsilon_closure
25
+ cdef readonly Py_ssize_t number
26
+ cdef readonly int action_priority
27
+
28
+
29
+ @cython.final
30
+ cdef class FastMachine:
31
+ cdef readonly dict initial_states
32
+ cdef readonly dict new_state_template
33
+ cdef readonly list states
34
+ cdef readonly Py_ssize_t next_number
35
+
36
+ cpdef make_initial_state(self, name, state)