ibex 0.2.0 → 0.3.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 (437) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +95 -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 +262 -0
  40. data/docs/development.md +179 -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 +1581 -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/ja/bison-import.md +51 -0
  56. data/docs/ja/stable-api.md +53 -0
  57. data/docs/lexer-construction-profile.md +109 -0
  58. data/docs/lexer-migration.md +5 -0
  59. data/docs/maturity.md +128 -0
  60. data/docs/project-site-strategy.md +54 -0
  61. data/docs/racc-migration-evidence.md +45 -0
  62. data/docs/racc-migration.md +11 -0
  63. data/docs/release-readiness.md +126 -68
  64. data/docs/repair-semantics.md +123 -0
  65. data/docs/runtime-abi-evolution.md +307 -0
  66. data/docs/stability.md +144 -34
  67. data/docs/status.md +43 -0
  68. data/docs/syntax-sessions.md +183 -0
  69. data/docs/table-artifact.md +125 -0
  70. data/docs/test-interactions.md +219 -0
  71. data/docs/verification-report.md +137 -0
  72. data/docs/verifier-trust-boundary.md +199 -0
  73. data/docs/workloads.md +132 -0
  74. data/lib/ibex/analysis/digraph.rb +128 -0
  75. data/lib/ibex/analysis.rb +1 -0
  76. data/lib/ibex/bison_import/importer.rb +516 -0
  77. data/lib/ibex/bison_import/tokenizer.rb +260 -0
  78. data/lib/ibex/bison_import.rb +200 -0
  79. data/lib/ibex/bounded_subprocess.rb +171 -0
  80. data/lib/ibex/cli/ambiguity.rb +14 -5
  81. data/lib/ibex/cli/analysis.rb +134 -0
  82. data/lib/ibex/cli/bison_import.rb +121 -0
  83. data/lib/ibex/cli/config.rb +128 -0
  84. data/lib/ibex/cli/diagnostics.rb +31 -11
  85. data/lib/ibex/cli/documentation.rb +11 -8
  86. data/lib/ibex/cli/equiv.rb +169 -0
  87. data/lib/ibex/cli/error_messages.rb +11 -4
  88. data/lib/ibex/cli/explain.rb +14 -5
  89. data/lib/ibex/cli/fix.rb +203 -0
  90. data/lib/ibex/cli/formatting.rb +11 -10
  91. data/lib/ibex/cli/fuzz.rb +200 -0
  92. data/lib/ibex/cli/fuzz_regressions.rb +145 -0
  93. data/lib/ibex/cli/generation_artifacts.rb +53 -2
  94. data/lib/ibex/cli/generation_error_messages.rb +1 -1
  95. data/lib/ibex/cli/grammar_tests.rb +32 -14
  96. data/lib/ibex/cli/ir_tools.rb +5 -61
  97. data/lib/ibex/cli/outputs.rb +60 -33
  98. data/lib/ibex/cli/reduce.rb +202 -0
  99. data/lib/ibex/cli/reduce_reporting.rb +71 -0
  100. data/lib/ibex/cli/samples.rb +49 -23
  101. data/lib/ibex/cli/verify.rb +116 -0
  102. data/lib/ibex/cli/watch.rb +6 -5
  103. data/lib/ibex/cli.rb +357 -56
  104. data/lib/ibex/codegen/action_locations.rb +1 -1
  105. data/lib/ibex/codegen/action_method_source.rb +5 -6
  106. data/lib/ibex/codegen/action_source.rb +3 -2
  107. data/lib/ibex/codegen/ambiguity.rb +5 -4
  108. data/lib/ibex/codegen/explain.rb +123 -55
  109. data/lib/ibex/codegen/generated_action_abi.rb +10 -5
  110. data/lib/ibex/codegen/rbs.rb +15 -7
  111. data/lib/ibex/codegen/report.rb +25 -13
  112. data/lib/ibex/codegen/ruby.rb +28 -64
  113. data/lib/ibex/codegen/ruby_actions.rb +9 -6
  114. data/lib/ibex/codegen/ruby_syntax.rb +15 -9
  115. data/lib/ibex/configuration/analysis_grammar.rb +35 -0
  116. data/lib/ibex/configuration/explanation.rb +421 -0
  117. data/lib/ibex/configuration/inspector.rb +232 -0
  118. data/lib/ibex/configuration.rb +580 -0
  119. data/lib/ibex/coverage/collector.rb +21 -11
  120. data/lib/ibex/coverage/event_stream.rb +13 -7
  121. data/lib/ibex/coverage/report.rb +26 -18
  122. data/lib/ibex/coverage/runtime_event_validator.rb +30 -21
  123. data/lib/ibex/delta_reducer.rb +99 -0
  124. data/lib/ibex/diff.rb +140 -0
  125. data/lib/ibex/equiv/machine.rb +135 -0
  126. data/lib/ibex/equiv.rb +373 -0
  127. data/lib/ibex/fix.rb +557 -0
  128. data/lib/ibex/frontend/ast.rb +22 -2
  129. data/lib/ibex/frontend/bootstrap_parser.rb +6 -13
  130. data/lib/ibex/frontend/diagnostic.rb +1 -1
  131. data/lib/ibex/frontend/formatter.rb +72 -26
  132. data/lib/ibex/frontend/generated_parser.rb +147 -117
  133. data/lib/ibex/frontend/generated_parser_base.rb +7 -3
  134. data/lib/ibex/frontend/generated_parser_includes.rb +1 -11
  135. data/lib/ibex/frontend/generation.rb +1 -1
  136. data/lib/ibex/frontend/parser/declarations.rb +17 -2
  137. data/lib/ibex/frontend/parser_configuration_support.rb +56 -0
  138. data/lib/ibex/frontend/regenerator.rb +1 -0
  139. data/lib/ibex/frontend/resolution.rb +2 -1
  140. data/lib/ibex/frontend/resolver.rb +1 -1
  141. data/lib/ibex/frontend/rule_documentation.rb +2 -1
  142. data/lib/ibex/frontend/source_cursor.rb +2 -2
  143. data/lib/ibex/frontend/source_span.rb +9 -1
  144. data/lib/ibex/frontend/token_adapter/declaration_state.rb +38 -6
  145. data/lib/ibex/frontend/token_adapter.rb +10 -0
  146. data/lib/ibex/frontend.rb +1 -0
  147. data/lib/ibex/fuzz.rb +219 -0
  148. data/lib/ibex/generation_input.rb +1 -1
  149. data/lib/ibex/generation_manifest.rb +36 -25
  150. data/lib/ibex/generation_transaction.rb +1 -1
  151. data/lib/ibex/generation_transaction_recovery.rb +4 -4
  152. data/lib/ibex/generation_transaction_validation.rb +2 -2
  153. data/lib/ibex/grammar_tests.rb +1 -1
  154. data/lib/ibex/ir/automaton_ir.rb +61 -19
  155. data/lib/ibex/ir/grammar_ir.rb +76 -45
  156. data/lib/ibex/ir/lexer_ir.rb +5 -5
  157. data/lib/ibex/ir/parser_contract.rb +135 -0
  158. data/lib/ibex/ir/serialize.rb +203 -76
  159. data/lib/ibex/ir/validator/automaton.rb +64 -34
  160. data/lib/ibex/ir/validator/base.rb +51 -33
  161. data/lib/ibex/ir/validator/grammar.rb +113 -83
  162. data/lib/ibex/ir/validator/lexer.rb +2 -2
  163. data/lib/ibex/ir/validator.rb +2 -1
  164. data/lib/ibex/ir.rb +16 -3
  165. data/lib/ibex/lalr/build_metrics.rb +50 -2
  166. data/lib/ibex/lalr/builder.rb +191 -56
  167. data/lib/ibex/lalr/conflict_search.rb +15 -4
  168. data/lib/ibex/lalr/counterexample.rb +19 -14
  169. data/lib/ibex/lalr/direct_lookaheads.rb +110 -57
  170. data/lib/ibex/lalr/goto_follows.rb +229 -0
  171. data/lib/ibex/lalr/ielr/annotator.rb +214 -0
  172. data/lib/ibex/lalr/ielr/bits.rb +28 -0
  173. data/lib/ibex/lalr/ielr/inadequacy.rb +47 -0
  174. data/lib/ibex/lalr/ielr/item_lookaheads.rb +78 -0
  175. data/lib/ibex/lalr/ielr/pipeline.rb +75 -0
  176. data/lib/ibex/lalr/ielr/split_stability.rb +78 -0
  177. data/lib/ibex/lalr/ielr/split_state.rb +20 -0
  178. data/lib/ibex/lalr/ielr/state_splitter.rb +258 -0
  179. data/lib/ibex/lalr/ielr_partition.rb +22 -8
  180. data/lib/ibex/lalr/inadequacy_report.rb +50 -0
  181. data/lib/ibex/lalr/lookahead_propagation.rb +111 -0
  182. data/lib/ibex/lalr/lr0_collection.rb +121 -0
  183. data/lib/ibex/lalr/unreachable_states.rb +80 -0
  184. data/lib/ibex/lalr.rb +52 -1
  185. data/lib/ibex/location.rb +3 -3
  186. data/lib/ibex/lsp/document_handlers.rb +9 -7
  187. data/lib/ibex/lsp/initialization_handlers.rb +9 -7
  188. data/lib/ibex/lsp/navigation_handlers.rb +25 -11
  189. data/lib/ibex/lsp/parser_configuration_assistance.rb +149 -0
  190. data/lib/ibex/lsp/position_codec.rb +6 -2
  191. data/lib/ibex/lsp/request_handlers.rb +3 -2
  192. data/lib/ibex/lsp/request_support.rb +14 -7
  193. data/lib/ibex/lsp/server.rb +13 -11
  194. data/lib/ibex/lsp/symbol_index.rb +13 -13
  195. data/lib/ibex/lsp/symbol_index_builder.rb +30 -20
  196. data/lib/ibex/lsp/symbol_occurrence.rb +8 -2
  197. data/lib/ibex/lsp/transport.rb +13 -3
  198. data/lib/ibex/lsp/workspace.rb +5 -4
  199. data/lib/ibex/lsp/workspace_analyzer.rb +1 -1
  200. data/lib/ibex/lsp.rb +1 -0
  201. data/lib/ibex/messages/en.yml +28 -0
  202. data/lib/ibex/messages/ja.yml +28 -0
  203. data/lib/ibex/messages.rb +68 -0
  204. data/lib/ibex/metrics.rb +175 -0
  205. data/lib/ibex/normalize/declarations.rb +2 -0
  206. data/lib/ibex/normalize/diagnostics.rb +63 -38
  207. data/lib/ibex/normalize/expander.rb +5 -4
  208. data/lib/ibex/normalize/expression.rb +8 -6
  209. data/lib/ibex/normalize/grammar_builder.rb +26 -0
  210. data/lib/ibex/normalize/inline_expansion.rb +100 -49
  211. data/lib/ibex/normalize/lexer.rb +3 -3
  212. data/lib/ibex/normalize/parameter_ebnf_lowering.rb +11 -10
  213. data/lib/ibex/normalize/parameter_lowering.rb +40 -23
  214. data/lib/ibex/normalize/parameters.rb +31 -4
  215. data/lib/ibex/normalize/parser_configuration.rb +70 -0
  216. data/lib/ibex/normalize.rb +10 -20
  217. data/lib/ibex/racc_migration/report.rb +6 -3
  218. data/lib/ibex/rake_task.rb +1 -1
  219. data/lib/ibex/samples.rb +43 -13
  220. data/lib/ibex/table_artifact/builder.rb +266 -0
  221. data/lib/ibex/table_artifact/cst_projection.rb +70 -0
  222. data/lib/ibex/table_artifact/document.rb +39 -0
  223. data/lib/ibex/table_artifact/executor.rb +187 -0
  224. data/lib/ibex/table_artifact/serializer.rb +57 -0
  225. data/lib/ibex/table_artifact/validator/metadata.rb +179 -0
  226. data/lib/ibex/table_artifact/validator/support.rb +86 -0
  227. data/lib/ibex/table_artifact/validator/tables.rb +238 -0
  228. data/lib/ibex/table_artifact/validator.rb +253 -0
  229. data/lib/ibex/table_artifact.rb +88 -0
  230. data/lib/ibex/table_simulation/result.rb +6 -2
  231. data/lib/ibex/table_simulation/step.rb +3 -1
  232. data/lib/ibex/tables.rb +14 -0
  233. data/lib/ibex/verifiable_generation_bundle.rb +86 -0
  234. data/lib/ibex/verification_report/builder.rb +159 -0
  235. data/lib/ibex/verification_report/canonical_ir.rb +123 -0
  236. data/lib/ibex/verification_report/logical_path.rb +68 -0
  237. data/lib/ibex/verification_report/validator.rb +329 -0
  238. data/lib/ibex/verification_report.rb +69 -0
  239. data/lib/ibex/verify/action_correspondence.rb +138 -0
  240. data/lib/ibex/verify/language_witness.rb +295 -0
  241. data/lib/ibex/verify/reference_collection.rb +190 -0
  242. data/lib/ibex/verify/result.rb +73 -0
  243. data/lib/ibex/verify/verifier.rb +598 -0
  244. data/lib/ibex/verify.rb +15 -0
  245. data/lib/ibex/version.rb +1 -1
  246. data/lib/ibex/watch/runner.rb +10 -1
  247. data/lib/ibex/watch/source_snapshot.rb +13 -8
  248. data/lib/ibex.rb +10 -0
  249. data/schema/{automaton-ir-v1.schema.json → automaton-ir-definitions.schema.json} +6 -6
  250. data/schema/{automaton-ir-v2.schema.json → automaton-ir.schema.json} +14 -7
  251. data/schema/bison-import-v1.schema.json +106 -0
  252. data/schema/conflict-explanation-review-v1.schema.json +196 -0
  253. data/schema/conflict-explanation-study-v1.schema.json +528 -0
  254. data/schema/construction-profile-v1.schema.json +779 -0
  255. data/schema/diff-v1.schema.json +41 -0
  256. data/schema/direct-ielr-decision-v1.schema.json +200 -0
  257. data/schema/equiv-v1.schema.json +64 -0
  258. data/schema/error-ux-review-v1.schema.json +609 -0
  259. data/schema/error-ux-round2-review-v1.schema.json +191 -0
  260. data/schema/error-ux-round2-v1.schema.json +519 -0
  261. data/schema/explain-v1.schema.json +63 -1
  262. data/schema/fix-v1.schema.json +64 -0
  263. data/schema/fix-v2.schema.json +66 -0
  264. data/schema/fix-v3.schema.json +101 -0
  265. data/schema/fuzz-regression-v1.schema.json +79 -0
  266. data/schema/fuzz-v1.schema.json +114 -0
  267. data/schema/{grammar-ir-v2.schema.json → grammar-ir-extensions.schema.json} +20 -65
  268. data/schema/{grammar-ir-v1.schema.json → grammar-ir-foundation.schema.json} +3 -3
  269. data/schema/grammar-ir.schema.json +271 -0
  270. data/schema/ielr-benchmark-v1.schema.json +85 -0
  271. data/schema/lexer-profile-v1.schema.json +491 -0
  272. data/schema/metrics-v1.schema.json +60 -0
  273. data/schema/reduce-v1.schema.json +22 -0
  274. data/schema/reduce-v2.schema.json +63 -0
  275. data/schema/table-artifact-v1.schema.json +377 -0
  276. data/schema/verification-report-v1.schema.json +222 -0
  277. data/schema/verify-v1.schema.json +42 -0
  278. data/sig/ibex/analysis/digraph.rbs +19 -0
  279. data/sig/ibex/bison_import/importer.rbs +140 -0
  280. data/sig/ibex/bison_import/tokenizer.rbs +91 -0
  281. data/sig/ibex/bison_import.rbs +95 -0
  282. data/sig/ibex/bounded_subprocess.rbs +76 -0
  283. data/sig/ibex/cli/ambiguity.rbs +6 -0
  284. data/sig/ibex/cli/analysis.rbs +43 -0
  285. data/sig/ibex/cli/bison_import.rbs +32 -0
  286. data/sig/ibex/cli/config.rbs +35 -0
  287. data/sig/ibex/cli/diagnostics.rbs +16 -3
  288. data/sig/ibex/cli/documentation.rbs +5 -1
  289. data/sig/ibex/cli/equiv.rbs +49 -0
  290. data/sig/ibex/cli/error_messages.rbs +6 -0
  291. data/sig/ibex/cli/explain.rbs +6 -0
  292. data/sig/ibex/cli/fix.rbs +53 -0
  293. data/sig/ibex/cli/formatting.rbs +5 -1
  294. data/sig/ibex/cli/fuzz.rbs +47 -0
  295. data/sig/ibex/cli/fuzz_regressions.rbs +40 -0
  296. data/sig/ibex/cli/generation_artifacts.rbs +21 -2
  297. data/sig/ibex/cli/generation_error_messages.rbs +2 -2
  298. data/sig/ibex/cli/grammar_tests.rbs +15 -3
  299. data/sig/ibex/cli/ir_tools.rbs +7 -19
  300. data/sig/ibex/cli/outputs.rbs +9 -3
  301. data/sig/ibex/cli/reduce.rbs +60 -0
  302. data/sig/ibex/cli/reduce_reporting.rbs +27 -0
  303. data/sig/ibex/cli/samples.rbs +8 -0
  304. data/sig/ibex/cli/verify.rbs +28 -0
  305. data/sig/ibex/cli/watch.rbs +2 -2
  306. data/sig/ibex/cli.rbs +79 -5
  307. data/sig/ibex/codegen/action_method_source.rbs +4 -4
  308. data/sig/ibex/codegen/explain.rbs +45 -25
  309. data/sig/ibex/codegen/generated_action_abi.rbs +14 -10
  310. data/sig/ibex/codegen/rbs.rbs +12 -10
  311. data/sig/ibex/codegen/report.rbs +12 -12
  312. data/sig/ibex/codegen/ruby.rbs +18 -15
  313. data/sig/ibex/codegen/ruby_actions.rbs +6 -6
  314. data/sig/ibex/codegen/ruby_syntax.rbs +10 -8
  315. data/sig/ibex/configuration/analysis_grammar.rbs +13 -0
  316. data/sig/ibex/configuration/explanation.rbs +195 -0
  317. data/sig/ibex/configuration/inspector.rbs +53 -0
  318. data/sig/ibex/configuration.rbs +242 -0
  319. data/sig/ibex/coverage/collector.rbs +16 -14
  320. data/sig/ibex/coverage/event_stream.rbs +12 -10
  321. data/sig/ibex/coverage/report.rbs +20 -18
  322. data/sig/ibex/coverage/runtime_event_validator.rbs +38 -36
  323. data/sig/ibex/delta_reducer.rbs +38 -0
  324. data/sig/ibex/diff.rbs +47 -0
  325. data/sig/ibex/equiv/machine.rbs +54 -0
  326. data/sig/ibex/equiv.rbs +129 -0
  327. data/sig/ibex/fix.rbs +138 -0
  328. data/sig/ibex/frontend/ast.rbs +33 -7
  329. data/sig/ibex/frontend/bootstrap_parser.rbs +2 -0
  330. data/sig/ibex/frontend/diagnostic.rbs +2 -2
  331. data/sig/ibex/frontend/formatter.rbs +38 -30
  332. data/sig/ibex/frontend/generated_parser.rbs +87 -77
  333. data/sig/ibex/frontend/generated_parser_base.rbs +4 -2
  334. data/sig/ibex/frontend/parser/declarations.rbs +3 -0
  335. data/sig/ibex/frontend/parser_configuration_support.rbs +27 -0
  336. data/sig/ibex/frontend/resolution.rbs +3 -2
  337. data/sig/ibex/frontend/source_cursor.rbs +2 -2
  338. data/sig/ibex/frontend/source_span.rbs +5 -2
  339. data/sig/ibex/frontend/token_adapter/declaration_state.rbs +13 -1
  340. data/sig/ibex/frontend/token_adapter.rbs +6 -0
  341. data/sig/ibex/fuzz.rbs +71 -0
  342. data/sig/ibex/generation_input.rbs +2 -2
  343. data/sig/ibex/generation_manifest.rbs +35 -32
  344. data/sig/ibex/generation_transaction_recovery.rbs +2 -2
  345. data/sig/ibex/generation_transaction_validation.rbs +2 -2
  346. data/sig/ibex/grammar_tests.rbs +2 -2
  347. data/sig/ibex/ir/automaton_ir.rbs +30 -11
  348. data/sig/ibex/ir/grammar_ir.rbs +41 -27
  349. data/sig/ibex/ir/lexer_ir.rbs +8 -8
  350. data/sig/ibex/ir/parser_contract.rbs +69 -0
  351. data/sig/ibex/ir/serialize.rbs +63 -28
  352. data/sig/ibex/ir/validator/automaton.rbs +47 -44
  353. data/sig/ibex/ir/validator/base.rbs +35 -31
  354. data/sig/ibex/ir/validator/grammar.rbs +78 -67
  355. data/sig/ibex/ir/validator/lexer.rbs +4 -4
  356. data/sig/ibex/ir.rbs +9 -3
  357. data/sig/ibex/lalr/build_metrics.rbs +42 -2
  358. data/sig/ibex/lalr/builder.rbs +75 -24
  359. data/sig/ibex/lalr/conflict_search.rbs +5 -2
  360. data/sig/ibex/lalr/counterexample.rbs +17 -14
  361. data/sig/ibex/lalr/direct_lookaheads.rbs +35 -28
  362. data/sig/ibex/lalr/goto_follows.rbs +89 -0
  363. data/sig/ibex/lalr/ielr/annotator.rbs +67 -0
  364. data/sig/ibex/lalr/ielr/bits.rbs +14 -0
  365. data/sig/ibex/lalr/ielr/inadequacy.rbs +24 -0
  366. data/sig/ibex/lalr/ielr/item_lookaheads.rbs +35 -0
  367. data/sig/ibex/lalr/ielr/pipeline.rbs +17 -0
  368. data/sig/ibex/lalr/ielr/split_stability.rbs +27 -0
  369. data/sig/ibex/lalr/ielr/split_state.rbs +14 -0
  370. data/sig/ibex/lalr/ielr/state_splitter.rbs +76 -0
  371. data/sig/ibex/lalr/ielr_partition.rbs +17 -5
  372. data/sig/ibex/lalr/inadequacy_report.rbs +21 -0
  373. data/sig/ibex/lalr/lookahead_propagation.rbs +38 -0
  374. data/sig/ibex/lalr/lr0_collection.rbs +50 -0
  375. data/sig/ibex/lalr/unreachable_states.rbs +25 -0
  376. data/sig/ibex/lalr.rbs +11 -1
  377. data/sig/ibex/location.rbs +6 -6
  378. data/sig/ibex/lsp/document_handlers.rbs +8 -8
  379. data/sig/ibex/lsp/initialization_handlers.rbs +12 -12
  380. data/sig/ibex/lsp/navigation_handlers.rbs +15 -12
  381. data/sig/ibex/lsp/parser_configuration_assistance.rbs +49 -0
  382. data/sig/ibex/lsp/position_codec.rbs +8 -4
  383. data/sig/ibex/lsp/request_handlers.rbs +4 -4
  384. data/sig/ibex/lsp/request_support.rbs +8 -8
  385. data/sig/ibex/lsp/server.rbs +16 -16
  386. data/sig/ibex/lsp/symbol_index.rbs +20 -21
  387. data/sig/ibex/lsp/symbol_index_builder.rbs +9 -8
  388. data/sig/ibex/lsp/symbol_occurrence.rbs +11 -5
  389. data/sig/ibex/lsp/transport.rbs +18 -6
  390. data/sig/ibex/lsp/workspace.rbs +3 -2
  391. data/sig/ibex/lsp/workspace_analyzer.rbs +1 -1
  392. data/sig/ibex/messages.rbs +26 -0
  393. data/sig/ibex/metrics.rbs +50 -0
  394. data/sig/ibex/normalize/diagnostics.rbs +4 -4
  395. data/sig/ibex/normalize/expander.rbs +2 -2
  396. data/sig/ibex/normalize/expression.rbs +10 -8
  397. data/sig/ibex/normalize/grammar_builder.rbs +11 -0
  398. data/sig/ibex/normalize/inline_expansion.rbs +59 -50
  399. data/sig/ibex/normalize/lexer.rbs +4 -4
  400. data/sig/ibex/normalize/parameter_ebnf_lowering.rbs +15 -14
  401. data/sig/ibex/normalize/parameter_lowering.rbs +18 -18
  402. data/sig/ibex/normalize/parameters.rbs +13 -8
  403. data/sig/ibex/normalize/parser_configuration.rbs +23 -0
  404. data/sig/ibex/normalize.rbs +11 -5
  405. data/sig/ibex/racc_migration/report.rbs +8 -6
  406. data/sig/ibex/rake_task.rbs +1 -1
  407. data/sig/ibex/samples.rbs +13 -4
  408. data/sig/ibex/table_artifact/builder.rbs +93 -0
  409. data/sig/ibex/table_artifact/cst_projection.rbs +20 -0
  410. data/sig/ibex/table_artifact/document.rbs +27 -0
  411. data/sig/ibex/table_artifact/executor.rbs +66 -0
  412. data/sig/ibex/table_artifact/serializer.rbs +25 -0
  413. data/sig/ibex/table_artifact/validator/metadata.rbs +52 -0
  414. data/sig/ibex/table_artifact/validator/support.rbs +46 -0
  415. data/sig/ibex/table_artifact/validator/tables.rbs +63 -0
  416. data/sig/ibex/table_artifact/validator.rbs +66 -0
  417. data/sig/ibex/table_artifact.rbs +32 -0
  418. data/sig/ibex/table_simulation/result.rbs +8 -4
  419. data/sig/ibex/table_simulation/step.rbs +4 -2
  420. data/sig/ibex/tables.rbs +10 -9
  421. data/sig/ibex/verifiable_generation_bundle.rbs +24 -0
  422. data/sig/ibex/verification_report/builder.rbs +53 -0
  423. data/sig/ibex/verification_report/canonical_ir.rbs +41 -0
  424. data/sig/ibex/verification_report/logical_path.rbs +34 -0
  425. data/sig/ibex/verification_report/validator.rbs +114 -0
  426. data/sig/ibex/verification_report.rbs +44 -0
  427. data/sig/ibex/verify/action_correspondence.rbs +50 -0
  428. data/sig/ibex/verify/language_witness.rbs +112 -0
  429. data/sig/ibex/verify/reference_collection.rbs +63 -0
  430. data/sig/ibex/verify/result.rbs +52 -0
  431. data/sig/ibex/verify/verifier.rbs +170 -0
  432. data/sig/ibex/verify.rbs +6 -0
  433. data/sig/ibex/watch/runner.rbs +12 -2
  434. data/sig/ibex/watch/source_snapshot.rbs +13 -9
  435. metadata +232 -12
  436. data/lib/ibex/ir/migration.rb +0 -120
  437. data/sig/ibex/ir/migration.rbs +0 -34
@@ -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
@@ -3,53 +3,61 @@
3
3
  module Ibex
4
4
  module IR
5
5
  module Validator
6
- # Structural and referential validation for a versioned Grammar IR JSON object.
6
+ # Structural and referential validation for a current Grammar IR JSON object.
7
7
  # rubocop:disable Metrics/ClassLength -- inline type contracts accompany one cohesive document validator.
8
8
  class GrammarDocument < Base
9
9
  ROOT_REQUIRED: Array[String]
10
10
 
11
11
  ROOT_OPTIONAL: Array[String]
12
12
 
13
- V2_ROOT_REQUIRED: Array[String]
14
-
15
- V2_ROOT_OPTIONAL: Array[String]
16
-
17
13
  SYMBOL_REQUIRED: Array[String]
18
14
 
19
15
  SYMBOL_OPTIONAL: Array[String]
20
16
 
21
- V2_SYMBOL_REQUIRED: Array[String]
17
+ SYMBOL_METADATA_REQUIRED: Array[String]
22
18
 
23
19
  PRODUCTION_REQUIRED: Array[String]
24
20
 
25
- V2_PRODUCTION_REQUIRED: Array[String]
21
+ PRODUCTION_METADATA_REQUIRED: Array[String]
26
22
 
27
- V2_ACTION_REQUIRED: Array[String]
23
+ ACTION_COMPOSITION_REQUIRED: Array[String]
28
24
 
29
25
  ORIGIN_KINDS: Array[String]
30
26
 
31
27
  RUBY_KEYWORDS: Array[String]
32
28
 
33
- attr_reader symbols_by_id: Hash[Integer, Hash[String, untyped]]
29
+ attr_reader symbols_by_id: Hash[Integer, json_object]
34
30
 
35
- attr_reader symbols_by_name: Hash[String, Hash[String, untyped]]
31
+ attr_reader symbols_by_name: Hash[String, json_object]
36
32
 
37
- attr_reader productions_by_id: Hash[Integer, Hash[String, untyped]]
33
+ attr_reader productions_by_id: Hash[Integer, json_object]
38
34
 
39
35
  @version: Integer
40
36
 
41
37
  @path: String
42
38
 
43
- @data: Hash[String, untyped]
39
+ @data: json_object
44
40
 
45
- # @rbs (Hash[String, untyped] data, ?path: String, ?version: Integer) -> void
46
- def initialize: (Hash[String, untyped] data, ?path: String, ?version: Integer) -> void
41
+ # @rbs (json_object data, ?path: String, ?version: Integer) -> void
42
+ def initialize: (json_object data, ?path: String, ?version: Integer) -> void
47
43
 
48
44
  # @rbs () -> self
49
45
  def validate: () -> self
50
46
 
51
47
  private
52
48
 
49
+ # @rbs () -> void
50
+ def validate_root_record: () -> void
51
+
52
+ # @rbs () -> void
53
+ def validate_optional_parser_metadata: () -> void
54
+
55
+ # @rbs () -> void
56
+ def validate_parser_parameters_if_present: () -> void
57
+
58
+ # @rbs () -> void
59
+ def validate_optional_source_metadata: () -> void
60
+
53
61
  # @rbs () -> void
54
62
  def validate_envelope: () -> void
55
63
 
@@ -71,11 +79,11 @@ module Ibex
71
79
  # @rbs () -> void
72
80
  def validate_symbols: () -> void
73
81
 
74
- # @rbs (untyped value, Integer index) -> void
75
- def validate_symbol: (untyped value, Integer index) -> void
82
+ # @rbs (json_value value, Integer index) -> void
83
+ def validate_symbol: (json_value value, Integer index) -> void
76
84
 
77
- # @rbs (untyped value, String path) -> void
78
- def validate_precedence: (untyped value, String path) -> void
85
+ # @rbs (json_value value, String path) -> void
86
+ def validate_precedence: (json_value value, String path) -> void
79
87
 
80
88
  # @rbs () -> void
81
89
  def validate_reserved_symbols: () -> void
@@ -92,53 +100,53 @@ module Ibex
92
100
  # @rbs () -> void
93
101
  def validate_recovery: () -> void
94
102
 
95
- # @rbs (untyped values, String path, kind: String) -> void
96
- def validate_recovery_symbols: (untyped values, String path, kind: String) -> void
103
+ # @rbs (json_value values, String path, kind: String) -> void
104
+ def validate_recovery_symbols: (json_value values, String path, kind: String) -> void
97
105
 
98
- # @rbs (untyped value, String path, kind: String, seen: Hash[String, bool]) -> void
99
- def validate_recovery_symbol: (untyped value, String path, kind: String, seen: Hash[String, bool]) -> void
106
+ # @rbs (json_value value, String path, kind: String, seen: Hash[String, bool]) -> void
107
+ def validate_recovery_symbol: (json_value value, String path, kind: String, seen: Hash[String, bool]) -> void
100
108
 
101
109
  # @rbs () -> void
102
110
  def validate_productions: () -> void
103
111
 
104
- # @rbs (untyped value, Integer index) -> void
105
- def validate_production: (untyped value, Integer index) -> void
112
+ # @rbs (json_value value, Integer index) -> void
113
+ def validate_production: (json_value value, Integer index) -> void
106
114
 
107
- # @rbs (untyped value, String path, rhs_length: Integer) -> void
108
- def validate_node_annotation: (untyped value, String path, rhs_length: Integer) -> void
115
+ # @rbs (json_value value, String path, rhs_length: Integer) -> void
116
+ def validate_node_annotation: (json_value value, String path, rhs_length: Integer) -> void
109
117
 
110
- # @rbs (untyped value, String path) -> void
111
- def validate_lhs: (untyped value, String path) -> void
118
+ # @rbs (json_value value, String path) -> void
119
+ def validate_lhs: (json_value value, String path) -> void
112
120
 
113
- # @rbs (untyped value, String path) -> void
114
- def validate_rhs: (untyped value, String path) -> void
121
+ # @rbs (json_value value, String path) -> void
122
+ def validate_rhs: (json_value value, String path) -> void
115
123
 
116
- # @rbs (untyped value, String path, rhs_length: Integer) -> void
117
- def validate_action: (untyped value, String path, rhs_length: Integer) -> void
124
+ # @rbs (json_value value, String path, rhs_length: Integer) -> void
125
+ def validate_action: (json_value value, String path, rhs_length: Integer) -> void
118
126
 
119
- # @rbs (untyped value, String path, limit: Integer) -> void
120
- def validate_named_refs: (untyped value, String path, limit: Integer) -> void
127
+ # @rbs (json_value value, String path, limit: Integer) -> void
128
+ def validate_named_refs: (json_value value, String path, limit: Integer) -> void
121
129
 
122
- # @rbs (untyped value, String path) -> void
123
- def validate_precedence_override: (untyped value, String path) -> void
130
+ # @rbs (json_value value, String path) -> void
131
+ def validate_precedence_override: (json_value value, String path) -> void
124
132
 
125
- # @rbs (untyped value, String path) -> void
126
- def validate_origin: (untyped value, String path) -> void
133
+ # @rbs (json_value value, String path) -> void
134
+ def validate_origin: (json_value value, String path) -> void
127
135
 
128
- # @rbs (untyped value, String path) -> void
129
- def validate_string_map: (untyped value, String path) -> void
136
+ # @rbs (json_value value, String path) -> void
137
+ def validate_string_map: (json_value value, String path) -> void
130
138
 
131
139
  # @rbs () -> void
132
140
  def validate_warnings: () -> void
133
141
 
134
- # @rbs (untyped value, String path) -> void
135
- def validate_warning: (untyped value, String path) -> void
142
+ # @rbs (json_value value, String path) -> void
143
+ def validate_warning: (json_value value, String path) -> void
136
144
 
137
- # @rbs (Hash[String, untyped] warning, String path) -> void
138
- def validate_warning_symbol: (Hash[String, untyped] warning, String path) -> void
145
+ # @rbs (json_object warning, String path) -> void
146
+ def validate_warning_symbol: (json_object warning, String path) -> void
139
147
 
140
- # @rbs (Hash[String, untyped] warning, String field_name, String path) -> void
141
- def validate_warning_production: (Hash[String, untyped] warning, String field_name, String path) -> void
148
+ # @rbs (json_object warning, String field_name, String path) -> void
149
+ def validate_warning_production: (json_object warning, String field_name, String path) -> void
142
150
 
143
151
  # @rbs () -> void
144
152
  def validate_lexer: () -> void
@@ -146,38 +154,41 @@ module Ibex
146
154
  # @rbs () -> void
147
155
  def validate_user_code_chunks: () -> void
148
156
 
149
- # @rbs (untyped value, String path, ?nullable: bool) -> void
150
- def validate_source_provenance: (untyped value, String path, ?nullable: bool) -> void
157
+ # @rbs (json_value value, String path, ?nullable: bool) -> void
158
+ def validate_source_provenance: (json_value value, String path, ?nullable: bool) -> void
151
159
 
152
- # @rbs (untyped value, String path) -> void
153
- def validate_byte_span: (untyped value, String path) -> void
160
+ # @rbs (json_value value, String path) -> void
161
+ def validate_byte_span: (json_value value, String path) -> void
154
162
 
155
163
  # @rbs () -> void
156
- def validate_migration: () -> void
164
+ def validate_parser_contract: () -> void
165
+
166
+ # @rbs (untyped value, String, Array[String]) -> Hash[String, untyped]
167
+ def validate_contract_entry: (untyped value, String, Array[String]) -> Hash[String, untyped]
157
168
 
158
- # @rbs (untyped value, String path) -> void
159
- def validate_expansion: (untyped value, String path) -> void
169
+ # @rbs (json_value value, String path) -> void
170
+ def validate_expansion: (json_value value, String path) -> void
160
171
 
161
- # @rbs (untyped value, String path) -> void
162
- def validate_parameter_expansion: (untyped value, String path) -> void
172
+ # @rbs (json_value value, String path) -> void
173
+ def validate_parameter_expansion: (json_value value, String path) -> void
163
174
 
164
- # @rbs (untyped value, String path) -> void
165
- def validate_inline_expansion: (untyped value, String path) -> void
175
+ # @rbs (json_value value, String path) -> void
176
+ def validate_inline_expansion: (json_value value, String path) -> void
166
177
 
167
- # @rbs (untyped value, String path, rhs_length: Integer) -> void
168
- def validate_action_composition: (untyped value, String path, rhs_length: Integer) -> void
178
+ # @rbs (json_value value, String path, rhs_length: Integer) -> void
179
+ def validate_action_composition: (json_value value, String path, rhs_length: Integer) -> void
169
180
 
170
- # @rbs (untyped value, String path, Integer rhs_length, Array[untyped] fragments) -> void
171
- def validate_action_composition_plan: (untyped value, String path, Integer rhs_length, Array[untyped] fragments) -> void
181
+ # @rbs (json_value value, String path, Integer rhs_length, Array[json_value] fragments) -> void
182
+ def validate_action_composition_plan: (json_value value, String path, Integer rhs_length, Array[json_value] fragments) -> void
172
183
 
173
- # @rbs (untyped value, String path, Integer physical, Integer step_index) -> void
174
- def validate_action_composition_step: (untyped value, String path, Integer physical, Integer step_index) -> void
184
+ # @rbs (json_value value, String path, Integer physical, Integer step_index) -> void
185
+ def validate_action_composition_step: (json_value value, String path, Integer physical, Integer step_index) -> void
175
186
 
176
- # @rbs (Array[untyped] inputs, String path, Integer limit) -> void
177
- def validate_action_slots: (Array[untyped] inputs, String path, Integer limit) -> void
187
+ # @rbs (Array[json_value] inputs, String path, Integer limit) -> void
188
+ def validate_action_slots: (Array[json_value] inputs, String path, Integer limit) -> void
178
189
 
179
- # @rbs (untyped value, String path, Integer physical) -> void
180
- def validate_action_lookahead: (untyped value, String path, Integer physical) -> void
190
+ # @rbs (json_value value, String path, Integer physical) -> void
191
+ def validate_action_lookahead: (json_value value, String path, Integer physical) -> void
181
192
  end
182
193
  end
183
194
  end
@@ -9,8 +9,8 @@ module Ibex
9
9
 
10
10
  RULE_REQUIRED: Array[String]
11
11
 
12
- # @rbs (Hash[String, untyped] data, ?path: String) -> void
13
- def initialize: (Hash[String, untyped] data, ?path: String) -> void
12
+ # @rbs (json_object data, ?path: String) -> void
13
+ def initialize: (json_object data, ?path: String) -> void
14
14
 
15
15
  # @rbs () -> self
16
16
  def validate: () -> self
@@ -23,8 +23,8 @@ module Ibex
23
23
  # @rbs () -> void
24
24
  def validate_rules: () -> void
25
25
 
26
- # @rbs (Hash[String, untyped] rule, String path, String options) -> void
27
- def validate_pattern: (Hash[String, untyped] rule, String path, String options) -> void
26
+ # @rbs (json_object rule, String path, String options) -> void
27
+ def validate_pattern: (json_object rule, String path, String options) -> void
28
28
 
29
29
  # @rbs () -> void
30
30
  def validate_warnings: () -> void
data/sig/ibex/ir.rbs CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Ibex
4
4
  module IR
5
+ type serialized_value = untyped
6
+
5
7
  type location = { file: String, line: Integer, column: Integer }
6
8
 
7
9
  type precedence = { associativity: Symbol, level: Integer }
@@ -24,6 +26,10 @@ module Ibex
24
26
 
25
27
  type lexer_warning = { type: :redos, rule: Integer, loc: location }
26
28
 
29
+ type lexer_rule_document_value = Integer | String | Symbol | nil | location
30
+
31
+ type lexer_document_value = String | Integer | Array[String] | Array[Hash[Symbol, lexer_rule_document_value]] | Array[lexer_warning] | source_provenance?
32
+
27
33
  type parameter_expansion = { rule: String, arguments: Array[String] }
28
34
 
29
35
  type inline_expansion = { rule: String }
@@ -38,8 +44,6 @@ module Ibex
38
44
 
39
45
  type action_composition = { strategy: String, fragments: Array[action_fragment], ?plan: action_composition_plan }
40
46
 
41
- type migration_metadata = { from_schema_version: Integer, unavailable: Array[String] }
42
-
43
47
  type user_code_chunks = Hash[String, Array[UserCodeChunk]]
44
48
 
45
49
  type grammar_options = { result_var: bool, omit_action_call: bool, ?cst: bool }
@@ -70,7 +74,9 @@ module Ibex
70
74
 
71
75
  type conflict_summary = { sr: Integer, resolved_sr: Integer, rr: Integer, expected_sr: Integer, expectation_met: bool, ?expected_rr: Integer, ?rr_expectation_met: bool }
72
76
 
73
- type interpretation = Hash[Symbol, untyped]
77
+ type derivation_node = { symbol: String, ?token: String, ?production: Integer, ?children: Array[derivation_node] }
78
+
79
+ type interpretation = { kind: Symbol, tree: derivation_node?, ?state: Integer, ?production: Integer }
74
80
 
75
81
  type counterexample = { state: Integer, type: Symbol, symbol_path: Array[String], sentence: Array[String], lookahead_index: Integer, unifying: bool, interpretations: Array[interpretation] }
76
82
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Ibex
4
4
  module LALR
5
+ # Optional measurements are kept explicit for schema stability.
6
+ # rubocop:disable Metrics/ParameterLists
5
7
  # Immutable structural measurements from one automaton build. These counts
6
8
  # are intended for diagnostics and benchmarks, not parser behavior.
7
9
  class BuildMetrics
@@ -13,8 +15,46 @@ module Ibex
13
15
 
14
16
  attr_reader strategy: Symbol
15
17
 
16
- # @rbs (construction_states: Integer, canonical_states: Integer?, final_states: Integer, strategy: Symbol) -> void
17
- def initialize: (construction_states: Integer, canonical_states: Integer?, final_states: Integer, strategy: Symbol) -> void
18
+ attr_reader lr0_states: Integer?
19
+
20
+ attr_reader lr0_items: Integer?
21
+
22
+ attr_reader canonical_items: Integer?
23
+
24
+ attr_reader final_items: Integer?
25
+
26
+ attr_reader final_lookahead_items: Integer?
27
+
28
+ attr_reader propagation_edges: Integer?
29
+
30
+ attr_reader ielr_initial_partitions: Integer?
31
+
32
+ attr_reader ielr_final_partitions: Integer?
33
+
34
+ attr_reader ielr_annotations: Integer?
35
+
36
+ attr_reader ielr_annotated_states: Integer?
37
+
38
+ attr_reader ielr_inadequacies: Integer?
39
+
40
+ attr_reader ielr_split_stable_discarded: Integer?
41
+
42
+ attr_reader ielr_lalr_states: Integer?
43
+
44
+ attr_reader ielr_split_states: Integer?
45
+
46
+ attr_reader ielr_unreachable_removed: Integer?
47
+
48
+ attr_reader ielr_remergeable_candidates: Integer?
49
+
50
+ # @rbs (construction_states: Integer, canonical_states: Integer?, final_states: Integer, strategy: Symbol,
51
+ # ?lr0_states: Integer?, ?lr0_items: Integer?, ?canonical_items: Integer?, ?final_items: Integer?,
52
+ # ?final_lookahead_items: Integer?, ?propagation_edges: Integer?, ?ielr_initial_partitions: Integer?,
53
+ # ?ielr_final_partitions: Integer?, ?ielr_annotations: Integer?, ?ielr_annotated_states: Integer?,
54
+ # ?ielr_inadequacies: Integer?, ?ielr_split_stable_discarded: Integer?, ?ielr_lalr_states: Integer?,
55
+ # ?ielr_split_states: Integer?, ?ielr_unreachable_removed: Integer?,
56
+ # ?ielr_remergeable_candidates: Integer?) -> void
57
+ def initialize: (construction_states: Integer, canonical_states: Integer?, final_states: Integer, strategy: Symbol, ?lr0_states: Integer?, ?lr0_items: Integer?, ?canonical_items: Integer?, ?final_items: Integer?, ?final_lookahead_items: Integer?, ?propagation_edges: Integer?, ?ielr_initial_partitions: Integer?, ?ielr_final_partitions: Integer?, ?ielr_annotations: Integer?, ?ielr_annotated_states: Integer?, ?ielr_inadequacies: Integer?, ?ielr_split_stable_discarded: Integer?, ?ielr_lalr_states: Integer?, ?ielr_split_states: Integer?, ?ielr_unreachable_removed: Integer?, ?ielr_remergeable_candidates: Integer?) -> void
18
58
  end
19
59
  end
20
60
  end
@@ -11,48 +11,87 @@ module Ibex
11
11
 
12
12
  LALR_STRATEGIES: Array[Symbol]
13
13
 
14
- @canonical_key_radices: [ Integer, Integer, Integer ]?
14
+ IELR_STRATEGIES: Array[Symbol]
15
15
 
16
- @canonical_item_cache: Hash[Integer, Array[Array[lr_item?]?]]?
16
+ @grammar: IR::Grammar
17
17
 
18
- @canonical_suffix_lookahead_cache: Hash[Integer, Hash[Integer, Hash[Integer, Array[Integer]]]]
18
+ @algorithm: Symbol
19
19
 
20
- @attribute_entries: bool
20
+ @lalr_strategy: Symbol
21
21
 
22
- @entry_isolation: bool
22
+ @ielr_strategy: Symbol
23
23
 
24
- @start_names: Array[String]
24
+ @sets: Analysis::Sets
25
25
 
26
- @metrics: BuildMetrics?
26
+ @productions_by_lhs: Hash[Integer, Array[IR::Production]]
27
27
 
28
28
  @resolver: ConflictResolver
29
29
 
30
- @productions_by_lhs: Hash[Integer, Array[IR::Production]]
30
+ @metrics: BuildMetrics?
31
31
 
32
- @sets: Analysis::Sets
32
+ @start_names: Array[String]
33
33
 
34
- @lalr_strategy: Symbol
34
+ @entry_isolation: bool
35
35
 
36
- @algorithm: Symbol
36
+ @attribute_entries: bool
37
37
 
38
- @grammar: IR::Grammar
38
+ @profile: bool
39
+
40
+ @remove_unreachable: bool
41
+
42
+ @canonical_suffix_lookahead_cache: Hash[Integer, Hash[Integer, Hash[Integer, Array[Integer]]]]
43
+
44
+ @canonical_item_cache: Hash[Integer, Array[Array[lr_item?]?]]?
45
+
46
+ @canonical_key_radices: [ Integer, Integer, Integer ]?
39
47
 
40
48
  attr_reader metrics: BuildMetrics?
41
49
 
42
50
  # @rbs (IR::Grammar grammar, ?algorithm: Symbol | String, ?lalr_strategy: Symbol | String,
43
- # ?entry_isolation: bool, ?starts: Array[String]?, ?attribute_entries: bool) -> void
44
- def initialize: (IR::Grammar grammar, ?algorithm: Symbol | String, ?lalr_strategy: Symbol | String, ?entry_isolation: bool, ?starts: Array[String]?, ?attribute_entries: bool) -> void
51
+ # ?ielr_strategy: Symbol | String,
52
+ # ?entry_isolation: bool, ?starts: Array[String]?, ?attribute_entries: bool, ?profile: bool,
53
+ # ?remove_unreachable: bool) -> void
54
+ def initialize: (IR::Grammar grammar, ?algorithm: Symbol | String, ?lalr_strategy: Symbol | String, ?ielr_strategy: Symbol | String, ?entry_isolation: bool, ?starts: Array[String]?, ?attribute_entries: bool, ?profile: bool, ?remove_unreachable: bool) -> void
45
55
 
46
56
  # @rbs () -> IR::Automaton
47
57
  def build: () -> IR::Automaton
48
58
 
49
59
  private
50
60
 
61
+ # @rbs (states: Array[IR::AutomatonState], conflict_summary: IR::conflict_summary,
62
+ # entry_states: Hash[String, Integer]) -> IR::Automaton
63
+ def build_output_automaton: (states: Array[IR::AutomatonState], conflict_summary: IR::conflict_summary, entry_states: Hash[String, Integer]) -> IR::Automaton
64
+
51
65
  # @rbs (Array[IR::AutomatonState] states) -> IR::conflict_summary
52
66
  def conflict_summary: (Array[IR::AutomatonState] states) -> IR::conflict_summary
53
67
 
54
- # @rbs () -> [Array[packed_items], transitions, Integer, Integer?, Symbol]
55
- def automaton_collection: () -> [ Array[packed_items], transitions, Integer, Integer?, Symbol ]
68
+ # @rbs () -> [Array[packed_items], transitions, build_collection]
69
+ def automaton_collection: () -> [ Array[packed_items], transitions, build_collection ]
70
+
71
+ # @rbs () -> [Array[packed_items], transitions, build_collection]
72
+ def ielr_collection: () -> [ Array[packed_items], transitions, build_collection ]
73
+
74
+ # @rbs () -> [Array[packed_items], transitions, build_collection]
75
+ def ielr_direct_collection: () -> [ Array[packed_items], transitions, build_collection ]
76
+
77
+ # @rbs () -> [Array[packed_items], transitions, build_collection]
78
+ def canonical_lr1_collection: () -> [ Array[packed_items], transitions, build_collection ]
79
+
80
+ # @rbs (Symbol strategy) -> [Array[packed_items], transitions, build_collection]
81
+ def merged_canonical_collection: (Symbol strategy) -> [ Array[packed_items], transitions, build_collection ]
82
+
83
+ # @rbs () -> untyped
84
+ def direct_collection: () -> untyped
85
+
86
+ # @rbs (Array[item_set] states, strategy: Symbol) -> build_collection
87
+ def canonical_profile: (Array[item_set] states, strategy: Symbol) -> build_collection
88
+
89
+ # @rbs (Array[packed_items] items) -> [Integer?, Integer?]
90
+ def profiled_final_item_counts: (Array[packed_items] items) -> [ Integer?, Integer? ]
91
+
92
+ # @rbs (build_collection collection, Integer final_states, Integer? final_items,
93
+ # Integer? final_lookahead_items) -> BuildMetrics
94
+ def build_metrics: (build_collection collection, Integer final_states, Integer? final_items, Integer? final_lookahead_items) -> BuildMetrics
56
95
 
57
96
  # @rbs () -> String
58
97
  def algorithm_name: () -> String
@@ -97,10 +136,9 @@ module Ibex
97
136
  def build_state: (Integer state_id, Array[IR::AutomatonItem] items, Hash[Integer, Integer] transitions) -> IR::AutomatonState
98
137
 
99
138
  # Conflict hashes are produced locally immediately before this boundary.
100
- # Keeping the parameter untyped avoids duplicating both discriminated
101
- # hash variants solely to add their common optional provenance field.
102
- # @rbs (untyped conflict) -> IR::conflict
103
- def attribute_midrule_conflict: (untyped conflict) -> IR::conflict
139
+ # Both conflict variants carry the same optional midrule provenance field.
140
+ # @rbs (IR::conflict conflict) -> IR::conflict
141
+ def attribute_midrule_conflict: (IR::conflict conflict) -> IR::conflict
104
142
 
105
143
  # @rbs (Array[IR::AutomatonItem] items, Hash[Integer, Array[IR::parser_action]] candidates) -> void
106
144
  def add_completed_actions: (Array[IR::AutomatonItem] items, Hash[Integer, Array[IR::parser_action]] candidates) -> void
@@ -133,6 +171,19 @@ module Ibex
133
171
  # @rbs () -> IR::Automaton
134
172
  def build_isolated_automaton: () -> IR::Automaton
135
173
 
174
+ # @rbs (Array[[String, IR::Automaton, BuildMetrics]] entries, Integer construction_states,
175
+ # Integer? canonical_states, Integer final_states) -> BuildMetrics
176
+ def isolated_metrics: (Array[[ String, IR::Automaton, BuildMetrics ]] entries, Integer construction_states, Integer? canonical_states, Integer final_states) -> BuildMetrics
177
+
178
+ # @rbs (Array[[String, IR::Automaton, BuildMetrics]] entries, Symbol method) -> Integer?
179
+ def sum_optional_metric: (Array[[ String, IR::Automaton, BuildMetrics ]] entries, Symbol method) -> Integer?
180
+
181
+ # @rbs () -> Integer
182
+ def output_schema_version: () -> Integer
183
+
184
+ # @rbs () -> String?
185
+ def output_entry_construction: () -> String?
186
+
136
187
  # @rbs (String name) -> [String, IR::Automaton, BuildMetrics]
137
188
  def isolated_entry: (String name) -> [ String, IR::Automaton, BuildMetrics ]
138
189
 
@@ -155,11 +206,11 @@ module Ibex
155
206
  # @rbs (Array[IR::AutomatonState] states, Hash[String, Integer] entry_states) -> Array[Array[String]]
156
207
  def entry_reachability: (Array[IR::AutomatonState] states, Hash[String, Integer] entry_states) -> Array[Array[String]]
157
208
 
158
- # @rbs () -> Set[Array[untyped]]
159
- def isolated_conflict_fingerprints: () -> Set[Array[untyped]]
209
+ # @rbs () -> Set[conflict_fingerprint]
210
+ def isolated_conflict_fingerprints: () -> Set[conflict_fingerprint]
160
211
 
161
- # @rbs (IR::conflict conflict) -> Array[untyped]
162
- def conflict_fingerprint: (IR::conflict conflict) -> Array[untyped]
212
+ # @rbs (IR::conflict conflict) -> conflict_fingerprint
213
+ def conflict_fingerprint: (IR::conflict conflict) -> conflict_fingerprint
163
214
  end
164
215
  end
165
216
  end
@@ -46,14 +46,17 @@ module Ibex
46
46
  # ?max_tokens: Integer, ?max_configurations: Integer) -> void
47
47
  def initialize: (IR::Automaton automaton, IR::AutomatonState state, IR::conflict conflict, ?max_tokens: Integer, ?max_configurations: Integer) -> void
48
48
 
49
- # @rbs () -> search_result?
50
- def call: () -> search_result?
49
+ # @rbs () -> search_outcome
50
+ def call: () -> search_outcome
51
51
 
52
52
  # @rbs () -> bool
53
53
  def exhausted?: () -> bool
54
54
 
55
55
  private
56
56
 
57
+ # @rbs (:found | :not_found | :exhausted status, ?search_result? result) -> search_outcome
58
+ def outcome: (:found | :not_found | :exhausted status, ?search_result? result) -> search_outcome
59
+
57
60
  # @rbs (Configuration current) -> Array[Configuration]
58
61
  def conflict_configurations: (Configuration current) -> Array[Configuration]
59
62