Cython 3.2.0__cp39-abi3-win32.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- Cython/Build/BuildExecutable.py +169 -0
- Cython/Build/Cache.py +199 -0
- Cython/Build/Cythonize.py +350 -0
- Cython/Build/Dependencies.py +1314 -0
- Cython/Build/Distutils.py +1 -0
- Cython/Build/Inline.py +463 -0
- Cython/Build/IpythonMagic.py +560 -0
- Cython/Build/SharedModule.py +94 -0
- Cython/Build/Tests/TestCyCache.py +194 -0
- Cython/Build/Tests/TestCythonizeArgsParser.py +481 -0
- Cython/Build/Tests/TestDependencies.py +133 -0
- Cython/Build/Tests/TestInline.py +177 -0
- Cython/Build/Tests/TestIpythonMagic.py +287 -0
- Cython/Build/Tests/TestRecythonize.py +212 -0
- Cython/Build/Tests/TestStripLiterals.py +155 -0
- Cython/Build/Tests/__init__.py +1 -0
- Cython/Build/__init__.py +11 -0
- Cython/CodeWriter.py +815 -0
- Cython/Compiler/AnalysedTreeTransforms.py +97 -0
- Cython/Compiler/Annotate.py +328 -0
- Cython/Compiler/AutoDocTransforms.py +320 -0
- Cython/Compiler/Buffer.py +680 -0
- Cython/Compiler/Builtin.py +984 -0
- Cython/Compiler/CmdLine.py +263 -0
- Cython/Compiler/Code.pxd +149 -0
- Cython/Compiler/Code.py +3746 -0
- Cython/Compiler/Code.pyd +0 -0
- Cython/Compiler/CodeGeneration.py +33 -0
- Cython/Compiler/CythonScope.py +191 -0
- Cython/Compiler/Dataclass.py +864 -0
- Cython/Compiler/DebugFlags.py +24 -0
- Cython/Compiler/Errors.py +297 -0
- Cython/Compiler/ExprNodes.py +15562 -0
- Cython/Compiler/FlowControl.pxd +97 -0
- Cython/Compiler/FlowControl.py +1451 -0
- Cython/Compiler/FlowControl.pyd +0 -0
- Cython/Compiler/FusedNode.py +971 -0
- Cython/Compiler/FusedNode.pyd +0 -0
- Cython/Compiler/Future.py +16 -0
- Cython/Compiler/Interpreter.py +57 -0
- Cython/Compiler/Lexicon.py +421 -0
- Cython/Compiler/LineTable.py +114 -0
- Cython/Compiler/LineTable.pyd +0 -0
- Cython/Compiler/Main.py +857 -0
- Cython/Compiler/MatchCaseNodes.py +259 -0
- Cython/Compiler/MemoryView.py +905 -0
- Cython/Compiler/ModuleNode.py +4235 -0
- Cython/Compiler/Naming.py +363 -0
- Cython/Compiler/Nodes.py +10831 -0
- Cython/Compiler/Optimize.py +5288 -0
- Cython/Compiler/Options.py +843 -0
- Cython/Compiler/ParseTreeTransforms.pxd +78 -0
- Cython/Compiler/ParseTreeTransforms.py +4638 -0
- Cython/Compiler/Parsing.pxd +9 -0
- Cython/Compiler/Parsing.py +4775 -0
- Cython/Compiler/Parsing.pyd +0 -0
- Cython/Compiler/Pipeline.py +439 -0
- Cython/Compiler/PyrexTypes.py +5870 -0
- Cython/Compiler/Pythran.py +232 -0
- Cython/Compiler/Scanning.pxd +48 -0
- Cython/Compiler/Scanning.py +701 -0
- Cython/Compiler/Scanning.pyd +0 -0
- Cython/Compiler/StringEncoding.py +298 -0
- Cython/Compiler/Symtab.py +3073 -0
- Cython/Compiler/Tests/TestBuffer.py +105 -0
- Cython/Compiler/Tests/TestBuiltin.py +72 -0
- Cython/Compiler/Tests/TestCmdLine.py +586 -0
- Cython/Compiler/Tests/TestCode.py +144 -0
- Cython/Compiler/Tests/TestFlowControl.py +65 -0
- Cython/Compiler/Tests/TestGrammar.py +202 -0
- Cython/Compiler/Tests/TestMemView.py +71 -0
- Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
- Cython/Compiler/Tests/TestScanning.py +134 -0
- Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
- Cython/Compiler/Tests/TestStringEncoding.py +21 -0
- Cython/Compiler/Tests/TestTreeFragment.py +63 -0
- Cython/Compiler/Tests/TestTreePath.py +103 -0
- Cython/Compiler/Tests/TestTypes.py +75 -0
- Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
- Cython/Compiler/Tests/TestVisitor.py +61 -0
- Cython/Compiler/Tests/Utils.py +36 -0
- Cython/Compiler/Tests/__init__.py +1 -0
- Cython/Compiler/TreeFragment.py +278 -0
- Cython/Compiler/TreePath.py +303 -0
- Cython/Compiler/TypeInference.py +591 -0
- Cython/Compiler/TypeSlots.py +1174 -0
- Cython/Compiler/UFuncs.py +311 -0
- Cython/Compiler/UtilNodes.py +389 -0
- Cython/Compiler/UtilityCode.py +344 -0
- Cython/Compiler/Version.py +8 -0
- Cython/Compiler/Visitor.pxd +53 -0
- Cython/Compiler/Visitor.py +861 -0
- Cython/Compiler/Visitor.pyd +0 -0
- Cython/Compiler/__init__.py +1 -0
- Cython/Coverage.py +448 -0
- Cython/Debugger/Cygdb.py +177 -0
- Cython/Debugger/DebugWriter.py +82 -0
- Cython/Debugger/Tests/TestLibCython.py +275 -0
- Cython/Debugger/Tests/__init__.py +1 -0
- Cython/Debugger/Tests/cfuncs.c +8 -0
- Cython/Debugger/Tests/codefile +49 -0
- Cython/Debugger/Tests/test_libcython_in_gdb.py +578 -0
- Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
- Cython/Debugger/__init__.py +1 -0
- Cython/Debugger/libcython.py +1548 -0
- Cython/Debugger/libpython.py +2821 -0
- Cython/Debugging.py +20 -0
- Cython/Distutils/__init__.py +2 -0
- Cython/Distutils/build_ext.py +139 -0
- Cython/Distutils/extension.py +96 -0
- Cython/Distutils/old_build_ext.py +351 -0
- Cython/Includes/cpython/__init__.pxd +173 -0
- Cython/Includes/cpython/array.pxd +178 -0
- Cython/Includes/cpython/bool.pxd +37 -0
- Cython/Includes/cpython/buffer.pxd +112 -0
- Cython/Includes/cpython/bytearray.pxd +33 -0
- Cython/Includes/cpython/bytes.pxd +200 -0
- Cython/Includes/cpython/cellobject.pxd +35 -0
- Cython/Includes/cpython/ceval.pxd +8 -0
- Cython/Includes/cpython/codecs.pxd +121 -0
- Cython/Includes/cpython/complex.pxd +60 -0
- Cython/Includes/cpython/contextvars.pxd +145 -0
- Cython/Includes/cpython/conversion.pxd +36 -0
- Cython/Includes/cpython/datetime.pxd +395 -0
- Cython/Includes/cpython/descr.pxd +26 -0
- Cython/Includes/cpython/dict.pxd +187 -0
- Cython/Includes/cpython/exc.pxd +263 -0
- Cython/Includes/cpython/fileobject.pxd +57 -0
- Cython/Includes/cpython/float.pxd +47 -0
- Cython/Includes/cpython/function.pxd +65 -0
- Cython/Includes/cpython/genobject.pxd +25 -0
- Cython/Includes/cpython/getargs.pxd +12 -0
- Cython/Includes/cpython/instance.pxd +25 -0
- Cython/Includes/cpython/iterator.pxd +36 -0
- Cython/Includes/cpython/iterobject.pxd +24 -0
- Cython/Includes/cpython/list.pxd +92 -0
- Cython/Includes/cpython/long.pxd +149 -0
- Cython/Includes/cpython/longintrepr.pxd +14 -0
- Cython/Includes/cpython/mapping.pxd +63 -0
- Cython/Includes/cpython/marshal.pxd +66 -0
- Cython/Includes/cpython/mem.pxd +120 -0
- Cython/Includes/cpython/memoryview.pxd +50 -0
- Cython/Includes/cpython/method.pxd +49 -0
- Cython/Includes/cpython/module.pxd +208 -0
- Cython/Includes/cpython/number.pxd +258 -0
- Cython/Includes/cpython/object.pxd +433 -0
- Cython/Includes/cpython/pycapsule.pxd +143 -0
- Cython/Includes/cpython/pylifecycle.pxd +68 -0
- Cython/Includes/cpython/pyport.pxd +8 -0
- Cython/Includes/cpython/pystate.pxd +95 -0
- Cython/Includes/cpython/pythread.pxd +53 -0
- Cython/Includes/cpython/ref.pxd +141 -0
- Cython/Includes/cpython/sequence.pxd +134 -0
- Cython/Includes/cpython/set.pxd +119 -0
- Cython/Includes/cpython/slice.pxd +70 -0
- Cython/Includes/cpython/time.pxd +129 -0
- Cython/Includes/cpython/tuple.pxd +72 -0
- Cython/Includes/cpython/type.pxd +53 -0
- Cython/Includes/cpython/unicode.pxd +639 -0
- Cython/Includes/cpython/version.pxd +32 -0
- Cython/Includes/cpython/weakref.pxd +78 -0
- Cython/Includes/libc/__init__.pxd +1 -0
- Cython/Includes/libc/complex.pxd +35 -0
- Cython/Includes/libc/errno.pxd +127 -0
- Cython/Includes/libc/float.pxd +43 -0
- Cython/Includes/libc/limits.pxd +28 -0
- Cython/Includes/libc/locale.pxd +46 -0
- Cython/Includes/libc/math.pxd +209 -0
- Cython/Includes/libc/setjmp.pxd +10 -0
- Cython/Includes/libc/signal.pxd +64 -0
- Cython/Includes/libc/stddef.pxd +9 -0
- Cython/Includes/libc/stdint.pxd +105 -0
- Cython/Includes/libc/stdio.pxd +80 -0
- Cython/Includes/libc/stdlib.pxd +72 -0
- Cython/Includes/libc/string.pxd +50 -0
- Cython/Includes/libc/threads.pxd +234 -0
- Cython/Includes/libc/time.pxd +52 -0
- Cython/Includes/libcpp/__init__.pxd +4 -0
- Cython/Includes/libcpp/algorithm.pxd +320 -0
- Cython/Includes/libcpp/any.pxd +16 -0
- Cython/Includes/libcpp/atomic.pxd +59 -0
- Cython/Includes/libcpp/barrier.pxd +22 -0
- Cython/Includes/libcpp/bit.pxd +29 -0
- Cython/Includes/libcpp/cast.pxd +12 -0
- Cython/Includes/libcpp/cmath.pxd +518 -0
- Cython/Includes/libcpp/complex.pxd +106 -0
- Cython/Includes/libcpp/condition_variable.pxd +322 -0
- Cython/Includes/libcpp/deque.pxd +165 -0
- Cython/Includes/libcpp/exception.pxd +86 -0
- Cython/Includes/libcpp/execution.pxd +15 -0
- Cython/Includes/libcpp/forward_list.pxd +63 -0
- Cython/Includes/libcpp/functional.pxd +26 -0
- Cython/Includes/libcpp/future.pxd +103 -0
- Cython/Includes/libcpp/iterator.pxd +34 -0
- Cython/Includes/libcpp/latch.pxd +17 -0
- Cython/Includes/libcpp/limits.pxd +61 -0
- Cython/Includes/libcpp/list.pxd +117 -0
- Cython/Includes/libcpp/map.pxd +252 -0
- Cython/Includes/libcpp/memory.pxd +115 -0
- Cython/Includes/libcpp/mutex.pxd +387 -0
- Cython/Includes/libcpp/numbers.pxd +15 -0
- Cython/Includes/libcpp/numeric.pxd +131 -0
- Cython/Includes/libcpp/optional.pxd +34 -0
- Cython/Includes/libcpp/pair.pxd +1 -0
- Cython/Includes/libcpp/queue.pxd +25 -0
- Cython/Includes/libcpp/random.pxd +166 -0
- Cython/Includes/libcpp/semaphore.pxd +43 -0
- Cython/Includes/libcpp/set.pxd +228 -0
- Cython/Includes/libcpp/shared_mutex.pxd +96 -0
- Cython/Includes/libcpp/span.pxd +87 -0
- Cython/Includes/libcpp/stack.pxd +11 -0
- Cython/Includes/libcpp/stop_token.pxd +117 -0
- Cython/Includes/libcpp/string.pxd +355 -0
- Cython/Includes/libcpp/string_view.pxd +183 -0
- Cython/Includes/libcpp/typeindex.pxd +15 -0
- Cython/Includes/libcpp/typeinfo.pxd +10 -0
- Cython/Includes/libcpp/unordered_map.pxd +193 -0
- Cython/Includes/libcpp/unordered_set.pxd +152 -0
- Cython/Includes/libcpp/utility.pxd +30 -0
- Cython/Includes/libcpp/vector.pxd +186 -0
- Cython/Includes/numpy/math.pxd +150 -0
- Cython/Includes/openmp.pxd +50 -0
- Cython/Includes/posix/__init__.pxd +1 -0
- Cython/Includes/posix/dlfcn.pxd +14 -0
- Cython/Includes/posix/fcntl.pxd +86 -0
- Cython/Includes/posix/ioctl.pxd +4 -0
- Cython/Includes/posix/mman.pxd +101 -0
- Cython/Includes/posix/resource.pxd +57 -0
- Cython/Includes/posix/select.pxd +21 -0
- Cython/Includes/posix/signal.pxd +73 -0
- Cython/Includes/posix/stat.pxd +98 -0
- Cython/Includes/posix/stdio.pxd +37 -0
- Cython/Includes/posix/stdlib.pxd +29 -0
- Cython/Includes/posix/strings.pxd +9 -0
- Cython/Includes/posix/time.pxd +71 -0
- Cython/Includes/posix/types.pxd +30 -0
- Cython/Includes/posix/uio.pxd +26 -0
- Cython/Includes/posix/unistd.pxd +271 -0
- Cython/Includes/posix/wait.pxd +38 -0
- Cython/Plex/Actions.pxd +24 -0
- Cython/Plex/Actions.py +119 -0
- Cython/Plex/Actions.pyd +0 -0
- Cython/Plex/DFA.pxd +14 -0
- Cython/Plex/DFA.py +164 -0
- Cython/Plex/DFA.pyd +0 -0
- Cython/Plex/Errors.py +48 -0
- Cython/Plex/Lexicons.py +178 -0
- Cython/Plex/Machines.pxd +36 -0
- Cython/Plex/Machines.py +238 -0
- Cython/Plex/Machines.pyd +0 -0
- Cython/Plex/Regexps.py +535 -0
- Cython/Plex/Scanners.pxd +45 -0
- Cython/Plex/Scanners.py +328 -0
- Cython/Plex/Scanners.pyd +0 -0
- Cython/Plex/Transitions.pxd +14 -0
- Cython/Plex/Transitions.py +239 -0
- Cython/Plex/Transitions.pyd +0 -0
- Cython/Plex/__init__.py +34 -0
- Cython/Runtime/__init__.py +1 -0
- Cython/Runtime/refnanny.pyd +0 -0
- Cython/Runtime/refnanny.pyx +237 -0
- Cython/Shadow.py +690 -0
- Cython/Shadow.pyi +521 -0
- Cython/StringIOTree.py +170 -0
- Cython/StringIOTree.pyd +0 -0
- Cython/Tempita/__init__.py +4 -0
- Cython/Tempita/_looper.py +154 -0
- Cython/Tempita/_tempita.py +1091 -0
- Cython/Tempita/_tempita.pyd +0 -0
- Cython/TestUtils.py +422 -0
- Cython/Tests/TestCodeWriter.py +128 -0
- Cython/Tests/TestCythonUtils.py +202 -0
- Cython/Tests/TestJediTyper.py +223 -0
- Cython/Tests/TestShadow.py +114 -0
- Cython/Tests/TestStringIOTree.py +67 -0
- Cython/Tests/TestTestUtils.py +90 -0
- Cython/Tests/__init__.py +1 -0
- Cython/Tests/xmlrunner.py +390 -0
- Cython/Utility/AsyncGen.c +1031 -0
- Cython/Utility/Buffer.c +865 -0
- Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
- Cython/Utility/Builtins.c +810 -0
- Cython/Utility/CConvert.pyx +134 -0
- Cython/Utility/CMath.c +104 -0
- Cython/Utility/CommonStructures.c +226 -0
- Cython/Utility/Complex.c +378 -0
- Cython/Utility/Coroutine.c +2300 -0
- Cython/Utility/CpdefEnums.pyx +103 -0
- Cython/Utility/CppConvert.pyx +282 -0
- Cython/Utility/CppSupport.cpp +151 -0
- Cython/Utility/CythonFunction.c +1832 -0
- Cython/Utility/Dataclasses.c +101 -0
- Cython/Utility/Embed.c +121 -0
- Cython/Utility/Exceptions.c +1016 -0
- Cython/Utility/ExtensionTypes.c +996 -0
- Cython/Utility/FunctionArguments.c +1043 -0
- Cython/Utility/FusedFunction.pyx +44 -0
- Cython/Utility/ImportExport.c +907 -0
- Cython/Utility/MemoryView.pxd +188 -0
- Cython/Utility/MemoryView.pyx +1482 -0
- Cython/Utility/MemoryView_C.c +927 -0
- Cython/Utility/ModuleSetupCode.c +3203 -0
- Cython/Utility/NumpyImportArray.c +46 -0
- Cython/Utility/ObjectHandling.c +3273 -0
- Cython/Utility/Optimize.c +1603 -0
- Cython/Utility/Overflow.c +384 -0
- Cython/Utility/Printing.c +86 -0
- Cython/Utility/Profile.c +732 -0
- Cython/Utility/StringTools.c +1379 -0
- Cython/Utility/Synchronization.c +399 -0
- Cython/Utility/TString.c +356 -0
- Cython/Utility/TestCyUtilityLoader.pyx +8 -0
- Cython/Utility/TestCythonScope.pyx +75 -0
- Cython/Utility/TestUtilityLoader.c +12 -0
- Cython/Utility/TypeConversion.c +1385 -0
- Cython/Utility/UFuncs.pyx +50 -0
- Cython/Utility/UFuncs_C.c +89 -0
- Cython/Utility/__init__.py +28 -0
- Cython/Utility/arrayarray.h +167 -0
- Cython/Utils.py +687 -0
- Cython/Utils.pyd +0 -0
- Cython/__init__.py +10 -0
- Cython/__init__.pyi +7 -0
- Cython/py.typed +0 -0
- cython-3.2.0.dist-info/METADATA +85 -0
- cython-3.2.0.dist-info/RECORD +333 -0
- cython-3.2.0.dist-info/WHEEL +5 -0
- cython-3.2.0.dist-info/entry_points.txt +4 -0
- cython-3.2.0.dist-info/top_level.txt +3 -0
- cython.py +29 -0
- pyximport/__init__.py +4 -0
- pyximport/pyxbuild.py +160 -0
- pyximport/pyximport.py +482 -0
Cython/Plex/Scanners.py
ADDED
|
@@ -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]
|
Cython/Plex/Scanners.pyd
ADDED
|
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
|
Cython/Plex/__init__.py
ADDED
|
@@ -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
|