ibex 0.2.0 → 0.4.0

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 (461) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +100 -272
  3. data/docs/architecture.md +187 -35
  4. data/docs/bison-import.md +103 -0
  5. data/docs/comparison-policy.md +127 -0
  6. data/docs/configuration-model.md +59 -0
  7. data/docs/configuration-report.md +28 -0
  8. data/docs/conflict-explanation-reviews/v1/records/README.md +28 -0
  9. data/docs/conflict-explanation-study.md +62 -0
  10. data/docs/construction-profiling.md +157 -0
  11. data/docs/cst-migration.md +3 -4
  12. data/docs/cst.md +24 -0
  13. data/docs/decisions/0000-template.md +24 -0
  14. data/docs/decisions/0001-separate-ir-pipeline.md +34 -0
  15. data/docs/decisions/0002-opaque-user-code-boundary.md +32 -0
  16. data/docs/decisions/0003-self-hosted-grammar-frontend.md +32 -0
  17. data/docs/decisions/0004-shared-semantic-and-lossless-source-model.md +33 -0
  18. data/docs/decisions/0005-contained-grammar-composition.md +34 -0
  19. data/docs/decisions/0006-bounded-structural-grammar-lowering.md +32 -0
  20. data/docs/decisions/0007-shared-parser-construction-pipeline.md +33 -0
  21. data/docs/decisions/0008-versioned-runtime-package-boundary.md +36 -0
  22. data/docs/decisions/0009-isolated-parser-sessions.md +34 -0
  23. data/docs/decisions/0010-committed-runtime-observation.md +34 -0
  24. data/docs/decisions/0011-versioned-semantic-action-boundary.md +37 -0
  25. data/docs/decisions/0012-bounded-nonexecuting-analysis.md +37 -0
  26. data/docs/decisions/0013-transactional-generation-publication.md +37 -0
  27. data/docs/decisions/0014-versioned-generated-lexer.md +35 -0
  28. data/docs/decisions/0015-worker-isolated-browser-analysis.md +32 -0
  29. data/docs/decisions/0016-red-green-concrete-syntax.md +34 -0
  30. data/docs/decisions/0017-persistent-syntax-artifacts.md +35 -0
  31. data/docs/decisions/0018-conservative-incremental-syntax-reuse.md +38 -0
  32. data/docs/decisions/0019-runtime-syntax-session-boundary.md +51 -0
  33. data/docs/decisions/0020-grammar-ir-parser-contract.md +65 -0
  34. data/docs/decisions/0021-data-only-parser-table-sidecar.md +50 -0
  35. data/docs/decisions/0022-manifest-bound-verification-report.md +77 -0
  36. data/docs/decisions/0023-syntax-only-repair-results.md +48 -0
  37. data/docs/decisions/0024-direct-ielr-construction.md +42 -0
  38. data/docs/decisions/README.md +74 -0
  39. data/docs/declarative-configuration.md +274 -0
  40. data/docs/development.md +196 -2
  41. data/docs/direct-ielr-decision.md +120 -0
  42. data/docs/direct-multi-entry-decision.md +82 -0
  43. data/docs/editor-setup.md +2 -1
  44. data/docs/error-ux-review-rubric-v1.md +117 -0
  45. data/docs/error-ux-reviews/v1/records/README.md +22 -0
  46. data/docs/error-ux-round2-review-status-v1.json +27 -0
  47. data/docs/error-ux-round2-reviews/v1/records/README.md +30 -0
  48. data/docs/error-ux-round2-v1.json +1617 -0
  49. data/docs/error-ux-round2.md +111 -0
  50. data/docs/error-ux.md +54 -0
  51. data/docs/getting-started.md +80 -0
  52. data/docs/grammar-reference.md +184 -13
  53. data/docs/ielr-design.md +43 -0
  54. data/docs/ielr.md +92 -0
  55. data/docs/impact.md +101 -0
  56. data/docs/ja/bison-import.md +51 -0
  57. data/docs/ja/stable-api.md +53 -0
  58. data/docs/lexer-construction-profile.md +109 -0
  59. data/docs/lexer-migration.md +5 -0
  60. data/docs/maturity.md +129 -0
  61. data/docs/project-site-strategy.md +54 -0
  62. data/docs/racc-migration-evidence.md +45 -0
  63. data/docs/racc-migration.md +11 -0
  64. data/docs/release-readiness.md +126 -68
  65. data/docs/repair-semantics.md +123 -0
  66. data/docs/runtime-abi-evolution.md +310 -0
  67. data/docs/stability.md +145 -34
  68. data/docs/status.md +43 -0
  69. data/docs/syntax-sessions.md +183 -0
  70. data/docs/table-artifact.md +125 -0
  71. data/docs/test-interactions.md +219 -0
  72. data/docs/verification-report.md +137 -0
  73. data/docs/verifier-trust-boundary.md +199 -0
  74. data/docs/workloads.md +132 -0
  75. data/lib/ibex/analysis/digraph.rb +128 -0
  76. data/lib/ibex/analysis/sets.rb +14 -0
  77. data/lib/ibex/analysis.rb +1 -0
  78. data/lib/ibex/bison_import/importer.rb +516 -0
  79. data/lib/ibex/bison_import/tokenizer.rb +260 -0
  80. data/lib/ibex/bison_import.rb +200 -0
  81. data/lib/ibex/bounded_subprocess.rb +171 -0
  82. data/lib/ibex/cli/ambiguity.rb +14 -5
  83. data/lib/ibex/cli/analysis.rb +134 -0
  84. data/lib/ibex/cli/bison_import.rb +121 -0
  85. data/lib/ibex/cli/config.rb +128 -0
  86. data/lib/ibex/cli/diagnostics.rb +31 -11
  87. data/lib/ibex/cli/documentation.rb +11 -8
  88. data/lib/ibex/cli/equiv.rb +169 -0
  89. data/lib/ibex/cli/error_messages.rb +11 -4
  90. data/lib/ibex/cli/explain.rb +14 -5
  91. data/lib/ibex/cli/fix.rb +203 -0
  92. data/lib/ibex/cli/formatting.rb +11 -10
  93. data/lib/ibex/cli/fuzz.rb +200 -0
  94. data/lib/ibex/cli/fuzz_regressions.rb +145 -0
  95. data/lib/ibex/cli/generation_artifacts.rb +53 -2
  96. data/lib/ibex/cli/generation_error_messages.rb +1 -1
  97. data/lib/ibex/cli/grammar_tests.rb +32 -14
  98. data/lib/ibex/cli/impact.rb +393 -0
  99. data/lib/ibex/cli/ir_tools.rb +5 -61
  100. data/lib/ibex/cli/outputs.rb +60 -33
  101. data/lib/ibex/cli/reduce.rb +202 -0
  102. data/lib/ibex/cli/reduce_reporting.rb +71 -0
  103. data/lib/ibex/cli/samples.rb +49 -23
  104. data/lib/ibex/cli/verify.rb +116 -0
  105. data/lib/ibex/cli/watch.rb +6 -5
  106. data/lib/ibex/cli.rb +362 -56
  107. data/lib/ibex/codegen/action_locations.rb +1 -1
  108. data/lib/ibex/codegen/action_method_source.rb +5 -6
  109. data/lib/ibex/codegen/action_source.rb +3 -2
  110. data/lib/ibex/codegen/ambiguity.rb +5 -4
  111. data/lib/ibex/codegen/explain.rb +123 -55
  112. data/lib/ibex/codegen/generated_action_abi.rb +10 -5
  113. data/lib/ibex/codegen/rbs.rb +15 -7
  114. data/lib/ibex/codegen/report.rb +25 -13
  115. data/lib/ibex/codegen/ruby.rb +28 -64
  116. data/lib/ibex/codegen/ruby_actions.rb +9 -6
  117. data/lib/ibex/codegen/ruby_syntax.rb +15 -9
  118. data/lib/ibex/configuration/analysis_grammar.rb +35 -0
  119. data/lib/ibex/configuration/explanation.rb +421 -0
  120. data/lib/ibex/configuration/inspector.rb +232 -0
  121. data/lib/ibex/configuration.rb +580 -0
  122. data/lib/ibex/coverage/collector.rb +21 -11
  123. data/lib/ibex/coverage/event_stream.rb +13 -7
  124. data/lib/ibex/coverage/report.rb +26 -18
  125. data/lib/ibex/coverage/runtime_event_validator.rb +30 -21
  126. data/lib/ibex/delta_reducer.rb +99 -0
  127. data/lib/ibex/diff.rb +141 -0
  128. data/lib/ibex/equiv/machine.rb +135 -0
  129. data/lib/ibex/equiv.rb +373 -0
  130. data/lib/ibex/fix.rb +557 -0
  131. data/lib/ibex/frontend/ast.rb +22 -2
  132. data/lib/ibex/frontend/bootstrap_parser.rb +6 -13
  133. data/lib/ibex/frontend/diagnostic.rb +1 -1
  134. data/lib/ibex/frontend/formatter.rb +72 -26
  135. data/lib/ibex/frontend/generated_parser.rb +147 -117
  136. data/lib/ibex/frontend/generated_parser_base.rb +7 -3
  137. data/lib/ibex/frontend/generated_parser_includes.rb +1 -11
  138. data/lib/ibex/frontend/generation.rb +1 -1
  139. data/lib/ibex/frontend/parser/declarations.rb +17 -2
  140. data/lib/ibex/frontend/parser_configuration_support.rb +56 -0
  141. data/lib/ibex/frontend/regenerator.rb +1 -0
  142. data/lib/ibex/frontend/resolution.rb +2 -1
  143. data/lib/ibex/frontend/resolver.rb +1 -1
  144. data/lib/ibex/frontend/rule_documentation.rb +2 -1
  145. data/lib/ibex/frontend/source_cursor.rb +2 -2
  146. data/lib/ibex/frontend/source_span.rb +9 -1
  147. data/lib/ibex/frontend/token_adapter/declaration_state.rb +38 -6
  148. data/lib/ibex/frontend/token_adapter.rb +10 -0
  149. data/lib/ibex/frontend.rb +1 -0
  150. data/lib/ibex/fuzz.rb +219 -0
  151. data/lib/ibex/generation_input.rb +1 -1
  152. data/lib/ibex/generation_manifest.rb +36 -25
  153. data/lib/ibex/generation_transaction.rb +1 -1
  154. data/lib/ibex/generation_transaction_recovery.rb +4 -4
  155. data/lib/ibex/generation_transaction_validation.rb +2 -2
  156. data/lib/ibex/grammar_tests.rb +1 -1
  157. data/lib/ibex/impact/action_impact.rb +148 -0
  158. data/lib/ibex/impact/automaton_impact.rb +57 -0
  159. data/lib/ibex/impact/coverage_impact.rb +53 -0
  160. data/lib/ibex/impact/graph.rb +132 -0
  161. data/lib/ibex/impact/propagation.rb +147 -0
  162. data/lib/ibex/impact/report.rb +273 -0
  163. data/lib/ibex/impact/seeds.rb +69 -0
  164. data/lib/ibex/impact/severity.rb +139 -0
  165. data/lib/ibex/impact.rb +16 -0
  166. data/lib/ibex/ir/automaton_ir.rb +61 -19
  167. data/lib/ibex/ir/grammar_ir.rb +76 -45
  168. data/lib/ibex/ir/lexer_ir.rb +5 -5
  169. data/lib/ibex/ir/parser_contract.rb +135 -0
  170. data/lib/ibex/ir/serialize.rb +203 -76
  171. data/lib/ibex/ir/validator/automaton.rb +64 -34
  172. data/lib/ibex/ir/validator/base.rb +51 -33
  173. data/lib/ibex/ir/validator/grammar.rb +113 -83
  174. data/lib/ibex/ir/validator/lexer.rb +2 -2
  175. data/lib/ibex/ir/validator.rb +2 -1
  176. data/lib/ibex/ir.rb +16 -3
  177. data/lib/ibex/lalr/build_metrics.rb +50 -2
  178. data/lib/ibex/lalr/builder.rb +191 -56
  179. data/lib/ibex/lalr/conflict_search.rb +15 -4
  180. data/lib/ibex/lalr/counterexample.rb +19 -14
  181. data/lib/ibex/lalr/direct_lookaheads.rb +110 -57
  182. data/lib/ibex/lalr/goto_follows.rb +229 -0
  183. data/lib/ibex/lalr/ielr/annotator.rb +214 -0
  184. data/lib/ibex/lalr/ielr/bits.rb +28 -0
  185. data/lib/ibex/lalr/ielr/inadequacy.rb +47 -0
  186. data/lib/ibex/lalr/ielr/item_lookaheads.rb +78 -0
  187. data/lib/ibex/lalr/ielr/pipeline.rb +75 -0
  188. data/lib/ibex/lalr/ielr/split_stability.rb +78 -0
  189. data/lib/ibex/lalr/ielr/split_state.rb +20 -0
  190. data/lib/ibex/lalr/ielr/state_splitter.rb +258 -0
  191. data/lib/ibex/lalr/ielr_partition.rb +22 -8
  192. data/lib/ibex/lalr/inadequacy_report.rb +50 -0
  193. data/lib/ibex/lalr/lookahead_propagation.rb +111 -0
  194. data/lib/ibex/lalr/lr0_collection.rb +121 -0
  195. data/lib/ibex/lalr/unreachable_states.rb +80 -0
  196. data/lib/ibex/lalr.rb +52 -1
  197. data/lib/ibex/location.rb +3 -3
  198. data/lib/ibex/lsp/document_handlers.rb +9 -7
  199. data/lib/ibex/lsp/initialization_handlers.rb +9 -7
  200. data/lib/ibex/lsp/navigation_handlers.rb +25 -11
  201. data/lib/ibex/lsp/parser_configuration_assistance.rb +149 -0
  202. data/lib/ibex/lsp/position_codec.rb +6 -2
  203. data/lib/ibex/lsp/request_handlers.rb +3 -2
  204. data/lib/ibex/lsp/request_support.rb +14 -7
  205. data/lib/ibex/lsp/server.rb +13 -11
  206. data/lib/ibex/lsp/symbol_index.rb +13 -13
  207. data/lib/ibex/lsp/symbol_index_builder.rb +30 -20
  208. data/lib/ibex/lsp/symbol_occurrence.rb +8 -2
  209. data/lib/ibex/lsp/transport.rb +13 -3
  210. data/lib/ibex/lsp/workspace.rb +5 -4
  211. data/lib/ibex/lsp/workspace_analyzer.rb +1 -1
  212. data/lib/ibex/lsp.rb +1 -0
  213. data/lib/ibex/messages/en.yml +28 -0
  214. data/lib/ibex/messages/ja.yml +28 -0
  215. data/lib/ibex/messages.rb +68 -0
  216. data/lib/ibex/metrics.rb +175 -0
  217. data/lib/ibex/normalize/declarations.rb +2 -0
  218. data/lib/ibex/normalize/diagnostics.rb +63 -38
  219. data/lib/ibex/normalize/expander.rb +5 -4
  220. data/lib/ibex/normalize/expression.rb +8 -6
  221. data/lib/ibex/normalize/grammar_builder.rb +26 -0
  222. data/lib/ibex/normalize/inline_expansion.rb +100 -49
  223. data/lib/ibex/normalize/lexer.rb +3 -3
  224. data/lib/ibex/normalize/parameter_ebnf_lowering.rb +11 -10
  225. data/lib/ibex/normalize/parameter_lowering.rb +40 -23
  226. data/lib/ibex/normalize/parameters.rb +31 -4
  227. data/lib/ibex/normalize/parser_configuration.rb +70 -0
  228. data/lib/ibex/normalize.rb +10 -20
  229. data/lib/ibex/racc_migration/report.rb +6 -3
  230. data/lib/ibex/rake_task.rb +1 -1
  231. data/lib/ibex/samples.rb +43 -13
  232. data/lib/ibex/table_artifact/builder.rb +266 -0
  233. data/lib/ibex/table_artifact/cst_projection.rb +70 -0
  234. data/lib/ibex/table_artifact/document.rb +39 -0
  235. data/lib/ibex/table_artifact/executor.rb +187 -0
  236. data/lib/ibex/table_artifact/serializer.rb +57 -0
  237. data/lib/ibex/table_artifact/validator/metadata.rb +179 -0
  238. data/lib/ibex/table_artifact/validator/support.rb +86 -0
  239. data/lib/ibex/table_artifact/validator/tables.rb +238 -0
  240. data/lib/ibex/table_artifact/validator.rb +253 -0
  241. data/lib/ibex/table_artifact.rb +88 -0
  242. data/lib/ibex/table_simulation/result.rb +6 -2
  243. data/lib/ibex/table_simulation/step.rb +3 -1
  244. data/lib/ibex/tables.rb +14 -0
  245. data/lib/ibex/verifiable_generation_bundle.rb +86 -0
  246. data/lib/ibex/verification_report/builder.rb +159 -0
  247. data/lib/ibex/verification_report/canonical_ir.rb +123 -0
  248. data/lib/ibex/verification_report/logical_path.rb +68 -0
  249. data/lib/ibex/verification_report/validator.rb +329 -0
  250. data/lib/ibex/verification_report.rb +69 -0
  251. data/lib/ibex/verify/action_correspondence.rb +138 -0
  252. data/lib/ibex/verify/language_witness.rb +295 -0
  253. data/lib/ibex/verify/reference_collection.rb +190 -0
  254. data/lib/ibex/verify/result.rb +73 -0
  255. data/lib/ibex/verify/verifier.rb +598 -0
  256. data/lib/ibex/verify.rb +15 -0
  257. data/lib/ibex/version.rb +1 -1
  258. data/lib/ibex/watch/runner.rb +10 -1
  259. data/lib/ibex/watch/source_snapshot.rb +13 -8
  260. data/lib/ibex.rb +11 -0
  261. data/schema/{automaton-ir-v1.schema.json → automaton-ir-definitions.schema.json} +6 -6
  262. data/schema/{automaton-ir-v2.schema.json → automaton-ir.schema.json} +14 -7
  263. data/schema/bison-import-v1.schema.json +106 -0
  264. data/schema/conflict-explanation-review-v1.schema.json +196 -0
  265. data/schema/conflict-explanation-study-v1.schema.json +528 -0
  266. data/schema/construction-profile-v1.schema.json +779 -0
  267. data/schema/diff-v1.schema.json +41 -0
  268. data/schema/direct-ielr-decision-v1.schema.json +200 -0
  269. data/schema/equiv-v1.schema.json +64 -0
  270. data/schema/error-ux-review-v1.schema.json +609 -0
  271. data/schema/error-ux-round2-review-v1.schema.json +191 -0
  272. data/schema/error-ux-round2-v1.schema.json +519 -0
  273. data/schema/explain-v1.schema.json +63 -1
  274. data/schema/fix-v1.schema.json +64 -0
  275. data/schema/fix-v2.schema.json +66 -0
  276. data/schema/fix-v3.schema.json +101 -0
  277. data/schema/fuzz-regression-v1.schema.json +79 -0
  278. data/schema/fuzz-v1.schema.json +114 -0
  279. data/schema/{grammar-ir-v2.schema.json → grammar-ir-extensions.schema.json} +20 -65
  280. data/schema/{grammar-ir-v1.schema.json → grammar-ir-foundation.schema.json} +3 -3
  281. data/schema/grammar-ir.schema.json +271 -0
  282. data/schema/ielr-benchmark-v1.schema.json +85 -0
  283. data/schema/impact-v1.schema.json +208 -0
  284. data/schema/lexer-profile-v1.schema.json +491 -0
  285. data/schema/metrics-v1.schema.json +60 -0
  286. data/schema/reduce-v1.schema.json +22 -0
  287. data/schema/reduce-v2.schema.json +63 -0
  288. data/schema/table-artifact-v1.schema.json +377 -0
  289. data/schema/verification-report-v1.schema.json +222 -0
  290. data/schema/verify-v1.schema.json +42 -0
  291. data/sig/ibex/analysis/digraph.rbs +19 -0
  292. data/sig/ibex/analysis/sets.rbs +10 -0
  293. data/sig/ibex/bison_import/importer.rbs +140 -0
  294. data/sig/ibex/bison_import/tokenizer.rbs +91 -0
  295. data/sig/ibex/bison_import.rbs +95 -0
  296. data/sig/ibex/bounded_subprocess.rbs +76 -0
  297. data/sig/ibex/cli/ambiguity.rbs +6 -0
  298. data/sig/ibex/cli/analysis.rbs +43 -0
  299. data/sig/ibex/cli/bison_import.rbs +32 -0
  300. data/sig/ibex/cli/config.rbs +35 -0
  301. data/sig/ibex/cli/diagnostics.rbs +16 -3
  302. data/sig/ibex/cli/documentation.rbs +5 -1
  303. data/sig/ibex/cli/equiv.rbs +49 -0
  304. data/sig/ibex/cli/error_messages.rbs +6 -0
  305. data/sig/ibex/cli/explain.rbs +6 -0
  306. data/sig/ibex/cli/fix.rbs +53 -0
  307. data/sig/ibex/cli/formatting.rbs +5 -1
  308. data/sig/ibex/cli/fuzz.rbs +47 -0
  309. data/sig/ibex/cli/fuzz_regressions.rbs +40 -0
  310. data/sig/ibex/cli/generation_artifacts.rbs +21 -2
  311. data/sig/ibex/cli/generation_error_messages.rbs +2 -2
  312. data/sig/ibex/cli/grammar_tests.rbs +15 -3
  313. data/sig/ibex/cli/impact.rbs +95 -0
  314. data/sig/ibex/cli/ir_tools.rbs +7 -19
  315. data/sig/ibex/cli/outputs.rbs +9 -3
  316. data/sig/ibex/cli/reduce.rbs +60 -0
  317. data/sig/ibex/cli/reduce_reporting.rbs +27 -0
  318. data/sig/ibex/cli/samples.rbs +8 -0
  319. data/sig/ibex/cli/verify.rbs +28 -0
  320. data/sig/ibex/cli/watch.rbs +2 -2
  321. data/sig/ibex/cli.rbs +79 -5
  322. data/sig/ibex/codegen/action_method_source.rbs +4 -4
  323. data/sig/ibex/codegen/explain.rbs +45 -25
  324. data/sig/ibex/codegen/generated_action_abi.rbs +14 -10
  325. data/sig/ibex/codegen/rbs.rbs +12 -10
  326. data/sig/ibex/codegen/report.rbs +12 -12
  327. data/sig/ibex/codegen/ruby.rbs +18 -15
  328. data/sig/ibex/codegen/ruby_actions.rbs +6 -6
  329. data/sig/ibex/codegen/ruby_syntax.rbs +10 -8
  330. data/sig/ibex/configuration/analysis_grammar.rbs +13 -0
  331. data/sig/ibex/configuration/explanation.rbs +195 -0
  332. data/sig/ibex/configuration/inspector.rbs +53 -0
  333. data/sig/ibex/configuration.rbs +242 -0
  334. data/sig/ibex/coverage/collector.rbs +16 -14
  335. data/sig/ibex/coverage/event_stream.rbs +12 -10
  336. data/sig/ibex/coverage/report.rbs +20 -18
  337. data/sig/ibex/coverage/runtime_event_validator.rbs +38 -36
  338. data/sig/ibex/delta_reducer.rbs +38 -0
  339. data/sig/ibex/diff.rbs +47 -0
  340. data/sig/ibex/equiv/machine.rbs +54 -0
  341. data/sig/ibex/equiv.rbs +129 -0
  342. data/sig/ibex/fix.rbs +138 -0
  343. data/sig/ibex/frontend/ast.rbs +33 -7
  344. data/sig/ibex/frontend/bootstrap_parser.rbs +2 -0
  345. data/sig/ibex/frontend/diagnostic.rbs +2 -2
  346. data/sig/ibex/frontend/formatter.rbs +38 -30
  347. data/sig/ibex/frontend/generated_parser.rbs +87 -77
  348. data/sig/ibex/frontend/generated_parser_base.rbs +4 -2
  349. data/sig/ibex/frontend/parser/declarations.rbs +3 -0
  350. data/sig/ibex/frontend/parser_configuration_support.rbs +27 -0
  351. data/sig/ibex/frontend/resolution.rbs +3 -2
  352. data/sig/ibex/frontend/source_cursor.rbs +2 -2
  353. data/sig/ibex/frontend/source_span.rbs +5 -2
  354. data/sig/ibex/frontend/token_adapter/declaration_state.rbs +13 -1
  355. data/sig/ibex/frontend/token_adapter.rbs +6 -0
  356. data/sig/ibex/fuzz.rbs +71 -0
  357. data/sig/ibex/generation_input.rbs +2 -2
  358. data/sig/ibex/generation_manifest.rbs +35 -32
  359. data/sig/ibex/generation_transaction_recovery.rbs +2 -2
  360. data/sig/ibex/generation_transaction_validation.rbs +2 -2
  361. data/sig/ibex/grammar_tests.rbs +2 -2
  362. data/sig/ibex/impact/action_impact.rbs +58 -0
  363. data/sig/ibex/impact/automaton_impact.rbs +37 -0
  364. data/sig/ibex/impact/coverage_impact.rbs +28 -0
  365. data/sig/ibex/impact/graph.rbs +67 -0
  366. data/sig/ibex/impact/propagation.rbs +56 -0
  367. data/sig/ibex/impact/report.rbs +107 -0
  368. data/sig/ibex/impact/seeds.rbs +36 -0
  369. data/sig/ibex/impact/severity.rbs +55 -0
  370. data/sig/ibex/impact.rbs +6 -0
  371. data/sig/ibex/ir/automaton_ir.rbs +30 -11
  372. data/sig/ibex/ir/grammar_ir.rbs +41 -27
  373. data/sig/ibex/ir/lexer_ir.rbs +8 -8
  374. data/sig/ibex/ir/parser_contract.rbs +69 -0
  375. data/sig/ibex/ir/serialize.rbs +63 -28
  376. data/sig/ibex/ir/validator/automaton.rbs +47 -44
  377. data/sig/ibex/ir/validator/base.rbs +35 -31
  378. data/sig/ibex/ir/validator/grammar.rbs +78 -67
  379. data/sig/ibex/ir/validator/lexer.rbs +4 -4
  380. data/sig/ibex/ir.rbs +9 -3
  381. data/sig/ibex/lalr/build_metrics.rbs +42 -2
  382. data/sig/ibex/lalr/builder.rbs +75 -24
  383. data/sig/ibex/lalr/conflict_search.rbs +5 -2
  384. data/sig/ibex/lalr/counterexample.rbs +17 -14
  385. data/sig/ibex/lalr/direct_lookaheads.rbs +35 -28
  386. data/sig/ibex/lalr/goto_follows.rbs +89 -0
  387. data/sig/ibex/lalr/ielr/annotator.rbs +67 -0
  388. data/sig/ibex/lalr/ielr/bits.rbs +14 -0
  389. data/sig/ibex/lalr/ielr/inadequacy.rbs +24 -0
  390. data/sig/ibex/lalr/ielr/item_lookaheads.rbs +35 -0
  391. data/sig/ibex/lalr/ielr/pipeline.rbs +17 -0
  392. data/sig/ibex/lalr/ielr/split_stability.rbs +27 -0
  393. data/sig/ibex/lalr/ielr/split_state.rbs +14 -0
  394. data/sig/ibex/lalr/ielr/state_splitter.rbs +76 -0
  395. data/sig/ibex/lalr/ielr_partition.rbs +17 -5
  396. data/sig/ibex/lalr/inadequacy_report.rbs +21 -0
  397. data/sig/ibex/lalr/lookahead_propagation.rbs +38 -0
  398. data/sig/ibex/lalr/lr0_collection.rbs +50 -0
  399. data/sig/ibex/lalr/unreachable_states.rbs +25 -0
  400. data/sig/ibex/lalr.rbs +11 -1
  401. data/sig/ibex/location.rbs +6 -6
  402. data/sig/ibex/lsp/document_handlers.rbs +8 -8
  403. data/sig/ibex/lsp/initialization_handlers.rbs +12 -12
  404. data/sig/ibex/lsp/navigation_handlers.rbs +15 -12
  405. data/sig/ibex/lsp/parser_configuration_assistance.rbs +49 -0
  406. data/sig/ibex/lsp/position_codec.rbs +8 -4
  407. data/sig/ibex/lsp/request_handlers.rbs +4 -4
  408. data/sig/ibex/lsp/request_support.rbs +8 -8
  409. data/sig/ibex/lsp/server.rbs +16 -16
  410. data/sig/ibex/lsp/symbol_index.rbs +20 -21
  411. data/sig/ibex/lsp/symbol_index_builder.rbs +9 -8
  412. data/sig/ibex/lsp/symbol_occurrence.rbs +11 -5
  413. data/sig/ibex/lsp/transport.rbs +18 -6
  414. data/sig/ibex/lsp/workspace.rbs +3 -2
  415. data/sig/ibex/lsp/workspace_analyzer.rbs +1 -1
  416. data/sig/ibex/messages.rbs +26 -0
  417. data/sig/ibex/metrics.rbs +50 -0
  418. data/sig/ibex/normalize/diagnostics.rbs +4 -4
  419. data/sig/ibex/normalize/expander.rbs +2 -2
  420. data/sig/ibex/normalize/expression.rbs +10 -8
  421. data/sig/ibex/normalize/grammar_builder.rbs +11 -0
  422. data/sig/ibex/normalize/inline_expansion.rbs +59 -50
  423. data/sig/ibex/normalize/lexer.rbs +4 -4
  424. data/sig/ibex/normalize/parameter_ebnf_lowering.rbs +15 -14
  425. data/sig/ibex/normalize/parameter_lowering.rbs +18 -18
  426. data/sig/ibex/normalize/parameters.rbs +13 -8
  427. data/sig/ibex/normalize/parser_configuration.rbs +23 -0
  428. data/sig/ibex/normalize.rbs +11 -5
  429. data/sig/ibex/racc_migration/report.rbs +8 -6
  430. data/sig/ibex/rake_task.rbs +1 -1
  431. data/sig/ibex/samples.rbs +13 -4
  432. data/sig/ibex/table_artifact/builder.rbs +93 -0
  433. data/sig/ibex/table_artifact/cst_projection.rbs +20 -0
  434. data/sig/ibex/table_artifact/document.rbs +27 -0
  435. data/sig/ibex/table_artifact/executor.rbs +66 -0
  436. data/sig/ibex/table_artifact/serializer.rbs +25 -0
  437. data/sig/ibex/table_artifact/validator/metadata.rbs +52 -0
  438. data/sig/ibex/table_artifact/validator/support.rbs +46 -0
  439. data/sig/ibex/table_artifact/validator/tables.rbs +63 -0
  440. data/sig/ibex/table_artifact/validator.rbs +66 -0
  441. data/sig/ibex/table_artifact.rbs +32 -0
  442. data/sig/ibex/table_simulation/result.rbs +8 -4
  443. data/sig/ibex/table_simulation/step.rbs +4 -2
  444. data/sig/ibex/tables.rbs +10 -9
  445. data/sig/ibex/verifiable_generation_bundle.rbs +24 -0
  446. data/sig/ibex/verification_report/builder.rbs +53 -0
  447. data/sig/ibex/verification_report/canonical_ir.rbs +41 -0
  448. data/sig/ibex/verification_report/logical_path.rbs +34 -0
  449. data/sig/ibex/verification_report/validator.rbs +114 -0
  450. data/sig/ibex/verification_report.rbs +44 -0
  451. data/sig/ibex/verify/action_correspondence.rbs +50 -0
  452. data/sig/ibex/verify/language_witness.rbs +112 -0
  453. data/sig/ibex/verify/reference_collection.rbs +63 -0
  454. data/sig/ibex/verify/result.rbs +52 -0
  455. data/sig/ibex/verify/verifier.rbs +170 -0
  456. data/sig/ibex/verify.rbs +6 -0
  457. data/sig/ibex/watch/runner.rbs +12 -2
  458. data/sig/ibex/watch/source_snapshot.rbs +13 -9
  459. metadata +254 -12
  460. data/lib/ibex/ir/migration.rb +0 -120
  461. data/sig/ibex/ir/migration.rbs +0 -34
@@ -2,12 +2,15 @@
2
2
 
3
3
  module Ibex
4
4
  module IR
5
+ # Grammar IR has one active wire format. A future incompatible format
6
+ # change may advance this number, but the runtime never treats old
7
+ # formats as an alternate compatibility surface.
5
8
  SCHEMA_VERSION: ::Integer
6
9
 
7
10
  SUPPORTED_SCHEMA_VERSIONS: Array[Integer]
8
11
 
9
- # @rbs (untyped value) -> untyped
10
- def self?.deep_freeze: (untyped value) -> untyped
12
+ # @rbs (Object? value) -> Object?
13
+ def self?.deep_freeze: (Object? value) -> Object?
11
14
 
12
15
  # An interned terminal or nonterminal.
13
16
  class GrammarSymbol
@@ -39,8 +42,8 @@ module Ibex
39
42
  # @rbs () -> bool
40
43
  def nonterminal?: () -> bool
41
44
 
42
- # @rbs (?schema_version: Integer) -> Hash[Symbol, untyped]
43
- def to_h: (?schema_version: Integer) -> Hash[Symbol, untyped]
45
+ # @rbs () -> Hash[Symbol, Object?]
46
+ def to_h: () -> Hash[Symbol, Object?]
44
47
  end
45
48
 
46
49
  # Opaque Ruby semantic action metadata.
@@ -59,8 +62,8 @@ module Ibex
59
62
  # ?composition: action_composition?) -> void
60
63
  def initialize: (code: String, location: location, ?named_refs: Array[named_ref], ?context_length: Integer, ?composition: action_composition?) -> void
61
64
 
62
- # @rbs (?schema_version: Integer) -> Hash[Symbol, untyped]
63
- def to_h: (?schema_version: Integer) -> Hash[Symbol, untyped]
65
+ # @rbs () -> Hash[Symbol, Object?]
66
+ def to_h: () -> Hash[Symbol, Object?]
64
67
  end
65
68
 
66
69
  # A normalized BNF production using symbol ids.
@@ -75,7 +78,7 @@ module Ibex
75
78
 
76
79
  attr_reader precedence_override: Integer?
77
80
 
78
- attr_reader origin: Hash[Symbol, untyped]
81
+ attr_reader origin: Hash[Symbol, Object?]
79
82
 
80
83
  attr_reader documentation: String?
81
84
 
@@ -84,12 +87,12 @@ module Ibex
84
87
  attr_reader node: node_annotation?
85
88
 
86
89
  # @rbs (id: Integer, lhs: Integer, rhs: Array[Integer], action: Action?, precedence_override: Integer?,
87
- # origin: Hash[Symbol, untyped], ?documentation: String?, ?expansion: production_expansion?,
90
+ # origin: Hash[Symbol, Object?], ?documentation: String?, ?expansion: production_expansion?,
88
91
  # ?node: node_annotation?) -> void
89
- def initialize: (id: Integer, lhs: Integer, rhs: Array[Integer], action: Action?, precedence_override: Integer?, origin: Hash[Symbol, untyped], ?documentation: String?, ?expansion: production_expansion?, ?node: node_annotation?) -> void
92
+ def initialize: (id: Integer, lhs: Integer, rhs: Array[Integer], action: Action?, precedence_override: Integer?, origin: Hash[Symbol, Object?], ?documentation: String?, ?expansion: production_expansion?, ?node: node_annotation?) -> void
90
93
 
91
- # @rbs (?schema_version: Integer) -> Hash[Symbol, untyped]
92
- def to_h: (?schema_version: Integer) -> Hash[Symbol, untyped]
94
+ # @rbs () -> Hash[Symbol, Object?]
95
+ def to_h: () -> Hash[Symbol, Object?]
93
96
  end
94
97
 
95
98
  # One opaque user-code block and the location of its first code line.
@@ -101,8 +104,8 @@ module Ibex
101
104
  # @rbs (code: String, location: location) -> void
102
105
  def initialize: (code: String, location: location) -> void
103
106
 
104
- # @rbs () -> Hash[Symbol, untyped]
105
- def to_h: () -> Hash[Symbol, untyped]
107
+ # @rbs () -> Hash[Symbol, Object?]
108
+ def to_h: () -> Hash[Symbol, Object?]
106
109
  end
107
110
 
108
111
  # Immutable normalized grammar exchanged between pipeline stages.
@@ -149,20 +152,28 @@ module Ibex
149
152
 
150
153
  attr_reader source_provenance: source_provenance?
151
154
 
152
- attr_reader migration: migration_metadata?
155
+ attr_reader parser_contract: ParserContract
153
156
 
154
157
  # @rbs (class_name: String, superclass: String?, start: String, expect: Integer, ?expect_rr: Integer?,
155
158
  # options: grammar_options,
156
159
  # symbols: Array[GrammarSymbol], productions: Array[Production], user_code: Hash[String, String],
157
160
  # conversions: Hash[String, String], warnings: Array[grammar_warning], ?user_code_chunks: user_code_chunks?,
158
- # ?schema_version: Integer, ?source_provenance: source_provenance?,
159
- # ?migration: migration_metadata?, ?parser_parameters: Array[parser_parameter],
161
+ # ?parser_parameters: Array[parser_parameter],
160
162
  # ?value_printers: Array[value_printer], ?grammar_tests: Array[grammar_test],
161
163
  # ?recovery: recovery_policy?, ?lexer: Lexer?,
162
- # ?mode: grammar_mode, ?starts: Array[String]?) -> void
164
+ # ?mode: grammar_mode, ?starts: Array[String]?, ?parser_contract: ParserContract,
165
+ # ?source_provenance: source_provenance?) -> void
163
166
  # rubocop:disable Metrics/AbcSize, Metrics/ParameterLists
164
- # Immutable versioned IR is constructed from explicit public fields.
165
- def initialize: (class_name: String, superclass: String?, start: String, expect: Integer, options: grammar_options, symbols: Array[GrammarSymbol], productions: Array[Production], user_code: Hash[String, String], conversions: Hash[String, String], warnings: Array[grammar_warning], ?expect_rr: Integer?, ?user_code_chunks: user_code_chunks?, ?schema_version: Integer, ?source_provenance: source_provenance?, ?migration: migration_metadata?, ?parser_parameters: Array[parser_parameter], ?value_printers: Array[value_printer], ?grammar_tests: Array[grammar_test], ?recovery: recovery_policy?, ?lexer: Lexer?, ?mode: grammar_mode, ?starts: Array[String]?) -> void
167
+ # Immutable current IR is constructed from explicit public fields.
168
+ def initialize: (class_name: String, superclass: String?, start: String, expect: Integer, options: grammar_options, symbols: Array[GrammarSymbol], productions: Array[Production], user_code: Hash[String, String], conversions: Hash[String, String], warnings: Array[grammar_warning], ?expect_rr: Integer?, ?user_code_chunks: user_code_chunks?, ?parser_parameters: Array[parser_parameter], ?value_printers: Array[value_printer], ?grammar_tests: Array[grammar_test], ?recovery: recovery_policy?, ?lexer: Lexer?, ?mode: grammar_mode, ?starts: Array[String]?, ?parser_contract: ParserContract, ?source_provenance: source_provenance?) -> void
169
+
170
+ # @rbs (class_name: String, superclass: String?, start: String, expect: Integer, options: grammar_options,
171
+ # symbols: Array[GrammarSymbol], productions: Array[Production], user_code: Hash[String, String],
172
+ # conversions: Hash[String, String], warnings: Array[grammar_warning], user_code_chunks: user_code_chunks?,
173
+ # source_provenance: source_provenance?, expect_rr: Integer?, parser_parameters: Array[parser_parameter],
174
+ # value_printers: Array[value_printer], grammar_tests: Array[grammar_test], recovery: recovery_policy?,
175
+ # lexer: Lexer?, mode: grammar_mode, starts: Array[String]?, parser_contract: ParserContract) -> void
176
+ def initialize_current: (class_name: String, superclass: String?, start: String, expect: Integer, options: grammar_options, symbols: Array[GrammarSymbol], productions: Array[Production], user_code: Hash[String, String], conversions: Hash[String, String], warnings: Array[grammar_warning], user_code_chunks: user_code_chunks?, source_provenance: source_provenance?, expect_rr: Integer?, parser_parameters: Array[parser_parameter], value_printers: Array[value_printer], grammar_tests: Array[grammar_test], recovery: recovery_policy?, lexer: Lexer?, mode: grammar_mode, starts: Array[String]?, parser_contract: ParserContract) -> void
166
177
 
167
178
  # @rbs (String name) -> GrammarSymbol?
168
179
  def symbol: (String name) -> GrammarSymbol?
@@ -176,8 +187,8 @@ module Ibex
176
187
  # @rbs () -> Array[GrammarSymbol]
177
188
  def nonterminals: () -> Array[GrammarSymbol]
178
189
 
179
- # @rbs () -> Hash[Symbol, untyped]
180
- def to_h: () -> Hash[Symbol, untyped]
190
+ # @rbs () -> Hash[Symbol, Object?]
191
+ def to_h: () -> Hash[Symbol, Object?]
181
192
 
182
193
  private
183
194
 
@@ -187,17 +198,20 @@ module Ibex
187
198
  # @rbs (String start, Array[String]? starts, grammar_mode mode) -> Array[String]
188
199
  def validate_starts: (String start, Array[String]? starts, grammar_mode mode) -> Array[String]
189
200
 
190
- # @rbs (Hash[Symbol, untyped] value) -> void
191
- def append_optional_metadata: (Hash[Symbol, untyped] value) -> void
201
+ # @rbs (Hash[Symbol, Object?] value) -> void
202
+ def append_optional_metadata: (Hash[Symbol, Object?] value) -> void
192
203
 
193
- # @rbs (Hash[Symbol, untyped] value) -> void
194
- def append_parser_metadata: (Hash[Symbol, untyped] value) -> void
204
+ # @rbs (Hash[Symbol, Object?] value) -> void
205
+ def append_parser_metadata: (Hash[Symbol, Object?] value) -> void
195
206
 
196
- # @rbs (Hash[Symbol, untyped] value) -> void
197
- def append_recovery_metadata: (Hash[Symbol, untyped] value) -> void
207
+ # @rbs (Hash[Symbol, Object?] value) -> void
208
+ def append_recovery_metadata: (Hash[Symbol, Object?] value) -> void
198
209
 
199
210
  # @rbs () -> void
200
211
  def validate_user_code_chunks: () -> void
212
+
213
+ # @rbs (ParserContract parser_contract) -> void
214
+ def validate_current_metadata: (ParserContract parser_contract) -> void
201
215
  end
202
216
  end
203
217
  end
@@ -30,28 +30,28 @@ module Ibex
30
30
  # options: String, action: String?, location: location) -> void
31
31
  def initialize: (id: Integer, state: String, kind: Symbol, token: String?, pattern: String, pattern_kind: Symbol, options: String, action: String?, location: location) -> void
32
32
 
33
- # @rbs () -> Hash[Symbol, untyped]
34
- def to_h: () -> Hash[Symbol, untyped]
33
+ # @rbs () -> Hash[Symbol, lexer_rule_document_value]
34
+ def to_h: () -> Hash[Symbol, lexer_rule_document_value]
35
35
  end
36
36
 
37
- # Independently versioned lexer contract embedded by Grammar IR v2.
37
+ # Independently versioned lexer contract embedded by the current Grammar IR.
38
38
  class Lexer
39
39
  attr_reader states: Array[String]
40
40
 
41
41
  attr_reader rules: Array[LexerRule]
42
42
 
43
- attr_reader warnings: Array[Hash[Symbol, untyped]]
43
+ attr_reader warnings: Array[lexer_warning]
44
44
 
45
45
  attr_reader schema_version: Integer
46
46
 
47
47
  attr_reader source_provenance: source_provenance?
48
48
 
49
- # @rbs (states: Array[String], rules: Array[LexerRule], warnings: Array[Hash[Symbol, untyped]],
49
+ # @rbs (states: Array[String], rules: Array[LexerRule], warnings: Array[lexer_warning],
50
50
  # ?schema_version: Integer, ?source_provenance: source_provenance?) -> void
51
- def initialize: (states: Array[String], rules: Array[LexerRule], warnings: Array[Hash[Symbol, untyped]], ?schema_version: Integer, ?source_provenance: source_provenance?) -> void
51
+ def initialize: (states: Array[String], rules: Array[LexerRule], warnings: Array[lexer_warning], ?schema_version: Integer, ?source_provenance: source_provenance?) -> void
52
52
 
53
- # @rbs () -> Hash[Symbol, untyped]
54
- def to_h: () -> Hash[Symbol, untyped]
53
+ # @rbs () -> Hash[Symbol, lexer_document_value]
54
+ def to_h: () -> Hash[Symbol, lexer_document_value]
55
55
  end
56
56
  end
57
57
  end
@@ -0,0 +1,69 @@
1
+ # Generated from lib/ibex/ir/parser_contract.rb with RBS::Inline
2
+
3
+ module Ibex
4
+ module IR
5
+ # Root-owned parser configuration persisted by the current Grammar IR.
6
+ class ParserContract
7
+ type definition = { configuration: String, values: Array[Symbol] }
8
+
9
+ type entry_location = { file: String?, line: Integer, column: Integer }
10
+
11
+ type entry_value = String? | bool | entry_location?
12
+
13
+ DEFINITIONS: Hash[Symbol, definition]
14
+
15
+ # One specified or explicitly unspecified contract field.
16
+ class Entry
17
+ attr_reader key: Symbol
18
+
19
+ attr_reader value: Symbol?
20
+
21
+ attr_reader location: Location?
22
+
23
+ attr_reader explicit: bool
24
+
25
+ # @rbs (Symbol key, ?value: Symbol?, ?location: Location?, ?explicit: bool) -> void
26
+ def initialize: (Symbol key, ?value: Symbol?, ?location: Location?, ?explicit: bool) -> void
27
+
28
+ # @rbs () -> Hash[Symbol, entry_value]
29
+ def to_h: () -> Hash[Symbol, entry_value]
30
+
31
+ private
32
+
33
+ # @rbs (Symbol key, Array[Symbol] allowed, Symbol? value, Location? location, bool explicit) -> void
34
+ def validate_state!: (Symbol key, Array[Symbol] allowed, Symbol? value, Location? location, bool explicit) -> void
35
+
36
+ # @rbs () -> entry_location?
37
+ def serialized_location: () -> entry_location?
38
+ end
39
+
40
+ attr_reader algorithm: Entry
41
+
42
+ attr_reader entries: Entry
43
+
44
+ attr_reader cst_trivia: Entry
45
+
46
+ # @rbs (?algorithm: Entry?, ?entries: Entry?, ?cst_trivia: Entry?) -> void
47
+ def initialize: (?algorithm: Entry?, ?entries: Entry?, ?cst_trivia: Entry?) -> void
48
+
49
+ # @rbs () -> Hash[Symbol, Hash[Symbol, entry_value]]
50
+ def to_h: () -> Hash[Symbol, Hash[Symbol, entry_value]]
51
+
52
+ # Values supplied to the typed resolver; unspecified fields are absent.
53
+ # @rbs () -> Hash[String, Symbol]
54
+ def configuration_values: () -> Hash[String, Symbol]
55
+
56
+ # Source locations supplied to the typed resolver.
57
+ # @rbs () -> Hash[String, Location]
58
+ def configuration_locations: () -> Hash[String, Location]
59
+
60
+ private
61
+
62
+ # @rbs (Symbol key, Entry? entry) -> Entry
63
+ def normalize_entry: (Symbol key, Entry? entry) -> Entry
64
+
65
+ # @rbs () -> Array[Entry]
66
+ def specified_entries: () -> Array[Entry]
67
+ end
68
+ end
69
+ end
@@ -2,66 +2,101 @@
2
2
 
3
3
  module Ibex
4
4
  module IR
5
- # Stable JSON serialization for versioned pipeline IR.
6
- # rubocop:disable Metrics/ModuleLength -- explicit versioned fields keep serialization changes auditable.
5
+ # Stable JSON serialization for the current pipeline IR.
6
+ # rubocop:disable Metrics/ModuleLength -- explicit fields keep serialization changes auditable.
7
+ # rubocop:disable Lint/SelfAssignment -- RBS inline assertions narrow schema-decoded values in place.
7
8
  module Serialize
8
- private def validate_version: (untyped data) -> untyped
9
+ private def validate_version: (Hash[String, IR::serialized_value] data) -> void
9
10
 
10
- private def self.validate_version: (untyped data) -> untyped
11
+ private def self.validate_version: (Hash[String, IR::serialized_value] data) -> void
11
12
 
12
- private def load_grammar: (untyped data) -> untyped
13
+ private def load_grammar: (Hash[String, IR::serialized_value] data) -> Grammar
13
14
 
14
- private def self.load_grammar: (untyped data) -> untyped
15
+ private def self.load_grammar: (Hash[String, IR::serialized_value] data) -> Grammar
15
16
 
16
- private def load_automaton: (untyped data) -> untyped
17
+ private def load_symbols: (Hash[String, IR::serialized_value] data) -> Array[GrammarSymbol]
17
18
 
18
- private def self.load_automaton: (untyped data) -> untyped
19
+ private def self.load_symbols: (Hash[String, IR::serialized_value] data) -> Array[GrammarSymbol]
19
20
 
20
- private def load_lexer: (untyped data) -> untyped
21
+ private def load_productions: (Hash[String, IR::serialized_value] data) -> Array[Production]
21
22
 
22
- private def self.load_lexer: (untyped data) -> untyped
23
+ private def self.load_productions: (Hash[String, IR::serialized_value] data) -> Array[Production]
23
24
 
24
- private def load_state: (untyped state, untyped grammar) -> untyped
25
+ private def empty_chunks: () -> Hash[String, IR::serialized_value]
25
26
 
26
- private def self.load_state: (untyped state, untyped grammar) -> untyped
27
+ private def self.empty_chunks: () -> Hash[String, IR::serialized_value]
27
28
 
28
- private def symbol_keyed: (untyped values, untyped grammar, ?actions: untyped) -> untyped
29
+ private def empty_parameters: () -> Array[IR::serialized_value]
29
30
 
30
- private def self.symbol_keyed: (untyped values, untyped grammar, ?actions: untyped) -> untyped
31
+ private def self.empty_parameters: () -> Array[IR::serialized_value]
31
32
 
32
- private def normalize_action: (untyped value) -> untyped
33
+ private def empty_printers: () -> Array[IR::serialized_value]
33
34
 
34
- private def self.normalize_action: (untyped value) -> untyped
35
+ private def self.empty_printers: () -> Array[IR::serialized_value]
35
36
 
36
- private def load_production: (untyped production, Integer schema_version) -> untyped
37
+ private def empty_tests: () -> Array[IR::serialized_value]
37
38
 
38
- private def self.load_production: (untyped production, Integer schema_version) -> untyped
39
+ private def self.empty_tests: () -> Array[IR::serialized_value]
39
40
 
40
- private def load_user_code_chunks: (untyped chunks) -> untyped
41
+ private def empty_recovery: () -> Hash[String, IR::serialized_value]
41
42
 
42
- private def self.load_user_code_chunks: (untyped chunks) -> untyped
43
+ private def self.empty_recovery: () -> Hash[String, IR::serialized_value]
43
44
 
44
- private def load_symbol_metadata: (untyped symbol, String field) -> String?
45
+ private def load_automaton: (Hash[String, IR::serialized_value] data) -> Automaton
45
46
 
46
- private def self.load_symbol_metadata: (untyped symbol, String field) -> String?
47
+ private def self.load_automaton: (Hash[String, IR::serialized_value] data) -> Automaton
47
48
 
48
- private def load_grammar_tests: (untyped tests) -> untyped
49
+ private def load_lexer: (Hash[String, IR::serialized_value] data) -> Lexer
49
50
 
50
- private def self.load_grammar_tests: (untyped tests) -> untyped
51
+ private def self.load_lexer: (Hash[String, IR::serialized_value] data) -> Lexer
51
52
 
52
- private def symbol_source_position: (untyped symbol) -> String
53
+ private def load_state: (Hash[String, IR::serialized_value] state, Grammar grammar) -> AutomatonState
53
54
 
54
- private def self.symbol_source_position: (untyped symbol) -> String
55
+ private def self.load_state: (Hash[String, IR::serialized_value] state, Grammar grammar) -> AutomatonState
55
56
 
56
- private def symbolize: (untyped value) -> untyped
57
+ private def symbol_keyed: (Hash[String, IR::serialized_value] values, Grammar grammar, ?actions: bool) -> Hash[Integer, IR::serialized_value]
57
58
 
58
- private def self.symbolize: (untyped value) -> untyped
59
+ private def self.symbol_keyed: (Hash[String, IR::serialized_value] values, Grammar grammar, ?actions: bool) -> Hash[Integer, IR::serialized_value]
60
+
61
+ private def normalize_action: (Hash[String, IR::serialized_value] value) -> parser_action?
62
+
63
+ private def self.normalize_action: (Hash[String, IR::serialized_value] value) -> parser_action?
64
+
65
+ private def load_production: (Hash[String, IR::serialized_value] production) -> Production
66
+
67
+ private def self.load_production: (Hash[String, IR::serialized_value] production) -> Production
68
+
69
+ private def load_user_code_chunks: (Hash[String, Array[Hash[String, IR::serialized_value]]] chunks) -> user_code_chunks
70
+
71
+ private def self.load_user_code_chunks: (Hash[String, Array[Hash[String, IR::serialized_value]]] chunks) -> user_code_chunks
72
+
73
+ private def load_symbol_metadata: (Hash[String, IR::serialized_value] symbol, String field) -> String?
74
+
75
+ private def self.load_symbol_metadata: (Hash[String, IR::serialized_value] symbol, String field) -> String?
76
+
77
+ private def load_grammar_tests: (Array[Hash[String, IR::serialized_value]] tests) -> Array[grammar_test]
78
+
79
+ private def self.load_grammar_tests: (Array[Hash[String, IR::serialized_value]] tests) -> Array[grammar_test]
80
+
81
+ private def symbol_source_position: (Hash[String, IR::serialized_value] symbol) -> String
82
+
83
+ private def self.symbol_source_position: (Hash[String, IR::serialized_value] symbol) -> String
84
+
85
+ private def load_parser_contract: (IR::serialized_value value) -> IR::serialized_value
86
+
87
+ private def self.load_parser_contract: (IR::serialized_value value) -> IR::serialized_value
88
+
89
+ private def symbolize: (IR::serialized_value value) -> IR::serialized_value
90
+
91
+ private def self.symbolize: (IR::serialized_value value) -> IR::serialized_value
59
92
 
60
93
  # @rbs (Grammar | Automaton | Lexer value) -> String
61
94
  def self?.dump: (Grammar | Automaton | Lexer value) -> String
62
95
 
63
96
  # @rbs (String source) -> (Grammar | Automaton | Lexer)
64
97
  def self?.load: (String source) -> (Grammar | Automaton | Lexer)
98
+
99
+ private
65
100
  end
66
101
  end
67
102
  end
@@ -3,12 +3,12 @@
3
3
  module Ibex
4
4
  module IR
5
5
  module Validator
6
- # Structural and referential validation for a versioned Automaton IR JSON object.
6
+ # Structural and referential validation for a current Automaton IR JSON object.
7
7
  # rubocop:disable Metrics/ClassLength -- inline type contracts accompany one cohesive document validator.
8
8
  class AutomatonDocument < Base
9
9
  ROOT_REQUIRED: Array[String]
10
10
 
11
- V2_ROOT_OPTIONAL: Array[String]
11
+ ROOT_OPTIONAL: Array[String]
12
12
 
13
13
  STATE_REQUIRED: Array[String]
14
14
 
@@ -20,12 +20,12 @@ module Ibex
20
20
 
21
21
  @grammar: GrammarDocument
22
22
 
23
- @states_by_id: Hash[Integer, Hash[String, untyped]]
23
+ @states_by_id: Hash[Integer, json_object]
24
24
 
25
- @data: Hash[String, untyped]
25
+ @data: json_object
26
26
 
27
- # @rbs (Hash[String, untyped] data, ?version: Integer) -> void
28
- def initialize: (Hash[String, untyped] data, ?version: Integer) -> void
27
+ # @rbs (json_object data, ?version: Integer) -> void
28
+ def initialize: (json_object data, ?version: Integer) -> void
29
29
 
30
30
  # @rbs () -> self
31
31
  def validate: () -> self
@@ -35,6 +35,9 @@ module Ibex
35
35
  # @rbs () -> void
36
36
  def validate_entry_states: () -> void
37
37
 
38
+ # @rbs (Hash[String, untyped] grammar) -> void
39
+ def validate_construction_contract: (Hash[String, untyped] grammar) -> void
40
+
38
41
  # @rbs () -> void
39
42
  def validate_digest: () -> void
40
43
 
@@ -44,65 +47,65 @@ module Ibex
44
47
  # @rbs () -> void
45
48
  def validate_state_contents: () -> void
46
49
 
47
- # @rbs (untyped value, String path) -> void
48
- def validate_items: (untyped value, String path) -> void
50
+ # @rbs (json_value value, String path) -> void
51
+ def validate_items: (json_value value, String path) -> void
49
52
 
50
- # @rbs (Integer production_id, untyped dot_value, String path) -> void
51
- def validate_item_production: (Integer production_id, untyped dot_value, String path) -> void
53
+ # @rbs (Integer production_id, json_value dot_value, String path) -> void
54
+ def validate_item_production: (Integer production_id, json_value dot_value, String path) -> void
52
55
 
53
- # @rbs (untyped value, String path) -> void
54
- def validate_lookaheads: (untyped value, String path) -> void
56
+ # @rbs (json_value value, String path) -> void
57
+ def validate_lookaheads: (json_value value, String path) -> void
55
58
 
56
- # @rbs (untyped value, String path) -> void
57
- def validate_transitions: (untyped value, String path) -> void
59
+ # @rbs (json_value value, String path) -> void
60
+ def validate_transitions: (json_value value, String path) -> void
58
61
 
59
- # @rbs (untyped value, String path) -> void
60
- def validate_actions: (untyped value, String path) -> void
62
+ # @rbs (json_value value, String path) -> void
63
+ def validate_actions: (json_value value, String path) -> void
61
64
 
62
- # @rbs (untyped value, String path) -> void
63
- def validate_gotos: (untyped value, String path) -> void
65
+ # @rbs (json_value value, String path) -> void
66
+ def validate_gotos: (json_value value, String path) -> void
64
67
 
65
- # @rbs (untyped value, String path, ?kind: String?) { (untyped, String, Hash[String, untyped]) -> void } -> void
66
- def symbol_map: (untyped value, String path, ?kind: String?) { (untyped, String, Hash[String, untyped]) -> void } -> void
68
+ # @rbs (json_value value, String path, ?kind: String?) { (json_value, String, json_object) -> void } -> void
69
+ def symbol_map: (json_value value, String path, ?kind: String?) { (json_value, String, json_object) -> void } -> void
67
70
 
68
- # @rbs (untyped value, String path) -> void
69
- def validate_state_reference: (untyped value, String path) -> void
71
+ # @rbs (json_value value, String path) -> void
72
+ def validate_state_reference: (json_value value, String path) -> void
70
73
 
71
- # @rbs (untyped value, String path, ?nullable: bool) -> void
72
- def validate_parser_action: (untyped value, String path, ?nullable: bool) -> void
74
+ # @rbs (json_value value, String path, ?nullable: bool) -> void
75
+ def validate_parser_action: (json_value value, String path, ?nullable: bool) -> void
73
76
 
74
- # @rbs (untyped value, String path) -> void
75
- def validate_production_reference: (untyped value, String path) -> void
77
+ # @rbs (json_value value, String path) -> void
78
+ def validate_production_reference: (json_value value, String path) -> void
76
79
 
77
- # @rbs (untyped value, String path) -> void
78
- def validate_conflicts: (untyped value, String path) -> void
80
+ # @rbs (json_value value, String path) -> void
81
+ def validate_conflicts: (json_value value, String path) -> void
79
82
 
80
- # @rbs (Hash[String, untyped] conflict, String path) -> void
81
- def validate_shift_reduce: (Hash[String, untyped] conflict, String path) -> void
83
+ # @rbs (json_object conflict, String path) -> void
84
+ def validate_shift_reduce: (json_object conflict, String path) -> void
82
85
 
83
- # @rbs (Hash[String, untyped] conflict, String path) -> void
84
- def validate_reduce_reduce: (Hash[String, untyped] conflict, String path) -> void
86
+ # @rbs (json_object conflict, String path) -> void
87
+ def validate_reduce_reduce: (json_object conflict, String path) -> void
85
88
 
86
- # @rbs (Hash[String, untyped] conflict, String path) -> void
87
- def validate_conflict_entries: (Hash[String, untyped] conflict, String path) -> void
89
+ # @rbs (json_object conflict, String path) -> void
90
+ def validate_conflict_entries: (json_object conflict, String path) -> void
88
91
 
89
- # @rbs (untyped value, String path) -> void
90
- def validate_midrule_origins: (untyped value, String path) -> void
92
+ # @rbs (json_value value, String path) -> void
93
+ def validate_midrule_origins: (json_value value, String path) -> void
91
94
 
92
- # @rbs (untyped value, String path) -> void
93
- def validate_conflict_symbol: (untyped value, String path) -> void
95
+ # @rbs (json_value value, String path) -> void
96
+ def validate_conflict_symbol: (json_value value, String path) -> void
94
97
 
95
- # @rbs (untyped value, String path, ?reductions: Array[Integer]?) -> void
96
- def validate_resolution: (untyped value, String path, ?reductions: Array[Integer]?) -> void
98
+ # @rbs (json_value value, String path, ?reductions: Array[Integer]?) -> void
99
+ def validate_resolution: (json_value value, String path, ?reductions: Array[Integer]?) -> void
97
100
 
98
101
  # @rbs () -> void
99
102
  def validate_conflict_summary: () -> void
100
103
 
101
- # @rbs (Hash[String, untyped] summary, String path) -> void
102
- def validate_conflict_counts: (Hash[String, untyped] summary, String path) -> void
104
+ # @rbs (json_object summary, String path) -> void
105
+ def validate_conflict_counts: (json_object summary, String path) -> void
103
106
 
104
- # @rbs (Hash[String, untyped] summary, String path) -> void
105
- def validate_expectation: (Hash[String, untyped] summary, String path) -> void
107
+ # @rbs (json_object summary, String path) -> void
108
+ def validate_expectation: (json_object summary, String path) -> void
106
109
  end
107
110
  end
108
111
  end
@@ -3,56 +3,60 @@
3
3
  module Ibex
4
4
  module IR
5
5
  module Validator
6
- # Shared JSON-shape checks for the two version-1 IR documents.
6
+ type json_value = String | Integer | Float | bool | nil | Array[json_value] | Hash[String, json_value]
7
+
8
+ type json_object = Hash[String, json_value]
9
+
10
+ # Shared JSON-shape checks for current IR documents.
7
11
  class Base
8
12
  POSITION: ::String
9
13
 
10
14
  private
11
15
 
12
- # @rbs (untyped value, String path, Array[String] required, ?Array[String] optional) -> Hash[String, untyped]
13
- def record: (untyped value, String path, Array[String] required, ?Array[String] optional) -> Hash[String, untyped]
16
+ # @rbs (json_value value, String path, Array[String] required, ?Array[String] optional) -> json_object
17
+ def record: (json_value value, String path, Array[String] required, ?Array[String] optional) -> json_object
14
18
 
15
- # @rbs (untyped value, String path) -> Hash[String, untyped]
16
- def object: (untyped value, String path) -> Hash[String, untyped]
19
+ # @rbs (json_value value, String path) -> json_object
20
+ def object: (json_value value, String path) -> json_object
17
21
 
18
- # @rbs (untyped value, String path) -> Array[untyped]
19
- def array: (untyped value, String path) -> Array[untyped]
22
+ # @rbs (json_value value, String path) -> Array[json_value]
23
+ def array: (json_value value, String path) -> Array[json_value]
20
24
 
21
- # @rbs (untyped value, String path) -> String
22
- def string: (untyped value, String path) -> String
25
+ # @rbs (json_value value, String path) -> String
26
+ def string: (json_value value, String path) -> String
23
27
 
24
- # @rbs (untyped value, String path) -> String
25
- def nonempty_string: (untyped value, String path) -> String
28
+ # @rbs (json_value value, String path) -> String
29
+ def nonempty_string: (json_value value, String path) -> String
26
30
 
27
- # @rbs (untyped value, String path) -> Integer
28
- def integer: (untyped value, String path) -> Integer
31
+ # @rbs (json_value value, String path) -> Integer
32
+ def integer: (json_value value, String path) -> Integer
29
33
 
30
- # @rbs (untyped value, String path) -> Integer
31
- def nonnegative_integer: (untyped value, String path) -> Integer
34
+ # @rbs (json_value value, String path) -> Integer
35
+ def nonnegative_integer: (json_value value, String path) -> Integer
32
36
 
33
- # @rbs (untyped value, String path) -> bool
34
- def boolean: (untyped value, String path) -> bool
37
+ # @rbs (json_value value, String path) -> bool
38
+ def boolean: (json_value value, String path) -> bool
35
39
 
36
- # @rbs (untyped value, String path, untyped expected) -> void
37
- def literal: (untyped value, String path, untyped expected) -> void
40
+ # @rbs (json_value value, String path, json_value expected) -> void
41
+ def literal: (json_value value, String path, json_value expected) -> void
38
42
 
39
- # @rbs (untyped value, String path, Array[String] values) -> String
40
- def enum: (untyped value, String path, Array[String] values) -> String
43
+ # @rbs (json_value value, String path, Array[String] values) -> String
44
+ def enum: (json_value value, String path, Array[String] values) -> String
41
45
 
42
- # @rbs (untyped value, String path, ?nullable: bool) -> void
43
- def location: (untyped value, String path, ?nullable: bool) -> void
46
+ # @rbs (json_value value, String path, ?nullable: bool) -> void
47
+ def location: (json_value value, String path, ?nullable: bool) -> void
44
48
 
45
- # @rbs (untyped value, String path) -> Integer
46
- def positive_integer: (untyped value, String path) -> Integer
49
+ # @rbs (json_value value, String path) -> Integer
50
+ def positive_integer: (json_value value, String path) -> Integer
47
51
 
48
- # @rbs (untyped value, String path) -> String?
49
- def nullable_string: (untyped value, String path) -> String?
52
+ # @rbs (json_value value, String path) -> String?
53
+ def nullable_string: (json_value value, String path) -> String?
50
54
 
51
- # @rbs (untyped value, String path) -> void
52
- def metadata: (untyped value, String path) -> void
55
+ # @rbs (json_value value, String path) -> void
56
+ def metadata: (json_value value, String path) -> void
53
57
 
54
- # @rbs (Hash[String, untyped] value, String key, String path) -> untyped
55
- def field: (Hash[String, untyped] value, String key, String path) -> untyped
58
+ # @rbs (json_object value, String key, String path) -> json_value
59
+ def field: (json_object value, String key, String path) -> json_value
56
60
 
57
61
  # @rbs (String path, String key) -> String
58
62
  def child_path: (String path, String key) -> String