omlish 0.0.0.dev423__py3-none-any.whl → 0.0.0.dev484__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of omlish might be problematic. Click here for more details.

Files changed (464) hide show
  1. omlish/{.manifests.json → .omlish-manifests.json} +12 -0
  2. omlish/__about__.py +21 -18
  3. omlish/argparse/all.py +17 -9
  4. omlish/argparse/cli.py +16 -3
  5. omlish/argparse/utils.py +21 -0
  6. omlish/asyncs/all.py +0 -13
  7. omlish/asyncs/asyncio/rlock.py +110 -0
  8. omlish/asyncs/asyncio/subprocesses.py +2 -2
  9. omlish/asyncs/asyncio/sync.py +43 -0
  10. omlish/asyncs/asyncio/utils.py +2 -0
  11. omlish/asyncs/ioproxy/proxy.py +1 -1
  12. omlish/asyncs/sync.py +25 -0
  13. omlish/bootstrap/_marshal.py +1 -1
  14. omlish/bootstrap/diag.py +12 -21
  15. omlish/bootstrap/main.py +2 -5
  16. omlish/bootstrap/sys.py +27 -28
  17. omlish/c3.py +4 -1
  18. omlish/cexts/include/omlish/omlish.hh +1 -0
  19. omlish/collections/__init__.py +13 -1
  20. omlish/collections/attrregistry.py +210 -0
  21. omlish/collections/cache/impl.py +3 -2
  22. omlish/collections/identity.py +1 -0
  23. omlish/collections/mappings.py +28 -0
  24. omlish/collections/trie.py +5 -1
  25. omlish/collections/utils.py +77 -0
  26. omlish/concurrent/__init__.py +0 -11
  27. omlish/concurrent/all.py +18 -0
  28. omlish/concurrent/futures.py +25 -0
  29. omlish/concurrent/threadlets.py +1 -1
  30. omlish/configs/processing/flattening.py +1 -1
  31. omlish/configs/processing/merging.py +8 -6
  32. omlish/configs/types.py +1 -1
  33. omlish/daemons/__init__.py +70 -0
  34. omlish/daemons/daemon.py +2 -2
  35. omlish/daemons/launching.py +2 -2
  36. omlish/daemons/reparent.py +2 -3
  37. omlish/daemons/spawning.py +2 -3
  38. omlish/dataclasses/__init__.py +5 -5
  39. omlish/dataclasses/errors.py +1 -1
  40. omlish/dataclasses/impl/api/classes/decorator.py +3 -0
  41. omlish/dataclasses/impl/api/classes/make.py +4 -1
  42. omlish/dataclasses/impl/concerns/doc.py +1 -1
  43. omlish/dataclasses/impl/concerns/repr.py +15 -2
  44. omlish/dataclasses/impl/configs.py +97 -36
  45. omlish/dataclasses/impl/generation/compilation.py +21 -19
  46. omlish/dataclasses/impl/generation/globals.py +1 -0
  47. omlish/dataclasses/impl/generation/ops.py +1 -0
  48. omlish/dataclasses/impl/generation/processor.py +105 -24
  49. omlish/dataclasses/impl/processing/base.py +8 -0
  50. omlish/dataclasses/impl/processing/driving.py +8 -8
  51. omlish/dataclasses/specs.py +34 -2
  52. omlish/dataclasses/tools/as_.py +0 -12
  53. omlish/dataclasses/tools/modifiers.py +5 -0
  54. omlish/dataclasses/tools/static.py +1 -1
  55. omlish/diag/_pycharm/runhack.py +1 -1
  56. omlish/diag/{lslocks.py → cmds/lslocks.py} +6 -6
  57. omlish/diag/{lsof.py → cmds/lsof.py} +6 -6
  58. omlish/diag/{ps.py → cmds/ps.py} +6 -6
  59. omlish/diag/procfs.py +4 -4
  60. omlish/diag/pycharm.py +16 -2
  61. omlish/diag/pydevd.py +58 -40
  62. omlish/diag/replserver/console.py +3 -3
  63. omlish/diag/replserver/server.py +2 -2
  64. omlish/dispatch/__init__.py +18 -12
  65. omlish/dispatch/methods.py +50 -140
  66. omlish/dom/rendering.py +1 -1
  67. omlish/formats/dotenv.py +8 -8
  68. omlish/formats/json/stream/__init__.py +18 -3
  69. omlish/formats/json/stream/building.py +2 -2
  70. omlish/formats/json/stream/lexing.py +401 -67
  71. omlish/formats/json/stream/parsing.py +32 -10
  72. omlish/formats/json/stream/rendering.py +6 -6
  73. omlish/formats/json/stream/utils.py +132 -30
  74. omlish/formats/json5/literals.py +7 -4
  75. omlish/formats/json5/parsing.py +33 -79
  76. omlish/formats/json5/stream.py +77 -0
  77. omlish/formats/logfmt.py +8 -2
  78. omlish/funcs/genmachine.py +2 -2
  79. omlish/funcs/guard.py +225 -0
  80. omlish/graphs/dot/rendering.py +1 -1
  81. omlish/http/all.py +122 -53
  82. omlish/http/asgi.py +2 -2
  83. omlish/http/clients/__init__.py +0 -34
  84. omlish/http/clients/asyncs.py +153 -0
  85. omlish/http/clients/base.py +63 -122
  86. omlish/http/clients/coro/sync.py +171 -0
  87. omlish/http/clients/default.py +209 -30
  88. omlish/http/clients/executor.py +56 -0
  89. omlish/http/clients/httpx.py +78 -13
  90. omlish/http/clients/middleware.py +181 -0
  91. omlish/http/clients/sync.py +151 -0
  92. omlish/http/clients/syncasync.py +49 -0
  93. omlish/http/clients/urllib.py +8 -5
  94. omlish/http/coro/client/{client.py → connection.py} +43 -37
  95. omlish/http/coro/client/headers.py +5 -5
  96. omlish/http/coro/client/response.py +37 -38
  97. omlish/http/coro/client/status.py +4 -4
  98. omlish/http/coro/{client/io.py → io.py} +19 -2
  99. omlish/http/coro/server/fdio.py +10 -9
  100. omlish/http/coro/server/server.py +14 -41
  101. omlish/http/coro/server/sockets.py +7 -6
  102. omlish/http/flasky/__init__.py +40 -0
  103. omlish/http/flasky/_compat.py +2 -0
  104. omlish/http/flasky/api.py +82 -0
  105. omlish/http/flasky/app.py +203 -0
  106. omlish/http/flasky/cvs.py +59 -0
  107. omlish/http/flasky/requests.py +20 -0
  108. omlish/http/flasky/responses.py +23 -0
  109. omlish/http/flasky/routes.py +23 -0
  110. omlish/http/flasky/types.py +15 -0
  111. omlish/http/handlers.py +3 -2
  112. omlish/http/headers.py +69 -35
  113. omlish/http/sse.py +1 -1
  114. omlish/http/urls.py +67 -0
  115. omlish/inject/__init__.py +173 -126
  116. omlish/inject/_dataclasses.py +4986 -0
  117. omlish/inject/binder.py +10 -49
  118. omlish/inject/elements.py +27 -0
  119. omlish/inject/{utils.py → helpers/constfn.py} +3 -3
  120. omlish/inject/{tags.py → helpers/id.py} +2 -2
  121. omlish/inject/helpers/multis.py +143 -0
  122. omlish/inject/helpers/wrappers.py +54 -0
  123. omlish/inject/impl/elements.py +52 -22
  124. omlish/inject/impl/injector.py +76 -49
  125. omlish/inject/impl/inspect.py +11 -1
  126. omlish/inject/impl/maysync.py +43 -0
  127. omlish/inject/impl/multis.py +10 -7
  128. omlish/inject/impl/privates.py +8 -8
  129. omlish/inject/impl/providers.py +23 -34
  130. omlish/inject/impl/providersmap.py +43 -0
  131. omlish/inject/impl/proxy.py +0 -2
  132. omlish/inject/impl/scopes.py +19 -23
  133. omlish/inject/impl/sync.py +41 -0
  134. omlish/inject/injector.py +37 -8
  135. omlish/inject/inspect.py +35 -0
  136. omlish/inject/listeners.py +4 -4
  137. omlish/inject/managed.py +54 -18
  138. omlish/inject/maysync.py +27 -0
  139. omlish/inject/multis.py +8 -0
  140. omlish/inject/overrides.py +3 -3
  141. omlish/inject/privates.py +6 -0
  142. omlish/inject/providers.py +8 -1
  143. omlish/inject/scopes.py +40 -12
  144. omlish/inject/sync.py +49 -0
  145. omlish/io/buffers.py +119 -1
  146. omlish/io/readers.py +29 -0
  147. omlish/iterators/__init__.py +28 -20
  148. omlish/iterators/transforms.py +204 -0
  149. omlish/lang/__init__.py +240 -129
  150. omlish/lang/_asyncs.cc +186 -0
  151. omlish/lang/asyncs.py +67 -43
  152. omlish/lang/{attrs.py → attrstorage.py} +15 -15
  153. omlish/lang/cached/property.py +2 -2
  154. omlish/lang/casing.py +11 -0
  155. omlish/lang/classes/bindable.py +2 -3
  156. omlish/lang/classes/restrict.py +8 -0
  157. omlish/lang/classes/simple.py +26 -4
  158. omlish/lang/collections.py +1 -1
  159. omlish/lang/contextmanagers.py +59 -9
  160. omlish/lang/functions.py +31 -33
  161. omlish/lang/imports/_capture.cc +103 -0
  162. omlish/lang/imports/capture.py +902 -0
  163. omlish/lang/imports/lazy.py +0 -25
  164. omlish/lang/imports/proxy.py +559 -0
  165. omlish/lang/iterables.py +2 -2
  166. omlish/lang/lazyglobals.py +49 -14
  167. omlish/lang/maybes.py +2 -1
  168. omlish/lang/maysync.py +2 -2
  169. omlish/lang/params.py +17 -0
  170. omlish/lang/recursion.py +0 -1
  171. omlish/lang/resources.py +1 -1
  172. omlish/lang/sequences.py +124 -0
  173. omlish/lifecycles/contextmanagers.py +1 -2
  174. omlish/lifecycles/controller.py +1 -2
  175. omlish/lite/abstract.py +54 -24
  176. omlish/lite/asyncs.py +146 -0
  177. omlish/lite/attrops.py +415 -0
  178. omlish/lite/cached.py +57 -1
  179. omlish/lite/contextmanagers.py +4 -4
  180. omlish/lite/dataclasses.py +55 -0
  181. omlish/lite/inject.py +5 -4
  182. omlish/lite/marshal.py +1 -0
  183. omlish/lite/maybes.py +10 -2
  184. omlish/lite/maysync.py +22 -5
  185. omlish/lite/pycharm.py +1 -1
  186. omlish/lite/strings.py +0 -7
  187. omlish/lite/timing.py +6 -3
  188. omlish/lite/typing.py +6 -0
  189. omlish/logs/_amalg.py +8 -0
  190. omlish/logs/all.py +59 -31
  191. omlish/logs/base.py +204 -0
  192. omlish/logs/contexts.py +171 -0
  193. omlish/logs/formatters.py +13 -0
  194. omlish/logs/infos.py +377 -0
  195. omlish/logs/levels.py +97 -0
  196. omlish/logs/modules.py +13 -0
  197. omlish/logs/protocols.py +32 -0
  198. omlish/logs/standard.py +20 -15
  199. omlish/logs/std/configs.py +29 -0
  200. omlish/logs/{filters.py → std/filters.py} +1 -1
  201. omlish/logs/std/formatters.py +25 -0
  202. omlish/logs/std/handlers.py +19 -0
  203. omlish/logs/{json.py → std/json.py} +2 -2
  204. omlish/logs/std/loggers.py +48 -0
  205. omlish/logs/{proxy.py → std/proxy.py} +3 -3
  206. omlish/logs/std/records.py +671 -0
  207. omlish/logs/typed/bindings.py +108 -37
  208. omlish/logs/typed/types.py +17 -1
  209. omlish/logs/typed/values.py +2 -2
  210. omlish/logs/utils.py +60 -4
  211. omlish/logs/warnings.py +8 -0
  212. omlish/manifests/loading.py +8 -1
  213. omlish/marshal/__init__.py +54 -22
  214. omlish/marshal/_dataclasses.py +2774 -0
  215. omlish/marshal/base/configs.py +12 -0
  216. omlish/marshal/base/contexts.py +36 -21
  217. omlish/marshal/base/funcs.py +8 -11
  218. omlish/marshal/base/options.py +8 -0
  219. omlish/marshal/base/registries.py +146 -44
  220. omlish/marshal/base/types.py +40 -16
  221. omlish/marshal/composite/iterables.py +33 -20
  222. omlish/marshal/composite/literals.py +20 -18
  223. omlish/marshal/composite/mappings.py +36 -23
  224. omlish/marshal/composite/maybes.py +29 -19
  225. omlish/marshal/composite/newtypes.py +16 -16
  226. omlish/marshal/composite/optionals.py +14 -14
  227. omlish/marshal/composite/special.py +15 -15
  228. omlish/marshal/composite/unions/literals.py +93 -0
  229. omlish/marshal/composite/unions/primitives.py +103 -0
  230. omlish/marshal/factories/invalidate.py +18 -68
  231. omlish/marshal/factories/method.py +26 -0
  232. omlish/marshal/factories/moduleimport/factories.py +22 -65
  233. omlish/marshal/factories/multi.py +13 -25
  234. omlish/marshal/factories/recursive.py +42 -56
  235. omlish/marshal/factories/typecache.py +29 -74
  236. omlish/marshal/factories/typemap.py +42 -43
  237. omlish/marshal/objects/dataclasses.py +129 -106
  238. omlish/marshal/objects/marshal.py +18 -14
  239. omlish/marshal/objects/namedtuples.py +48 -42
  240. omlish/marshal/objects/unmarshal.py +19 -15
  241. omlish/marshal/polymorphism/marshal.py +9 -11
  242. omlish/marshal/polymorphism/metadata.py +16 -5
  243. omlish/marshal/polymorphism/standard.py +13 -1
  244. omlish/marshal/polymorphism/unions.py +15 -105
  245. omlish/marshal/polymorphism/unmarshal.py +9 -10
  246. omlish/marshal/singular/enums.py +14 -18
  247. omlish/marshal/standard.py +10 -6
  248. omlish/marshal/trivial/any.py +1 -1
  249. omlish/marshal/trivial/forbidden.py +21 -26
  250. omlish/math/fixed.py +2 -2
  251. omlish/metadata.py +23 -1
  252. omlish/os/atomics.py +2 -2
  253. omlish/os/forkhooks.py +4 -0
  254. omlish/os/journald.py +3 -3
  255. omlish/os/pidfiles/pinning.py +2 -2
  256. omlish/reflect/ops.py +9 -0
  257. omlish/reflect/types.py +44 -8
  258. omlish/secrets/marshal.py +1 -1
  259. omlish/secrets/secrets.py +6 -3
  260. omlish/sockets/addresses.py +1 -1
  261. omlish/sockets/server/handlers.py +2 -2
  262. omlish/sockets/server/server.py +4 -3
  263. omlish/sockets/server/ssl.py +2 -2
  264. omlish/specs/jmespath/__init__.py +12 -3
  265. omlish/specs/jmespath/_dataclasses.py +2893 -0
  266. omlish/specs/jmespath/ast.py +1 -1
  267. omlish/specs/jsonrpc/__init__.py +13 -0
  268. omlish/specs/jsonrpc/_marshal.py +32 -23
  269. omlish/specs/jsonrpc/conns.py +10 -7
  270. omlish/specs/jsonschema/_marshal.py +1 -1
  271. omlish/specs/jsonschema/keywords/__init__.py +7 -0
  272. omlish/specs/jsonschema/keywords/_dataclasses.py +1644 -0
  273. omlish/specs/openapi/_marshal.py +31 -22
  274. omlish/sql/__init__.py +15 -20
  275. omlish/sql/{tabledefs/alchemy.py → alchemy/tabledefs.py} +2 -2
  276. omlish/sql/queries/_marshal.py +3 -3
  277. omlish/sql/queries/params.py +1 -1
  278. omlish/sql/queries/rendering.py +1 -1
  279. omlish/sql/tabledefs/_marshal.py +1 -1
  280. omlish/subprocesses/all.py +135 -0
  281. omlish/subprocesses/base.py +8 -3
  282. omlish/subprocesses/editor.py +1 -1
  283. omlish/sync.py +181 -20
  284. omlish/term/alt.py +60 -0
  285. omlish/term/confirm.py +8 -8
  286. omlish/term/pager.py +235 -0
  287. omlish/term/terminfo.py +935 -0
  288. omlish/term/termstate.py +67 -0
  289. omlish/term/vt100/terminal.py +0 -3
  290. omlish/testing/pytest/plugins/asyncs/fixtures.py +4 -1
  291. omlish/testing/pytest/plugins/skips.py +2 -5
  292. omlish/testing/unittest/main.py +3 -3
  293. omlish/text/docwrap/__init__.py +3 -0
  294. omlish/text/docwrap/__main__.py +11 -0
  295. omlish/text/docwrap/api.py +83 -0
  296. omlish/text/docwrap/cli.py +86 -0
  297. omlish/text/docwrap/groups.py +84 -0
  298. omlish/text/docwrap/lists.py +167 -0
  299. omlish/text/docwrap/parts.py +146 -0
  300. omlish/text/docwrap/reflowing.py +106 -0
  301. omlish/text/docwrap/rendering.py +151 -0
  302. omlish/text/docwrap/utils.py +11 -0
  303. omlish/text/docwrap/wrapping.py +59 -0
  304. omlish/text/filecache.py +2 -2
  305. omlish/text/lorem.py +6 -0
  306. omlish/text/parts.py +2 -2
  307. omlish/text/textwrap.py +51 -0
  308. omlish/typedvalues/__init__.py +1 -1
  309. omlish/typedvalues/marshal.py +85 -59
  310. omlish/typedvalues/values.py +2 -1
  311. {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/METADATA +36 -38
  312. {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/RECORD +323 -385
  313. omlish/asyncs/bluelet/LICENSE +0 -6
  314. omlish/asyncs/bluelet/all.py +0 -67
  315. omlish/asyncs/bluelet/api.py +0 -23
  316. omlish/asyncs/bluelet/core.py +0 -178
  317. omlish/asyncs/bluelet/events.py +0 -79
  318. omlish/asyncs/bluelet/files.py +0 -80
  319. omlish/asyncs/bluelet/runner.py +0 -417
  320. omlish/asyncs/bluelet/sockets.py +0 -216
  321. omlish/asyncs/bridge.py +0 -359
  322. omlish/asyncs/utils.py +0 -18
  323. omlish/dataclasses/impl/generation/mangling.py +0 -18
  324. omlish/defs.py +0 -216
  325. omlish/dispatch/_dispatch2.py +0 -69
  326. omlish/dispatch/_dispatch3.py +0 -108
  327. omlish/dynamic.py +0 -219
  328. omlish/formats/json/Json.g4 +0 -77
  329. omlish/formats/json/_antlr/JsonLexer.py +0 -109
  330. omlish/formats/json/_antlr/JsonListener.py +0 -61
  331. omlish/formats/json/_antlr/JsonParser.py +0 -457
  332. omlish/formats/json/_antlr/JsonVisitor.py +0 -42
  333. omlish/formats/json5/Json5.g4 +0 -168
  334. omlish/formats/json5/_antlr/Json5Lexer.py +0 -354
  335. omlish/formats/json5/_antlr/Json5Listener.py +0 -79
  336. omlish/formats/json5/_antlr/Json5Parser.py +0 -617
  337. omlish/formats/json5/_antlr/Json5Visitor.py +0 -52
  338. omlish/funcs/match.py +0 -227
  339. omlish/io/trampoline.py +0 -289
  340. omlish/lang/imports/proxyinit.py +0 -665
  341. omlish/lite/logs.py +0 -4
  342. omlish/lite/reprs.py +0 -85
  343. omlish/logs/abc.py +0 -319
  344. omlish/logs/callers.py +0 -67
  345. omlish/logs/color.py +0 -27
  346. omlish/logs/configs.py +0 -29
  347. omlish/logs/handlers.py +0 -17
  348. omlish/logs/protocol.py +0 -218
  349. omlish/logs/timing.py +0 -58
  350. omlish/marshal/factories/match.py +0 -34
  351. omlish/marshal/factories/simple.py +0 -28
  352. omlish/specs/irc/messages/base.py +0 -49
  353. omlish/specs/irc/messages/formats.py +0 -92
  354. omlish/specs/irc/messages/messages.py +0 -774
  355. omlish/specs/irc/messages/parsing.py +0 -98
  356. omlish/specs/irc/numerics/formats.py +0 -97
  357. omlish/specs/irc/numerics/numerics.py +0 -865
  358. omlish/specs/irc/numerics/types.py +0 -59
  359. omlish/specs/irc/protocol/LICENSE +0 -11
  360. omlish/specs/irc/protocol/__init__.py +0 -61
  361. omlish/specs/irc/protocol/consts.py +0 -6
  362. omlish/specs/irc/protocol/errors.py +0 -30
  363. omlish/specs/irc/protocol/message.py +0 -21
  364. omlish/specs/irc/protocol/nuh.py +0 -55
  365. omlish/specs/irc/protocol/parsing.py +0 -158
  366. omlish/specs/irc/protocol/rendering.py +0 -153
  367. omlish/specs/irc/protocol/tags.py +0 -102
  368. omlish/specs/irc/protocol/utils.py +0 -30
  369. omlish/specs/proto/Protobuf3.g4 +0 -396
  370. omlish/specs/proto/__init__.py +0 -0
  371. omlish/specs/proto/_antlr/Protobuf3Lexer.py +0 -340
  372. omlish/specs/proto/_antlr/Protobuf3Listener.py +0 -448
  373. omlish/specs/proto/_antlr/Protobuf3Parser.py +0 -3909
  374. omlish/specs/proto/_antlr/Protobuf3Visitor.py +0 -257
  375. omlish/specs/proto/_antlr/__init__.py +0 -0
  376. omlish/specs/proto/nodes.py +0 -54
  377. omlish/specs/proto/parsing.py +0 -97
  378. omlish/sql/parsing/Minisql.g4 +0 -292
  379. omlish/sql/parsing/__init__.py +0 -0
  380. omlish/sql/parsing/_antlr/MinisqlLexer.py +0 -322
  381. omlish/sql/parsing/_antlr/MinisqlListener.py +0 -511
  382. omlish/sql/parsing/_antlr/MinisqlParser.py +0 -3763
  383. omlish/sql/parsing/_antlr/MinisqlVisitor.py +0 -292
  384. omlish/sql/parsing/_antlr/__init__.py +0 -0
  385. omlish/sql/parsing/parsing.py +0 -119
  386. omlish/text/antlr/__init__.py +0 -3
  387. omlish/text/antlr/_runtime/BufferedTokenStream.py +0 -305
  388. omlish/text/antlr/_runtime/CommonTokenFactory.py +0 -64
  389. omlish/text/antlr/_runtime/CommonTokenStream.py +0 -90
  390. omlish/text/antlr/_runtime/FileStream.py +0 -30
  391. omlish/text/antlr/_runtime/InputStream.py +0 -90
  392. omlish/text/antlr/_runtime/IntervalSet.py +0 -183
  393. omlish/text/antlr/_runtime/LICENSE.txt +0 -28
  394. omlish/text/antlr/_runtime/LL1Analyzer.py +0 -176
  395. omlish/text/antlr/_runtime/Lexer.py +0 -332
  396. omlish/text/antlr/_runtime/ListTokenSource.py +0 -147
  397. omlish/text/antlr/_runtime/Parser.py +0 -583
  398. omlish/text/antlr/_runtime/ParserInterpreter.py +0 -173
  399. omlish/text/antlr/_runtime/ParserRuleContext.py +0 -189
  400. omlish/text/antlr/_runtime/PredictionContext.py +0 -632
  401. omlish/text/antlr/_runtime/Recognizer.py +0 -150
  402. omlish/text/antlr/_runtime/RuleContext.py +0 -230
  403. omlish/text/antlr/_runtime/StdinStream.py +0 -14
  404. omlish/text/antlr/_runtime/Token.py +0 -158
  405. omlish/text/antlr/_runtime/TokenStreamRewriter.py +0 -258
  406. omlish/text/antlr/_runtime/Utils.py +0 -36
  407. omlish/text/antlr/_runtime/__init__.py +0 -2
  408. omlish/text/antlr/_runtime/_all.py +0 -24
  409. omlish/text/antlr/_runtime/_pygrun.py +0 -174
  410. omlish/text/antlr/_runtime/atn/ATN.py +0 -135
  411. omlish/text/antlr/_runtime/atn/ATNConfig.py +0 -162
  412. omlish/text/antlr/_runtime/atn/ATNConfigSet.py +0 -215
  413. omlish/text/antlr/_runtime/atn/ATNDeserializationOptions.py +0 -27
  414. omlish/text/antlr/_runtime/atn/ATNDeserializer.py +0 -449
  415. omlish/text/antlr/_runtime/atn/ATNSimulator.py +0 -50
  416. omlish/text/antlr/_runtime/atn/ATNState.py +0 -267
  417. omlish/text/antlr/_runtime/atn/ATNType.py +0 -20
  418. omlish/text/antlr/_runtime/atn/LexerATNSimulator.py +0 -573
  419. omlish/text/antlr/_runtime/atn/LexerAction.py +0 -301
  420. omlish/text/antlr/_runtime/atn/LexerActionExecutor.py +0 -146
  421. omlish/text/antlr/_runtime/atn/ParserATNSimulator.py +0 -1664
  422. omlish/text/antlr/_runtime/atn/PredictionMode.py +0 -502
  423. omlish/text/antlr/_runtime/atn/SemanticContext.py +0 -333
  424. omlish/text/antlr/_runtime/atn/Transition.py +0 -271
  425. omlish/text/antlr/_runtime/atn/__init__.py +0 -4
  426. omlish/text/antlr/_runtime/dfa/DFA.py +0 -136
  427. omlish/text/antlr/_runtime/dfa/DFASerializer.py +0 -76
  428. omlish/text/antlr/_runtime/dfa/DFAState.py +0 -129
  429. omlish/text/antlr/_runtime/dfa/__init__.py +0 -4
  430. omlish/text/antlr/_runtime/error/DiagnosticErrorListener.py +0 -111
  431. omlish/text/antlr/_runtime/error/ErrorListener.py +0 -75
  432. omlish/text/antlr/_runtime/error/ErrorStrategy.py +0 -712
  433. omlish/text/antlr/_runtime/error/Errors.py +0 -176
  434. omlish/text/antlr/_runtime/error/__init__.py +0 -4
  435. omlish/text/antlr/_runtime/tree/Chunk.py +0 -33
  436. omlish/text/antlr/_runtime/tree/ParseTreeMatch.py +0 -121
  437. omlish/text/antlr/_runtime/tree/ParseTreePattern.py +0 -75
  438. omlish/text/antlr/_runtime/tree/ParseTreePatternMatcher.py +0 -377
  439. omlish/text/antlr/_runtime/tree/RuleTagToken.py +0 -53
  440. omlish/text/antlr/_runtime/tree/TokenTagToken.py +0 -50
  441. omlish/text/antlr/_runtime/tree/Tree.py +0 -194
  442. omlish/text/antlr/_runtime/tree/Trees.py +0 -114
  443. omlish/text/antlr/_runtime/tree/__init__.py +0 -2
  444. omlish/text/antlr/_runtime/xpath/XPath.py +0 -278
  445. omlish/text/antlr/_runtime/xpath/XPathLexer.py +0 -98
  446. omlish/text/antlr/_runtime/xpath/__init__.py +0 -4
  447. omlish/text/antlr/delimit.py +0 -109
  448. omlish/text/antlr/dot.py +0 -41
  449. omlish/text/antlr/errors.py +0 -14
  450. omlish/text/antlr/input.py +0 -96
  451. omlish/text/antlr/parsing.py +0 -54
  452. omlish/text/antlr/runtime.py +0 -102
  453. omlish/text/antlr/utils.py +0 -38
  454. /omlish/{asyncs/bluelet → cexts}/__init__.py +0 -0
  455. /omlish/{formats/json/_antlr → diag/cmds}/__init__.py +0 -0
  456. /omlish/{formats/json5/_antlr → http/clients/coro}/__init__.py +0 -0
  457. /omlish/{specs/irc → inject/helpers}/__init__.py +0 -0
  458. /omlish/{specs/irc/messages → logs/std}/__init__.py +0 -0
  459. /omlish/logs/{noisy.py → std/noisy.py} +0 -0
  460. /omlish/{specs/irc/numerics → marshal/composite/unions}/__init__.py +0 -0
  461. {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/WHEEL +0 -0
  462. {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/entry_points.txt +0 -0
  463. {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/licenses/LICENSE +0 -0
  464. {omlish-0.0.0.dev423.dist-info → omlish-0.0.0.dev484.dist-info}/top_level.txt +0 -0
@@ -3,8 +3,6 @@ TODO:
3
3
  - max buf size
4
4
  - max recursion depth
5
5
  - mark start pos of tokens, currently returning end
6
- - _do_string inner loop optimization somehow
7
- - json5 mode
8
6
  """
9
7
  import dataclasses as dc
10
8
  import io
@@ -13,20 +11,25 @@ import re
13
11
  import typing as ta
14
12
 
15
13
  from .... import check
14
+ from .... import lang
16
15
  from ....funcs.genmachine import GenMachine
17
16
  from .errors import JsonStreamError
18
17
 
19
18
 
19
+ if ta.TYPE_CHECKING:
20
+ import unicodedata
21
+ else:
22
+ unicodedata = lang.proxy_import('unicodedata')
23
+
24
+
20
25
  ##
21
26
 
22
27
 
28
+ IdentTokenKind: ta.TypeAlias = ta.Literal['IDENT']
29
+
23
30
  ValueTokenKind: ta.TypeAlias = ta.Literal[
24
31
  'STRING',
25
32
  'NUMBER',
26
-
27
- 'SPECIAL_NUMBER',
28
- 'BOOLEAN',
29
- 'NULL',
30
33
  ]
31
34
 
32
35
  VALUE_TOKEN_KINDS = frozenset(check.isinstance(a, str) for a in ta.get_args(ValueTokenKind))
@@ -42,10 +45,14 @@ ControlTokenKind: ta.TypeAlias = ta.Literal[
42
45
 
43
46
  SpaceTokenKind: ta.TypeAlias = ta.Literal['SPACE']
44
47
 
48
+ CommentTokenKind: ta.TypeAlias = ta.Literal['COMMENT']
49
+
45
50
  TokenKind: ta.TypeAlias = ta.Union[ # noqa
51
+ IdentTokenKind,
46
52
  ValueTokenKind,
47
53
  ControlTokenKind,
48
54
  SpaceTokenKind,
55
+ CommentTokenKind,
49
56
  ]
50
57
 
51
58
 
@@ -90,16 +97,51 @@ CONTROL_TOKENS: ta.Mapping[str, TokenKind] = {
90
97
  ':': 'COLON',
91
98
  }
92
99
 
93
- CONST_TOKENS: ta.Mapping[str, tuple[TokenKind, str | float | None]] = {
94
- 'NaN': ('SPECIAL_NUMBER', float('nan')),
95
- 'Infinity': ('SPECIAL_NUMBER', float('inf')),
96
- '-Infinity': ('SPECIAL_NUMBER', float('-inf')),
100
+ CONST_IDENT_VALUES: ta.Mapping[str, str | float | None] = {
101
+ 'NaN': float('nan'),
102
+ '-NaN': float('-nan'), # distinguished in parsing even if indistinguishable in value
103
+ 'Infinity': float('inf'),
104
+ '-Infinity': float('-inf'),
97
105
 
98
- 'true': ('BOOLEAN', True),
99
- 'false': ('BOOLEAN', False),
100
- 'null': ('NULL', None),
106
+ 'true': True,
107
+ 'false': False,
108
+ 'null': None,
101
109
  }
102
110
 
111
+ MAX_CONST_IDENT_LEN = max(map(len, CONST_IDENT_VALUES))
112
+
113
+
114
+ ##
115
+
116
+
117
+ EXPANDED_SPACE_CHARS = (
118
+ '\u0009'
119
+ '\u000A'
120
+ '\u000B'
121
+ '\u000C'
122
+ '\u000D'
123
+ '\u0020'
124
+ '\u00A0'
125
+ '\u2028'
126
+ '\u2029'
127
+ '\uFEFF'
128
+ '\u1680'
129
+ '\u2000'
130
+ '\u2001'
131
+ '\u2002'
132
+ '\u2003'
133
+ '\u2004'
134
+ '\u2005'
135
+ '\u2006'
136
+ '\u2007'
137
+ '\u2008'
138
+ '\u2009'
139
+ '\u200A'
140
+ '\u202F'
141
+ '\u205F'
142
+ '\u3000'
143
+ )
144
+
103
145
 
104
146
  ##
105
147
 
@@ -116,11 +158,43 @@ class JsonStreamLexer(GenMachine[str, Token]):
116
158
  self,
117
159
  *,
118
160
  include_raw: bool = False,
161
+
162
+ allow_extended_space: bool = False,
119
163
  include_space: bool = False,
164
+
165
+ allow_comments: bool = False,
166
+ include_comments: bool = False,
167
+
168
+ allow_single_quotes: bool = False,
169
+ string_literal_parser: ta.Callable[[str], str] | None = None,
170
+
171
+ allow_extended_number_literals: bool = False,
172
+ number_literal_parser: ta.Callable[[str], ta.Any] | None = None,
173
+
174
+ allow_extended_idents: bool = False,
120
175
  ) -> None:
121
176
  self._include_raw = include_raw
177
+
178
+ self._allow_extended_space = allow_extended_space
122
179
  self._include_space = include_space
123
180
 
181
+ self._allow_comments = allow_comments
182
+ self._include_comments = include_comments
183
+
184
+ self._allow_single_quotes = allow_single_quotes
185
+ if string_literal_parser is None:
186
+ string_literal_parser = json.loads # noqa
187
+ self._string_literal_parser = string_literal_parser
188
+
189
+ self._allow_extended_number_literals = allow_extended_number_literals
190
+ self._number_literal_parser = number_literal_parser
191
+
192
+ self._allow_extended_idents = allow_extended_idents
193
+
194
+ self._char_in_str: str | None = None
195
+ self._char_in_str_len: int = 0
196
+ self._char_in_str_pos: int = 0
197
+
124
198
  self._ofs = 0
125
199
  self._line = 1
126
200
  self._col = 0
@@ -137,9 +211,9 @@ class JsonStreamLexer(GenMachine[str, Token]):
137
211
  self._col,
138
212
  )
139
213
 
140
- def _char_in(self, c: str) -> str:
214
+ def _advance_pos(self, c: str) -> str:
141
215
  if c and len(c) != 1:
142
- raise ValueError(c)
216
+ raise JsonStreamError(c)
143
217
 
144
218
  self._ofs += 1
145
219
 
@@ -151,11 +225,37 @@ class JsonStreamLexer(GenMachine[str, Token]):
151
225
 
152
226
  return c
153
227
 
228
+ def _yield_char_in(self, c: str) -> str:
229
+ if self._char_in_str is not None:
230
+ raise JsonStreamError
231
+
232
+ if (cl := len(c)) > 1:
233
+ self._char_in_str = c
234
+ self._char_in_str_len = cl
235
+ self._char_in_str_pos = 1
236
+ c = c[0]
237
+
238
+ self._advance_pos(c)
239
+
240
+ return c
241
+
242
+ def _str_char_in(self) -> str | None:
243
+ if (s := self._char_in_str) is None:
244
+ return None
245
+
246
+ if (p := self._char_in_str_pos) >= self._char_in_str_len:
247
+ self._char_in_str = None
248
+ return None
249
+
250
+ c = s[p]
251
+ self._char_in_str_pos += 1
252
+ return self._advance_pos(c)
253
+
154
254
  def _make_tok(
155
255
  self,
156
256
  kind: TokenKind,
157
257
  value: ScalarValue,
158
- raw: str,
258
+ raw: str | None,
159
259
  pos: Position,
160
260
  ) -> ta.Sequence[Token]:
161
261
  tok = Token(
@@ -175,14 +275,19 @@ class JsonStreamLexer(GenMachine[str, Token]):
175
275
  def _raise(self, msg: str, src: Exception | None = None) -> ta.NoReturn:
176
276
  raise JsonStreamLexError(msg, self.pos) from src
177
277
 
178
- def _do_main(self):
278
+ def _do_main(self, peek: str | None = None):
179
279
  while True:
180
- c = self._char_in((yield None)) # noqa
280
+ if peek is not None:
281
+ c = peek
282
+ peek = None
283
+ else:
284
+ if (c := self._str_char_in()) is None: # type: ignore[assignment]
285
+ c = self._yield_char_in((yield None)) # noqa
181
286
 
182
287
  if not c:
183
288
  return None
184
289
 
185
- if c.isspace():
290
+ if c.isspace() or (self._allow_extended_space and c in EXPANDED_SPACE_CHARS):
186
291
  if self._include_space:
187
292
  yield self._make_tok('SPACE', c, c, self.pos)
188
293
  continue
@@ -191,41 +296,127 @@ class JsonStreamLexer(GenMachine[str, Token]):
191
296
  yield self._make_tok(CONTROL_TOKENS[c], c, c, self.pos)
192
297
  continue
193
298
 
194
- if c == '"':
195
- return self._do_string()
299
+ if c == '"' or (self._allow_single_quotes and c == "'"):
300
+ return self._do_string(c)
196
301
 
197
- if c.isdigit() or c == '-':
302
+ if c.isdigit() or c == '-' or (self._allow_extended_number_literals and c in '.+'):
198
303
  return self._do_number(c)
199
304
 
305
+ if self._allow_comments and c == '/':
306
+ return self._do_comment()
307
+
308
+ if self._allow_extended_idents:
309
+ return self._do_extended_ident(c)
310
+
200
311
  if c in 'tfnIN':
201
312
  return self._do_const(c)
202
313
 
203
314
  self._raise(f'Unexpected character: {c}')
204
315
 
205
- def _do_string(self):
316
+ def _do_string(self, q: str):
206
317
  check.state(self._buf.tell() == 0)
207
- self._buf.write('"')
318
+ self._buf.write(q)
208
319
 
209
320
  pos = self.pos
210
321
 
322
+ #
323
+
324
+ buf = self._buf
325
+
326
+ char_in_str = self._char_in_str
327
+ char_in_str_len = self._char_in_str_len
328
+ char_in_str_pos = self._char_in_str_pos
329
+ ofs = self._ofs
330
+ line = self._line
331
+ col = self._col
332
+
333
+ def restore_state():
334
+ self._char_in_str = char_in_str
335
+ self._char_in_str_len = char_in_str_len
336
+ self._char_in_str_pos = char_in_str_pos
337
+ self._ofs = ofs
338
+ self._line = line
339
+ self._col = col
340
+
211
341
  last = None
212
342
  while True:
213
- try:
214
- c = self._char_in((yield None)) # noqa
215
- except GeneratorExit:
216
- self._raise('Unexpected end of input')
343
+ c: str | None = None
344
+
345
+ while True:
346
+ if char_in_str is not None:
347
+ if char_in_str_pos >= char_in_str_len:
348
+ char_in_str = None
349
+ continue
350
+
351
+ skip_to = char_in_str_len
352
+ if (qp := char_in_str.find(q, char_in_str_pos)) >= 0 and qp < skip_to:
353
+ skip_to = qp
354
+ if (sp := char_in_str.find('\\', char_in_str_pos)) >= 0 and sp < skip_to:
355
+ skip_to = sp
356
+
357
+ if skip_to != char_in_str_pos:
358
+ ofs += skip_to - char_in_str_pos
359
+ if (np := char_in_str.rfind('\n', char_in_str_pos, skip_to)) >= 0:
360
+ line += char_in_str.count('\n', char_in_str_pos, skip_to)
361
+ col = np - char_in_str_pos
362
+ else:
363
+ col += skip_to - char_in_str_pos
364
+ buf.write(char_in_str[char_in_str_pos:skip_to])
365
+
366
+ if skip_to >= char_in_str_len:
367
+ char_in_str = None
368
+ continue
369
+ char_in_str_pos = skip_to
370
+
371
+ c = char_in_str[char_in_str_pos]
372
+ char_in_str_pos += 1
373
+
374
+ if c is None:
375
+ try:
376
+ c = (yield None)
377
+ except GeneratorExit:
378
+ restore_state()
379
+ self._raise('Unexpected end of input')
380
+
381
+ if len(c) > 1:
382
+ char_in_str = c
383
+ char_in_str_len = len(char_in_str)
384
+ char_in_str_pos = 0
385
+ c = None
386
+ continue
387
+
388
+ if c is None:
389
+ raise JsonStreamError
390
+
391
+ if c and len(c) != 1:
392
+ raise JsonStreamError(c)
393
+
394
+ break
395
+
396
+ ofs += 1
397
+
398
+ if c == '\n':
399
+ line += 1
400
+ col = 0
401
+ else:
402
+ col += 1
217
403
 
218
404
  if not c:
219
- self._raise(f'Unterminated string literal: {self._buf.getvalue()}')
405
+ restore_state()
406
+ self._raise(f'Unterminated string literal: {buf.getvalue()}')
220
407
 
221
- self._buf.write(c)
222
- if c == '"' and last != '\\':
408
+ buf.write(c)
409
+ if c == q and last != '\\':
223
410
  break
224
411
  last = c
225
412
 
413
+ restore_state()
414
+
415
+ #
416
+
226
417
  raw = self._flip_buf()
227
418
  try:
228
- sv = json.loads(raw)
419
+ sv = self._string_literal_parser(raw)
229
420
  except json.JSONDecodeError as e:
230
421
  self._raise(f'Invalid string literal: {raw!r}', e)
231
422
 
@@ -241,14 +432,15 @@ class JsonStreamLexer(GenMachine[str, Token]):
241
432
 
242
433
  while True:
243
434
  try:
244
- c = self._char_in((yield None)) # noqa
435
+ if (c := self._str_char_in()) is None: # type: ignore[assignment]
436
+ c = self._yield_char_in((yield None)) # noqa
245
437
  except GeneratorExit:
246
438
  self._raise('Unexpected end of input')
247
439
 
248
440
  if not c:
249
441
  break
250
442
 
251
- if not (c.isdigit() or c in '.eE+-'):
443
+ if not (c.isdigit() or c in '.eE+-' or (self._allow_extended_number_literals and c in 'xXabcdefABCDEF')):
252
444
  break
253
445
  self._buf.write(c)
254
446
 
@@ -256,33 +448,59 @@ class JsonStreamLexer(GenMachine[str, Token]):
256
448
 
257
449
  #
258
450
 
259
- if not NUMBER_PAT.fullmatch(raw):
260
- # Can only be -Infinity
451
+ if self._allow_extended_number_literals:
452
+ p = 1 if raw[0] in '+-' else 0
453
+ if (len(raw) - p) > 1 and raw[p] == '0' and raw[p + 1].isdigit():
454
+ self._raise('Invalid number literal')
261
455
 
262
- if not c:
263
- self._raise('Unexpected end of input')
456
+ if raw == '-' or (self._allow_extended_number_literals and raw == '+'):
457
+ for svs in [
458
+ 'Infinity',
459
+ *(['NaN'] if self._allow_extended_number_literals else []),
460
+ ]:
461
+ if c != svs[0]:
462
+ continue
264
463
 
265
- raw += c
266
- try:
267
- for _ in range(7):
268
- raw += self._char_in((yield None)) # noqa
269
- except GeneratorExit:
270
- self._raise('Unexpected end of input')
464
+ if not c:
465
+ self._raise('Unexpected end of input')
271
466
 
272
- if raw != '-Infinity':
273
- self._raise(f'Invalid number format: {raw}')
467
+ raw += c
468
+ try:
469
+ for _ in range(len(svs) - 1):
470
+ if (c := self._str_char_in()) is None: # type: ignore[assignment]
471
+ c = self._yield_char_in((yield None)) # noqa
472
+ if not c:
473
+ break
474
+ raw += c
475
+ except GeneratorExit:
476
+ self._raise('Unexpected end of input')
477
+
478
+ if raw[1:] != svs:
479
+ self._raise(f'Invalid number format: {raw}')
274
480
 
275
- tk, tv = CONST_TOKENS[raw]
276
- yield self._make_tok(tk, tv, raw, pos)
481
+ if raw[0] == '+':
482
+ raw = raw[1:]
277
483
 
278
- return self._do_main()
484
+ yield self._make_tok('IDENT', raw, raw, pos)
485
+
486
+ return self._do_main()
279
487
 
280
488
  #
281
489
 
282
- if '.' in raw or 'e' in raw or 'E' in raw:
283
- nv = float(raw)
490
+ nv: ta.Any
491
+
492
+ if (np := self._number_literal_parser) is not None:
493
+ nv = np(raw)
494
+
284
495
  else:
285
- nv = int(raw)
496
+ if not NUMBER_PAT.fullmatch(raw):
497
+ self._raise(f'Invalid number format: {raw}')
498
+
499
+ if '.' in raw or 'e' in raw or 'E' in raw:
500
+ nv = float(raw)
501
+ else:
502
+ nv = int(raw)
503
+
286
504
  yield self._make_tok('NUMBER', nv, raw, pos)
287
505
 
288
506
  #
@@ -290,34 +508,150 @@ class JsonStreamLexer(GenMachine[str, Token]):
290
508
  if not c:
291
509
  return None
292
510
 
293
- if c in CONTROL_TOKENS:
294
- yield self._make_tok(CONTROL_TOKENS[c], c, c, pos)
511
+ return self._do_main(c)
295
512
 
296
- elif c.isspace():
297
- if self._include_space:
298
- yield self._make_tok('SPACE', c, c, self.pos)
513
+ def _do_const(self, c: str):
514
+ pos = self.pos
515
+ raw = c
516
+ while True:
517
+ try:
518
+ if (c := self._str_char_in()) is None: # type: ignore[assignment]
519
+ c = self._yield_char_in((yield None)) # noqa
520
+ except GeneratorExit:
521
+ self._raise('Unexpected end of input')
299
522
 
300
- else:
301
- self._raise(f'Unexpected character after number: {c}')
523
+ raw += c
524
+
525
+ if raw in CONST_IDENT_VALUES:
526
+ break
527
+
528
+ if len(raw) > MAX_CONST_IDENT_LEN:
529
+ self._raise(f'Invalid literal: {raw}')
530
+
531
+ yield self._make_tok('IDENT', raw, raw, pos)
302
532
 
303
533
  return self._do_main()
304
534
 
305
- def _do_const(self, c: str):
535
+ def _do_unicode_escape(self):
536
+ try:
537
+ if (c := self._str_char_in()) is None:
538
+ c = self._yield_char_in((yield None)) # noqa
539
+ except GeneratorExit:
540
+ self._raise('Unexpected end of input')
541
+
542
+ if c != 'u':
543
+ self._raise('Illegal identifier escape')
544
+
545
+ ux = []
546
+ for _ in range(4):
547
+ try:
548
+ if (c := self._str_char_in()) is None:
549
+ c = self._yield_char_in((yield None)) # noqa
550
+ except GeneratorExit:
551
+ self._raise('Unexpected end of input')
552
+
553
+ if c not in '0123456789abcdefABCDEF':
554
+ self._raise('Illegal identifier escape')
555
+
556
+ ux.append(c)
557
+
558
+ return chr(int(''.join(ux), 16))
559
+
560
+ def _do_extended_ident(self, c: str):
561
+ check.state(self._buf.tell() == 0)
562
+
563
+ if c == '\\':
564
+ c = yield from self._do_unicode_escape()
565
+
566
+ elif not (c in '$_' or unicodedata.category(c).startswith('L')):
567
+ self._raise('Illegal identifier start')
568
+
569
+ self._buf.write(c)
570
+
306
571
  pos = self.pos
307
- raw = c
572
+
308
573
  while True:
309
574
  try:
310
- raw += self._char_in((yield None)) # noqa
575
+ if (c := self._str_char_in()) is None: # type: ignore[assignment]
576
+ c = self._yield_char_in((yield None)) # noqa
311
577
  except GeneratorExit:
312
578
  self._raise('Unexpected end of input')
313
579
 
314
- if raw in CONST_TOKENS:
580
+ if c == '\\':
581
+ c = yield from self._do_unicode_escape()
582
+ self._buf.write(c)
583
+ continue
584
+
585
+ if not c:
315
586
  break
316
587
 
317
- if len(raw) > 8: # None of the keywords are longer than 8 characters
318
- self._raise(f'Invalid literal: {raw}')
588
+ if c not in '$_\u200C\u200D':
589
+ uc = unicodedata.category(c)
590
+ if not (uc.startswith(('L', 'M', 'N')) or uc == 'Pc'):
591
+ break
592
+
593
+ self._buf.write(c)
594
+
595
+ raw = self._flip_buf()
596
+
597
+ yield self._make_tok('IDENT', raw, raw, pos)
319
598
 
320
- tk, tv = CONST_TOKENS[raw]
321
- yield self._make_tok(tk, tv, raw, pos)
599
+ return self._do_main(c)
600
+
601
+ def _do_comment(self):
602
+ check.state(self._buf.tell() == 0)
603
+
604
+ pos = self.pos
605
+ try:
606
+ if (oc := self._str_char_in()) is None:
607
+ oc = self._yield_char_in((yield None)) # noqa
608
+ except GeneratorExit:
609
+ self._raise('Unexpected end of input')
610
+
611
+ if oc == '/':
612
+ while True:
613
+ try:
614
+ if (ic := self._str_char_in()) is None:
615
+ ic = self._yield_char_in((yield None)) # noqa
616
+ except GeneratorExit:
617
+ self._raise('Unexpected end of input')
618
+
619
+ if not ic or ic == '\n':
620
+ break
621
+
622
+ if self._include_comments:
623
+ self._buf.write(ic)
624
+
625
+ if self._include_comments:
626
+ cmt = self._flip_buf()
627
+ raw = f'//{cmt}\n' if self._include_raw else None
628
+ yield self._make_tok('COMMENT', cmt, raw, pos)
629
+
630
+ if not ic:
631
+ return
632
+
633
+ elif oc == '*':
634
+ lc: str | None = None
635
+ while True:
636
+ try:
637
+ if (ic := self._str_char_in()) is None:
638
+ ic = self._yield_char_in((yield None)) # noqa
639
+ except GeneratorExit:
640
+ self._raise('Unexpected end of input')
641
+
642
+ if lc == '*' and ic == '/':
643
+ break
644
+
645
+ if lc is not None and self._include_comments:
646
+ self._buf.write(lc)
647
+ lc = ic
648
+
649
+ if self._include_comments:
650
+ cmt = self._flip_buf()
651
+ raw = f'/*{cmt}*/' if self._include_raw else None
652
+ yield self._make_tok('COMMENT', cmt, raw, pos)
653
+
654
+ else:
655
+ self._raise(f'Unexpected character after comment start: {oc}')
322
656
 
323
657
  return self._do_main()