opencrbasic 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. opencrbasic/__init__.py +3 -0
  2. opencrbasic/__main__.py +5 -0
  3. opencrbasic/analysis.py +184 -0
  4. opencrbasic/bindings.py +1034 -0
  5. opencrbasic/catalog.py +173 -0
  6. opencrbasic/checkconfig.py +144 -0
  7. opencrbasic/checker/__init__.py +977 -0
  8. opencrbasic/checker/cr3xx.py +3118 -0
  9. opencrbasic/checker/ess.py +81 -0
  10. opencrbasic/checker/expressions.py +3581 -0
  11. opencrbasic/checker/instr_data.py +1802 -0
  12. opencrbasic/checker/instr_measure.py +1547 -0
  13. opencrbasic/checker/instr_rules.py +3540 -0
  14. opencrbasic/checker/instructions.py +17 -0
  15. opencrbasic/checker/intervals.py +678 -0
  16. opencrbasic/checker/longconv.py +133 -0
  17. opencrbasic/checker/scan_time.py +580 -0
  18. opencrbasic/checker/storage.py +456 -0
  19. opencrbasic/checker/structs.py +240 -0
  20. opencrbasic/checker/structure.py +6213 -0
  21. opencrbasic/checker/symbols.py +609 -0
  22. opencrbasic/checker/terminals.py +249 -0
  23. opencrbasic/checker/unused.py +186 -0
  24. opencrbasic/checker/var_types.py +564 -0
  25. opencrbasic/checker/warnings.py +661 -0
  26. opencrbasic/checks.py +491 -0
  27. opencrbasic/cli.py +391 -0
  28. opencrbasic/commands.py +128 -0
  29. opencrbasic/compiler.py +320 -0
  30. opencrbasic/consteval.py +327 -0
  31. opencrbasic/data/background_calibration.json +4 -0
  32. opencrbasic/data/before_beginprog.json +99 -0
  33. opencrbasic/data/cr1000x/background_calibration.json +4 -0
  34. opencrbasic/data/cr1000x/before_beginprog.json +138 -0
  35. opencrbasic/data/cr1000x/ess_variables.json +1087 -0
  36. opencrbasic/data/cr1000x/fnotch.json +29 -0
  37. opencrbasic/data/cr1000x/functions.json +1337 -0
  38. opencrbasic/data/cr1000x/instructions.json +4836 -0
  39. opencrbasic/data/cr1000x/measure.json +121 -0
  40. opencrbasic/data/cr1000x/mode.json +111 -0
  41. opencrbasic/data/cr1000x/pipeline_tasks.json +88 -0
  42. opencrbasic/data/cr1000x/settings_fields.json +321 -0
  43. opencrbasic/data/cr1000x/status_members.json +318 -0
  44. opencrbasic/data/cr1000x/symbols.json +872 -0
  45. opencrbasic/data/cr1000x/terminals.json +225 -0
  46. opencrbasic/data/cr300/before_beginprog.json +42 -0
  47. opencrbasic/data/cr300/ess_variables.json +1087 -0
  48. opencrbasic/data/cr300/fnotch.json +22 -0
  49. opencrbasic/data/cr300/functions.json +1261 -0
  50. opencrbasic/data/cr300/instructions.json +2837 -0
  51. opencrbasic/data/cr300/measure.json +33 -0
  52. opencrbasic/data/cr300/mode.json +121 -0
  53. opencrbasic/data/cr300/settings_fields.json +259 -0
  54. opencrbasic/data/cr300/status_members.json +303 -0
  55. opencrbasic/data/cr300/symbols.json +584 -0
  56. opencrbasic/data/cr300/terminals.json +193 -0
  57. opencrbasic/data/cr350/before_beginprog.json +44 -0
  58. opencrbasic/data/cr350/ess_variables.json +1087 -0
  59. opencrbasic/data/cr350/fnotch.json +22 -0
  60. opencrbasic/data/cr350/functions.json +1262 -0
  61. opencrbasic/data/cr350/instructions.json +2848 -0
  62. opencrbasic/data/cr350/measure.json +35 -0
  63. opencrbasic/data/cr350/mode.json +121 -0
  64. opencrbasic/data/cr350/settings_fields.json +292 -0
  65. opencrbasic/data/cr350/status_members.json +303 -0
  66. opencrbasic/data/cr350/symbols.json +572 -0
  67. opencrbasic/data/cr350/terminals.json +190 -0
  68. opencrbasic/data/ess_variables.json +1087 -0
  69. opencrbasic/data/fnotch.json +34 -0
  70. opencrbasic/data/functions.json +1337 -0
  71. opencrbasic/data/instructions.json +4965 -0
  72. opencrbasic/data/measure.json +123 -0
  73. opencrbasic/data/mode.json +121 -0
  74. opencrbasic/data/notices_cr6.json +890 -0
  75. opencrbasic/data/pipeline_tasks.json +84 -0
  76. opencrbasic/data/settings_fields.json +322 -0
  77. opencrbasic/data/status_members.json +319 -0
  78. opencrbasic/data/status_table.json +684 -0
  79. opencrbasic/data/symbols.json +902 -0
  80. opencrbasic/data/terminals.json +195 -0
  81. opencrbasic/data/type_codes.json +249 -0
  82. opencrbasic/diagnostics.py +196 -0
  83. opencrbasic/editing.py +827 -0
  84. opencrbasic/formatting.py +310 -0
  85. opencrbasic/helpdocs.py +677 -0
  86. opencrbasic/hover.py +667 -0
  87. opencrbasic/inlay.py +169 -0
  88. opencrbasic/lexer.py +183 -0
  89. opencrbasic/lsp/__init__.py +5 -0
  90. opencrbasic/lsp/__main__.py +7 -0
  91. opencrbasic/lsp/config.py +202 -0
  92. opencrbasic/lsp/features.py +602 -0
  93. opencrbasic/lsp/server.py +741 -0
  94. opencrbasic/lsp/session.py +1189 -0
  95. opencrbasic/lsp/worker.py +128 -0
  96. opencrbasic/mode.py +143 -0
  97. opencrbasic/navigation.py +401 -0
  98. opencrbasic/parser.py +3264 -0
  99. opencrbasic/positions.py +274 -0
  100. opencrbasic/preprocess.py +269 -0
  101. opencrbasic/profiles.py +266 -0
  102. opencrbasic/provenance.py +17 -0
  103. opencrbasic/quickfix.py +331 -0
  104. opencrbasic/rename.py +662 -0
  105. opencrbasic/signature.py +33 -0
  106. opencrbasic/source.py +600 -0
  107. opencrbasic/sources.py +125 -0
  108. opencrbasic/syntax.py +337 -0
  109. opencrbasic/tables.py +2173 -0
  110. opencrbasic/tables_hook.py +14 -0
  111. opencrbasic/tdf.py +142 -0
  112. opencrbasic/timing.py +565 -0
  113. opencrbasic-1.0.0.dist-info/METADATA +223 -0
  114. opencrbasic-1.0.0.dist-info/RECORD +117 -0
  115. opencrbasic-1.0.0.dist-info/WHEEL +4 -0
  116. opencrbasic-1.0.0.dist-info/entry_points.txt +3 -0
  117. opencrbasic-1.0.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,223 @@
1
+ Metadata-Version: 2.5
2
+ Name: opencrbasic
3
+ Version: 1.0.0
4
+ Summary: Open-source re-implementation of the Campbell Scientific CRBasic pre-compilers (CR6, CR1000X, CR300, CR350)
5
+ Project-URL: Repository, https://github.com/UtrechtUniversity/open-crbasic
6
+ Author: Utrecht University
7
+ License-Expression: MIT
8
+ License-File: LICENSE
9
+ Classifier: Operating System :: OS Independent
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Topic :: Scientific/Engineering
12
+ Classifier: Topic :: Software Development :: Compilers
13
+ Requires-Python: >=3.15
14
+ Provides-Extra: lsp
15
+ Requires-Dist: pygls<3,>=2.1.1; extra == 'lsp'
16
+ Description-Content-Type: text/markdown
17
+
18
+ # opencrbasic
19
+
20
+ A native re-implementation of Campbell Scientific's CRBasic pre-compilers for the CR6, CR1000X,
21
+ CR300 and CR350 dataloggers (`CR6Comp.exe`, `cr1000xcomp.exe`, `cr300comp.exe`, `cr350comp.exe`),
22
+ with a language server. It runs on Linux, macOS and Windows with only Python 3.15+, no Wine and no
23
+ Windows binaries. It is MIT licensed and not affiliated with Campbell Scientific; provenance and
24
+ what this repository deliberately leaves out are in the [legal notes](docs/legal.md). Version 1.0:
25
+ [release record](docs/release-1.0.md).
26
+
27
+ ```bash
28
+ pip install opencrbasic # crbc, the compiler
29
+ pip install "opencrbasic[lsp]" # also crbc-lsp, the language server
30
+ ```
31
+
32
+ The VS Code extension lives in [open-crbasic-vsix](https://github.com/UtrechtUniversity/open-crbasic-vsix);
33
+ agent skills for writing CRBasic in [open-crbasic-skills](https://github.com/UtrechtUniversity/open-crbasic-skills).
34
+
35
+ Status, measured against the real compilers: `PROGRESS.md`. Design and the v1.0 milestones:
36
+ [`PLAN.md`](PLAN.md#v10-milestones).
37
+
38
+ ## Scope
39
+
40
+ - **Gated profiles: CR6 and CR1000X.** On these, v1.0 gates the reference verdict in the relevant
41
+ area (the FirnMelt/GEUS instruction set and language constructs), the execution mode, and the
42
+ first error for realistic mistakes on relevant rules, measured on the FirnMelt programs, the 507
43
+ CRBasic help examples, the 66 GEUS programs, the saved fuzz replay and fresh `--relevant` fuzz
44
+ seeds. The help examples and GEUS programs are not redistributed here; see
45
+ [tests/corpus/README.md](tests/corpus/README.md) for running against local copies. One relevant-area false accept is known: a `Sub` name that is also another routine's
46
+ parameter, used as a value. CR300 and CR350 are best effort: measured and kept, not gated (human
47
+ decision 2026-10-24).
48
+ - **Outputs.** stdout, the message file, `-s`, `-u`, `-p`/`-i`, `-l`/`-c` and the CR6 TDF (`-z`) are
49
+ compared byte for byte by the [artifact matrix](docs/artifacts.md), which also lists what is best
50
+ effort per profile. `-t` covers the oracle-fitted instruction set (`docs/cli.md`).
51
+ - **Excluded:** the CDM binary image of `-b` ([PLAN](PLAN.md#explicit-exclusions-from-parity)).
52
+ - Known remaining cases (false accepts outside the relevant set, first-error decisions, matrix
53
+ differences) are listed in the release record.
54
+
55
+ ## Three channels
56
+
57
+ Every finding belongs to one channel ([PLAN](PLAN.md#three-diagnostic-channels)):
58
+
59
+ 1. **Reference diagnostics**: what the reference compiler reports. Default `crbc` stdout, the message
60
+ file and the exit status carry only these, so `crbc` stays a drop-in.
61
+ 2. **opencrbasic checks** (`OCB001`-`OCB007`): likely defects the reference accepts, each with
62
+ evidence, controls and a default severity; `crbc --strict` (stderr, exit 3 on a check error),
63
+ `--report`, `opencrbasic.toml`, and the editor (source `opencrbasic (check)`). See
64
+ `docs/checker.md` "opencrbasic checks OCB002-OCB007 (M3)".
65
+ 3. **Coverage notices**: CR6 reference rules opencrbasic is known not to model, from the
66
+ [evidence inventory](docs/inventory.md); `--report` and, when enabled, editor hints. Information,
67
+ never a verdict.
68
+
69
+ ## Accepted differences
70
+
71
+ In the differential tools, equal means equal exit status and equal stdout after whitespace
72
+ normalization (line endings, trailing spaces); the artifact matrix compares bytes. By the human decision of 2026-10-24, differences in the order,
73
+ wording or cascade of diagnostics after the first error are accepted and do not block a release;
74
+ differences in the first error are fixed when they come from a realistic mistake and otherwise
75
+ recorded in [`docs/first-error-review.md`](docs/first-error-review.md). Runner failures and
76
+ reference crashes are never counted as verdicts.
77
+
78
+ ## Versions
79
+
80
+ - The package version (`pyproject.toml`) and `opencrbasic.__version__` are one number
81
+ (`tests/test_versions.py`). Major: a change to the drop-in contract or a gated verdict policy;
82
+ minor: new checks, notices or features; patch: fixes. The VS Code extension, in its own repository, has its
83
+ own version.
84
+ - `analysis.API_VERSION` (now 2) versions the editor facade; the language server refuses to start
85
+ with another (`docs/lsp-api.md`). `checks.SCHEMA_VERSION` (now 2) versions the `--report` JSON.
86
+ Each is bumped only on an incompatible change.
87
+
88
+ ## Use
89
+
90
+ Python dependencies are managed with [uv](https://docs.astral.sh/uv/). The package itself has
91
+ no runtime dependencies; the `dev` group adds pytest, pefile (for the reverse-engineering tools),
92
+ pygls, pyrefly and pre-commit.
93
+
94
+ ```bash
95
+ uv sync # environment from uv.lock
96
+ uv run pre-commit install # ruff, pyrefly and file hygiene on every commit
97
+ uv run crbc Program.CR6 # compile
98
+ uv run pytest -q -n auto # tests
99
+ uv tool install . # optional: `crbc` on PATH outside the project
100
+ ```
101
+
102
+ Contributor and agent conventions: [AGENTS.md](AGENTS.md).
103
+
104
+ `crbc` is a drop-in for `CR6Comp.exe` (`docs/cli.md`):
105
+
106
+ ```
107
+ crbc [options] program [messagefile]
108
+ -s also print ProgSignature
109
+ -z FILE write the binary table definition file (TDF)
110
+ -l FILE write the text table list (also -c)
111
+ -v / -d print version (then compile / and exit)
112
+ --logger L cr6 | cr1000x | cr300 | cr350 (default: from the file extension
113
+ .CR6/.CR1X/.CR300/.CR350, else cr6)
114
+ --no-message-file do not write the message file (CR6cmple.xxx, CR1000Xcmple.xxx, ...)
115
+ --strict also run opencrbasic checks (likely defects the reference accepts) on stderr;
116
+ exit 3 when the program compiles but a check reports an error
117
+ (exit 4: invalid opencrbasic.toml)
118
+ --report FILE write a JSON report (reference verdict and diagnostics, check findings)
119
+ --config FILE use this opencrbasic.toml (default: nearest ancestor of the program)
120
+ --check CODE=SEVERITY set a check severity (error|warning|info|off); repeatable
121
+ ```
122
+
123
+ Check configuration and the report schema: `docs/checker.md` "Check configuration and report file".
124
+
125
+ Output follows the exe's format: `Program.CR6 -- Compiled in SequentialMode.` (CR300/CR350:
126
+ `-- Compiled OK.`), `Warning: ...` lines, or `-- Compile Failed!` followed by `line N: message`
127
+ lines; the same text goes to `<LOGGER>cmple.xxx` (for example `CR6cmple.xxx`) with CRLF line
128
+ endings; exit status 0 or 1.
129
+
130
+ As a library:
131
+
132
+ ```python
133
+ from pathlib import Path
134
+ from opencrbasic import profiles
135
+ from opencrbasic.compiler import compile_file
136
+
137
+ result = compile_file(Path("Main.CR6"), profiles.get("cr6"))
138
+ result.ok, result.mode, result.signature
139
+ [d.cr6comp() for d in result.diagnostics.items]
140
+ result.tables # list of tdf.TdfTable (Status, DataTables, DataTableInfo, ConstTable, Public)
141
+ ```
142
+
143
+ `parser.parse_file()` gives the syntax tree (`syntax.py`) for other tools.
144
+
145
+ [openloggernet](https://github.com/UtrechtUniversity/open-loggernet) uses opencrbasic when
146
+ `CR6COMP=opencrbasic` is set, and the FirnMelt station repository compiles every program with it in
147
+ CI.
148
+
149
+ ## Editor support
150
+
151
+ `crbc-lsp` (`python -m opencrbasic.lsp`) is a language server for CRBasic programs; the `logger`
152
+ setting selects the CR6 profile (default) or CR1000X, CR300 or CR350. It reports the compiler's
153
+ diagnostics and offers hover, completion, signature help, outline, folding, go to definition,
154
+ references, highlighting, rename, formatting and quick fixes. Its highlighting names are the CR6 ones.
155
+ The VS Code client is [open-crbasic-vsix](https://github.com/UtrechtUniversity/open-crbasic-vsix). Setup, settings, feature limits and the
156
+ host-tested status are in [`docs/lsp-user-guide.md`](docs/lsp-user-guide.md). It also shows the
157
+ opencrbasic checks and, with `opencrbasic.coverageNotices`, the coverage notices. The editor features
158
+ were host-tested in VS Code on macOS (T-01 to T-18, `LSP_TO_BE_TESTED.md`); the check and notice display
159
+ (M6) has not been host-tested yet, and Windows and Linux are not claimed.
160
+
161
+ ## How it was built
162
+
163
+ The exe is the logger's own compiler built for Windows. Its instruction, function and
164
+ predefined-symbol tables were extracted from the binary (`tools/extract_tables.py`), its
165
+ behaviour was studied with Ghidra and with thousands of runs of the real exe under Wine, and
166
+ everything is checked differentially:
167
+
168
+ | Tool | Checks |
169
+ |---|---|
170
+ | `tools/oracle.py` | runs the real exe under Wine (cached) |
171
+ | `tools/difftest.py --logger L` | normalized output vs the exe over repository programs and 507 CHM help examples |
172
+ | `tools/tdftest.py` | `-z` TDF and `-l` table list, byte for byte |
173
+ | `tools/fuzz.py`, `tools/fuzz_replay.py` | mutated programs, differential; reproducers in `tests/corpus/fuzz/` |
174
+ | `tools/artifact_matrix.py` | every output file per profile and option set, with a baseline gate |
175
+ | `tools/inventory.py` | the CR6 evidence inventory and the coverage-notice table |
176
+ | `uv run pytest -q` | unit tests, corpus parse tests, TDF fixtures |
177
+
178
+ The tools that run the real compilers need them in a local, git-ignored `compiler/` directory
179
+ (copy `CR6Comp.exe`, `cr1000xcomp.exe`, `cr300comp.exe` and `cr350comp.exe` from a CRBasic Editor
180
+ install) and Wine on macOS and Linux.
181
+
182
+ Differential and replay runs default to reporting differences without failing on known gaps. Use
183
+ the gates when a nonzero exit is required:
184
+
185
+ ```bash
186
+ uv run tools/difftest.py --logger cr6 --gate no-regressions
187
+ uv run tools/difftest.py --logger cr6 --gate exact
188
+ uv run tools/fuzz_replay.py --gate no-regressions --json replay.json
189
+ uv run tools/fuzz_replay.py --gate exact --json replay.json
190
+ ```
191
+
192
+ `no-regressions` fails for a false rejection, opencrbasic crash or hang (and both tools
193
+ fail for an oracle error). `exact` fails for any result that does not match the normalized
194
+ reference output. Replay's `--json FILE` writes summary counts and individual result rows for CI
195
+ and later triage. See [`PLAN.md`](PLAN.md#remaining-work-strategy) for how remaining differences
196
+ are measured and fixed.
197
+
198
+ Reverse-engineering notes: `docs/binary.md` (exe layout), `docs/cli.md`, `docs/type-codes.md`
199
+ (parameter kinds), `docs/frontend.md` (language quirks), `docs/checker.md` and
200
+ `docs/instructions.md` (diagnostic rules), `docs/modes.md` (Sequential/Pipeline),
201
+ `docs/tdf-rules.md` (table definitions), `docs/loggers.md` (per-logger differences),
202
+ `docs/fuzz-findings.md`. Provenance and licensing questions: `docs/legal.md`.
203
+
204
+ ## Layout
205
+
206
+ ```
207
+ src/opencrbasic/
208
+ lexer.py source.py consteval.py parser.py syntax.py front end
209
+ checker/ semantic checks and diagnostics
210
+ mode.py tables.py tdf.py signature.py outputs
211
+ profiles.py data/<logger>/*.json per-logger tables and rules
212
+ compiler.py cli.py driver and crbc
213
+ tools/ oracle, difftest, tdftest, fuzzing, table extraction, Ghidra script
214
+ tests/ unit tests, corpora, fixtures
215
+ docs/ behaviour of the original compilers, with evidence
216
+ ```
217
+
218
+ ## Releasing
219
+
220
+ Every push to `dev` that passes CI is published to TestPyPI as `<version>.dev<run number>`. A push
221
+ to `main` publishes to PyPI when `version` in `pyproject.toml` (and `opencrbasic.__version__`) has
222
+ not been released yet. Publishing uses PyPI trusted publishing from the `pypi` and `testpypi` GitHub
223
+ environments; no API token is stored in the repository.
@@ -0,0 +1,117 @@
1
+ opencrbasic/__init__.py,sha256=BTMymX9P3mluEMxr5RSpJKQlAE3P9EEz-5HGWA4Q2Ws,69
2
+ opencrbasic/__main__.py,sha256=E6Gls0DNz8GQK2K-kOUIx8cYhgANW_CH54VKrfCfs14,52
3
+ opencrbasic/analysis.py,sha256=x9os9CEeTioNgO9WcFggC5mLtvV9Qx5Q8DD7fOR6uvI,8035
4
+ opencrbasic/bindings.py,sha256=XBsAIwaOxNdXqmDLnpAUmJacUCsW9-JeihNI-H0igPo,44517
5
+ opencrbasic/catalog.py,sha256=LdS6XsLfjSZKKC_UDpzQaZsvzSA788_IxyA7EPZU5ow,5997
6
+ opencrbasic/checkconfig.py,sha256=GrTXqcCllmWXS7uI-femtlf8HGzep48Ot7bhYrIiTms,5843
7
+ opencrbasic/checks.py,sha256=sp1fSTw0BfeBqR8TjyVZVLELqdVAMEbgWUhU7v3JOnI,21069
8
+ opencrbasic/cli.py,sha256=AXkK0f2RZeldXSlsRZ6DOys3CTV03n1ACmo3WwBXwSQ,15864
9
+ opencrbasic/commands.py,sha256=JhzUNBRZpd7w9RiJNYSUWA3kHRMob7l8nUjDJw5YZZs,5103
10
+ opencrbasic/compiler.py,sha256=8h81LC02K_dPr9hO6CLlqBvYxMdE30PWLHstcGyY9VY,17275
11
+ opencrbasic/consteval.py,sha256=lwV3Q3R7uEe3sJE_lDYl_y9AnMeRyC9OTwrkC7GjLAc,12610
12
+ opencrbasic/diagnostics.py,sha256=5F9gm-Hi-yLmAloNc_QwLsaCU4SG7v2jMNASK-LgwoI,8537
13
+ opencrbasic/editing.py,sha256=34sMHIwSu2ZvtMOFqnZesbHjv3wKSyyu9UPQ0qviLyQ,35582
14
+ opencrbasic/formatting.py,sha256=DB1PWxHRJevXE72S4GSbrMk0PiLHjFJqHWS1SWzV0Bs,12858
15
+ opencrbasic/helpdocs.py,sha256=LYaGpFKwKkNANWpwijXlH6TZYHgdWaJbtzBZFA6LPbs,24271
16
+ opencrbasic/hover.py,sha256=s97KVTMzGhPGdKgOYp4cMnoqiiYLM96NY6x8bBkN3nk,26366
17
+ opencrbasic/inlay.py,sha256=lh0u41VU8NhqH01mZ0Bo9-9d83W9SHChbp7u1BK2GG8,6814
18
+ opencrbasic/lexer.py,sha256=Ti3toK7AGGWAbyhe_yAok-T6QhKhbslvDIpbclsopYM,6273
19
+ opencrbasic/mode.py,sha256=RSAPFGQDOfyVDjemYG8EKX2kEmxVunNjOTEdreaEALk,5923
20
+ opencrbasic/navigation.py,sha256=-XIouoUxehuiw_GH3ma70KBfkDL-CRzlcwTenuMKOmc,15989
21
+ opencrbasic/parser.py,sha256=XO-yGB40hCNqecChKiRMwvw58hK1ylqsN-4CNnZrIHE,163551
22
+ opencrbasic/positions.py,sha256=a6PJ7cDOG8Gn6jNfh564fr1R-A4lcdQAqvYe5vS9ON4,11782
23
+ opencrbasic/preprocess.py,sha256=FAtaPNSamKzxHfgCz7EK0sepzYxx-fs4BPSwpvoubIc,11969
24
+ opencrbasic/profiles.py,sha256=OZAP984-cWTmfhvhbM43t70JF45-6eMF3D54_mW40f0,12664
25
+ opencrbasic/provenance.py,sha256=_jVlW5WUnSuVw7j-iY43cOIwcwKAh3s4BxMq_78XiTY,557
26
+ opencrbasic/quickfix.py,sha256=3ztbHJNTWTaC2aahOtRBJTH-oVJk-JmIBYYwMeW7cHc,13090
27
+ opencrbasic/rename.py,sha256=6pQaajBZmMTjAIfmWiVtsoPtTVQFWnCR_snO6b-283M,28877
28
+ opencrbasic/signature.py,sha256=QbrMu40XZfAneOlac_i5QDWDTuqNAzv2ZndTyXWuyDw,1137
29
+ opencrbasic/source.py,sha256=J21X_WvLAf6z0nkC6mRriGusWi_DdBHSW7O8iygQCm4,28420
30
+ opencrbasic/sources.py,sha256=_837MNZMNOjP0JXuVs35RMXrhm4I6fAYzxEyP8ydOnk,5121
31
+ opencrbasic/syntax.py,sha256=CGdzo6_b5zwRcpyGnY61xZeVH4b2yVNzZB8EYEgcpg8,11935
32
+ opencrbasic/tables.py,sha256=bVseoJ5-LOQs4_MHc8Xk7zF6xGCJEe3SJye7Vt9Qcig,90787
33
+ opencrbasic/tables_hook.py,sha256=X7VCkEFGA0uwtypTzRNVo_WwH10Jmd2CbvLpLbLsdXA,534
34
+ opencrbasic/tdf.py,sha256=-ak5_5B1-cOko6getMkq54CHAU6JMMPNHMK2AZk6_24,4720
35
+ opencrbasic/timing.py,sha256=-MzcWFSBuk0FILLK6RiF5WTAhvHnrisRZ11pTIyBYBc,22936
36
+ opencrbasic/checker/__init__.py,sha256=VIyp5WxC8uOXQO9-SIHh9T6tdiao4O07SJjCEqy9uG8,59792
37
+ opencrbasic/checker/cr3xx.py,sha256=3zn_S5fTeeR9TANIak_-Uy-8KMgPz-_GQFowirZCcEY,164392
38
+ opencrbasic/checker/ess.py,sha256=wIxWWfNElxC9zm2T8LYhhWNny7Zh_cMpACtftprYld4,3609
39
+ opencrbasic/checker/expressions.py,sha256=EYdyX191lNc79qDzpbQ_aBlsSl7tGCq2OUJzQYHCZGw,191338
40
+ opencrbasic/checker/instr_data.py,sha256=pqQLOYK4PHyYwKa7jClD1_RpEb-EXwfJde1UIJPY7N0,87938
41
+ opencrbasic/checker/instr_measure.py,sha256=s6vck3DVwGuBXJ2hSL90nPPQgdnSfHJ-h064g48_PMw,73765
42
+ opencrbasic/checker/instr_rules.py,sha256=DQd7R5xdA-0Kk2QRuYLaALPg7Za3Eg_DmDM7q5knlKY,178354
43
+ opencrbasic/checker/instructions.py,sha256=k_XMmLmLxF3HXWt4FSrdAX__zU67Hwf4v7Y3ZyDeua0,784
44
+ opencrbasic/checker/intervals.py,sha256=vdBlSq5QBBfEhTnJzKlinCorO-sB4glo74csU-FmkS8,31697
45
+ opencrbasic/checker/longconv.py,sha256=x1ho3u93OFYCtWwSt20gjCFj6nO6A0DBUsTcKsCi6R8,5291
46
+ opencrbasic/checker/scan_time.py,sha256=GUWpiw93mX7aWSr3TAVjsLKKyrbqQD4S-IJWh08bJ8U,21580
47
+ opencrbasic/checker/storage.py,sha256=sm__XDOXDRkRBy3kTuKO3tzC0dABnHyL5QgUYRbLEc8,18521
48
+ opencrbasic/checker/structs.py,sha256=I7mIwdlztcmZHsaeJGPRgFIIQ9x-mm9xYxAZnysxG4k,11315
49
+ opencrbasic/checker/structure.py,sha256=hnZb9vlv5jm9c6bSJeH4jkLD4TrgRCEGpBoEjKmDRP8,322774
50
+ opencrbasic/checker/symbols.py,sha256=0pkuAUsilKV8SXHBmiXIL22Gb027AHeHe7ympRGUwog,29612
51
+ opencrbasic/checker/terminals.py,sha256=BgE-VdDCG2PzF9ad65ttB5nERweQkon8HDGfs2dGCOg,13739
52
+ opencrbasic/checker/unused.py,sha256=7u4_WWt-B1O5fUJTO-Nwq_EGOvAcnG7vjRm7sc8e92o,9423
53
+ opencrbasic/checker/var_types.py,sha256=kmORx5c96psla0ClFXz3YVZMaIUtyjMeRVlEQP0P5zc,25836
54
+ opencrbasic/checker/warnings.py,sha256=5wtNxuNuoZEMDKu0LzaZhh_2RecWWhmqcKkOj2WF4xE,33007
55
+ opencrbasic/data/background_calibration.json,sha256=XqSQJXprkcF2HVIhDTBzgXQEaJI00sH74Q8T3aCCxvk,44
56
+ opencrbasic/data/before_beginprog.json,sha256=aEaV-wzP9-34WTPQyjQcRQgZ4C4q5Jd-gh4m87IihFQ,1466
57
+ opencrbasic/data/ess_variables.json,sha256=eYvXOS2OLevn79SzCdvkwpduCqlu4NiCLBHt9gANeu8,15513
58
+ opencrbasic/data/fnotch.json,sha256=mYtASxm44XYtIQbCLBwTroVU2AIHt7zNxsDnbl1knTk,545
59
+ opencrbasic/data/functions.json,sha256=lEofqWCAs__soCkchMwj86p_vet1jkzKE9SOwJPQvTA,15224
60
+ opencrbasic/data/instructions.json,sha256=a4dU3BSu5s1COCy4BbnWwJIbw1oBwG5QHAFlZ4SCb90,58153
61
+ opencrbasic/data/measure.json,sha256=V4E4lxFmV6UagFIzmOG5yFyKOMgeYCxCwV2ltN1jAb8,12913
62
+ opencrbasic/data/mode.json,sha256=aDL5GiXrQw4VUeaYkcara16DzAB1AvEXfPRDYwnVN8o,1535
63
+ opencrbasic/data/notices_cr6.json,sha256=DgPQa8q8jVhyLXY3l3S-mexN5v_WiNl2LI27SaDKeQs,29057
64
+ opencrbasic/data/pipeline_tasks.json,sha256=_6UO-7SOzGtkXAit03wgRi9Mg7mSPLUil2vGYORz_6o,4586
65
+ opencrbasic/data/settings_fields.json,sha256=UzGR5zNHsZ_ruEWW4CCZ_BRJ0aJ4lGnMaWUZp5XucKo,6395
66
+ opencrbasic/data/status_members.json,sha256=1p62OFu_slAZY92UcGFwbzmnk70jRn4oZSCx8qvp0C8,6335
67
+ opencrbasic/data/status_table.json,sha256=642vlfxyfgNNXF4dIUE_DOSJ1c4psW0z4cyxL9hc3jU,12917
68
+ opencrbasic/data/symbols.json,sha256=5Ut5nXjo78njWvQtW-qZxhfY13DDL7MGkC9MssBMDco,10876
69
+ opencrbasic/data/terminals.json,sha256=G4WBfkQhok-Efy2i1bNdIEy04gYYgRk7UKYJHcMJx9E,4284
70
+ opencrbasic/data/type_codes.json,sha256=4efa4SGr01ARQ0piC2Zou-sTNdiwRwyIwkJE4KRdkF0,9340
71
+ opencrbasic/data/cr1000x/background_calibration.json,sha256=xZE2t5VfIdkXPYOhTR96KqBJOxNh403gLH-Vgzpy3Ik,44
72
+ opencrbasic/data/cr1000x/before_beginprog.json,sha256=ubD3TTRNUlIwOHgWt9JyfSDo13FNqyTtCqMsqH_I6xM,2018
73
+ opencrbasic/data/cr1000x/ess_variables.json,sha256=eYvXOS2OLevn79SzCdvkwpduCqlu4NiCLBHt9gANeu8,15513
74
+ opencrbasic/data/cr1000x/fnotch.json,sha256=9QRaPaJw9v5RZO6IjY_BLYC4lP1AvBKZpQoNBr1ATmo,447
75
+ opencrbasic/data/cr1000x/functions.json,sha256=lEofqWCAs__soCkchMwj86p_vet1jkzKE9SOwJPQvTA,15224
76
+ opencrbasic/data/cr1000x/instructions.json,sha256=Ju5M7UDbasBPPU9m3NWzTEfFk7E57h0scp0v4Ppz4w8,56841
77
+ opencrbasic/data/cr1000x/measure.json,sha256=IW9p6s9iIfHTZBnRRBfMuhRGCIHsNOxtFHnFlQeZYpY,12989
78
+ opencrbasic/data/cr1000x/mode.json,sha256=Hs63jVv1FwgQTDI5uRvMQqjxHBj2I5UQXGHTlTr7FBE,1425
79
+ opencrbasic/data/cr1000x/pipeline_tasks.json,sha256=bSn4fyC5QzwoAjCBYmYdEKoMdb3-fv6ndL-NtcTzrLk,4605
80
+ opencrbasic/data/cr1000x/settings_fields.json,sha256=xGiHlDDI2iWgp1ucO5TULmAo_UBFnnYB5IzL-AXUrfI,6376
81
+ opencrbasic/data/cr1000x/status_members.json,sha256=zVXzSz66fM95b63qAgpPCatlTGKGHYVr403qeNBgGYA,6316
82
+ opencrbasic/data/cr1000x/symbols.json,sha256=ffDM8PrhSipJzEPY_E048SvMNegPP2tThtmSEApXp9U,10519
83
+ opencrbasic/data/cr1000x/terminals.json,sha256=MjOjqslmcUU1W8-l8EIdl_M_bBXkPgXIwX1CHoJV3kY,5077
84
+ opencrbasic/data/cr300/before_beginprog.json,sha256=ZwoWHseTZj7V4974t8O3h7gGCizsFZuokrcK7_eT40M,607
85
+ opencrbasic/data/cr300/ess_variables.json,sha256=eYvXOS2OLevn79SzCdvkwpduCqlu4NiCLBHt9gANeu8,15513
86
+ opencrbasic/data/cr300/fnotch.json,sha256=dDO-lnXJVLdh0f4ZKESPAjY4GWzXtYQVTJJ5l5UtLOI,424
87
+ opencrbasic/data/cr300/functions.json,sha256=aSh-01P9mvlah2-sl7z6_io2t8Pke6ThRynOh22XqZQ,14384
88
+ opencrbasic/data/cr300/instructions.json,sha256=mSwN1W4fIgLqqFD8qC5UAVXFSBNUAo_Nje5yZy7avRs,33504
89
+ opencrbasic/data/cr300/measure.json,sha256=J-pBRau5loX9FSNI3sMCc_vptRcwxLgwIQLVQVSKyD4,3479
90
+ opencrbasic/data/cr300/mode.json,sha256=aDL5GiXrQw4VUeaYkcara16DzAB1AvEXfPRDYwnVN8o,1535
91
+ opencrbasic/data/cr300/settings_fields.json,sha256=O-v9-uZMSJhJy0-fhfOQlgZpvTgryKai-9n1JeoP1qM,5125
92
+ opencrbasic/data/cr300/status_members.json,sha256=1NSTlkeCkH1vV2O0Myrn7BjTj3GCSHJy-aspJYKzoxU,5918
93
+ opencrbasic/data/cr300/symbols.json,sha256=DNaQuY6sRD5DF_5_4Jk2Cs8Wc8PwCUvhmXCuRkSh_Iw,6862
94
+ opencrbasic/data/cr300/terminals.json,sha256=0_wJlb-mjF2RDnZIW3Uyo9JlNnUpWC578kKalmm-zao,2578
95
+ opencrbasic/data/cr350/before_beginprog.json,sha256=e729hC9gegiimlMtd7uxE6E0f4xwFRlAtgneMjKgTVs,634
96
+ opencrbasic/data/cr350/ess_variables.json,sha256=eYvXOS2OLevn79SzCdvkwpduCqlu4NiCLBHt9gANeu8,15513
97
+ opencrbasic/data/cr350/fnotch.json,sha256=dDO-lnXJVLdh0f4ZKESPAjY4GWzXtYQVTJJ5l5UtLOI,424
98
+ opencrbasic/data/cr350/functions.json,sha256=dkJVu1sXw9q46bkC4cvec4zWUS9a2T1pTk76U4Ikcw4,14390
99
+ opencrbasic/data/cr350/instructions.json,sha256=VjyHRuK7LRWceh7Dt5SC4n18DGg6aY0IR4aTTD83iTs,33633
100
+ opencrbasic/data/cr350/measure.json,sha256=aS7yfBTRLbg_T2Lu-SvVWDP7q9i9s3XT8wFzTOXvvkQ,3570
101
+ opencrbasic/data/cr350/mode.json,sha256=aDL5GiXrQw4VUeaYkcara16DzAB1AvEXfPRDYwnVN8o,1535
102
+ opencrbasic/data/cr350/settings_fields.json,sha256=egq67rA2IK1W1L--IEnuqlR2Lk1Adu2wBVP7tLUF0B4,5718
103
+ opencrbasic/data/cr350/status_members.json,sha256=pcerKWE4-T-JP9e4jQQB-jgswcE1XqYDighi1aP8Zro,5910
104
+ opencrbasic/data/cr350/symbols.json,sha256=aBzFEzsx--MiNUaZSfUTS03J9sgpw0lBG8UrUd9FKSk,6739
105
+ opencrbasic/data/cr350/terminals.json,sha256=rKq1sSAxOmL3WA8cRXFb4pQeKqOy8xp_gZKNOSwLtVs,2461
106
+ opencrbasic/lsp/__init__.py,sha256=rM9KU1MmqPhA4cGoNshuJqcc0SmuyC2DOR2oSZ4ndMM,288
107
+ opencrbasic/lsp/__main__.py,sha256=6QFKhUdX-RoROkY3t2whBZOVJqN7VI2JiKvLmcKsTB8,238
108
+ opencrbasic/lsp/config.py,sha256=wfF8wKiy_SidYrTXEu1cyg9Xs_odjWdv1JymGSnXzF4,8160
109
+ opencrbasic/lsp/features.py,sha256=6jIM1JIh1Pw92__5x5lKtcQ9e7G4-9I5FsLlvDyNGaA,24757
110
+ opencrbasic/lsp/server.py,sha256=HCDvHvH9R6P1Gf2m83_az4oIJZVkgvqpbbY8wtsas_Q,34162
111
+ opencrbasic/lsp/session.py,sha256=ME2275mN_asYFtSETQQgGUROJ9_C_IpgZfEU_TThNTw,51651
112
+ opencrbasic/lsp/worker.py,sha256=ndYNwMZQvmUBzRooQzOc1xtQOtznnxNtIGbCoY9N6eo,4510
113
+ opencrbasic-1.0.0.dist-info/METADATA,sha256=XD-uaqg_f6o1MkY4IM97WA2949zLoxSTx37y2oeuz8A,11997
114
+ opencrbasic-1.0.0.dist-info/WHEEL,sha256=2iZrJkDIkeDh0k9SikKMqFuRP-ua6mb4Ir1AsER4BEw,87
115
+ opencrbasic-1.0.0.dist-info/entry_points.txt,sha256=DzdZzqpQ8PRSqacUSH72RavZVOmqm2vZBuKZy3rv6ak,85
116
+ opencrbasic-1.0.0.dist-info/licenses/LICENSE,sha256=s06qSrrNAXyntCFucwYn5JUqqEcrUnYLEzO_OOef4-g,1075
117
+ opencrbasic-1.0.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.33.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ crbc = opencrbasic.cli:main
3
+ crbc-lsp = opencrbasic.lsp.server:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Utrecht University
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.