ibex 0.1.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 (603) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +89 -123
  3. data/docs/architecture.md +477 -31
  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 +106 -0
  12. data/docs/cst.md +237 -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 +306 -0
  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 +26 -0
  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 +114 -0
  51. data/docs/getting-started.md +80 -0
  52. data/docs/grammar-reference.md +629 -18
  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 +56 -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 +45 -6
  63. data/docs/release-readiness.md +221 -0
  64. data/docs/repair-semantics.md +123 -0
  65. data/docs/runtime-abi-evolution.md +307 -0
  66. data/docs/stability.md +234 -0
  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/examples/README.md +60 -0
  75. data/examples/calculator.y +44 -0
  76. data/examples/csv.y +32 -0
  77. data/examples/ini.y +70 -0
  78. data/examples/json.y +48 -0
  79. data/examples/tiny_language.y +75 -0
  80. data/lib/ibex/analysis/digraph.rb +128 -0
  81. data/lib/ibex/analysis/sets.rb +5 -4
  82. data/lib/ibex/analysis.rb +1 -0
  83. data/lib/ibex/artifact_set.rb +63 -0
  84. data/lib/ibex/bison_import/importer.rb +516 -0
  85. data/lib/ibex/bison_import/tokenizer.rb +260 -0
  86. data/lib/ibex/bison_import.rb +200 -0
  87. data/lib/ibex/bounded_subprocess.rb +171 -0
  88. data/lib/ibex/cli/ambiguity.rb +75 -0
  89. data/lib/ibex/cli/analysis.rb +134 -0
  90. data/lib/ibex/cli/bison_import.rb +121 -0
  91. data/lib/ibex/cli/config.rb +128 -0
  92. data/lib/ibex/cli/counterexample_options.rb +6 -2
  93. data/lib/ibex/cli/coverage.rb +173 -0
  94. data/lib/ibex/cli/debug.rb +106 -0
  95. data/lib/ibex/cli/diagnostics.rb +136 -0
  96. data/lib/ibex/cli/documentation.rb +70 -0
  97. data/lib/ibex/cli/equiv.rb +169 -0
  98. data/lib/ibex/cli/error_messages.rb +184 -0
  99. data/lib/ibex/cli/explain.rb +85 -0
  100. data/lib/ibex/cli/fix.rb +203 -0
  101. data/lib/ibex/cli/formatting.rb +387 -0
  102. data/lib/ibex/cli/fuzz.rb +200 -0
  103. data/lib/ibex/cli/fuzz_regressions.rb +145 -0
  104. data/lib/ibex/cli/generation_artifacts.rb +189 -0
  105. data/lib/ibex/cli/generation_error_messages.rb +39 -0
  106. data/lib/ibex/cli/grammar_tests.rb +140 -0
  107. data/lib/ibex/cli/ir_tools.rb +128 -0
  108. data/lib/ibex/cli/lsp.rb +33 -0
  109. data/lib/ibex/cli/outputs.rb +133 -23
  110. data/lib/ibex/cli/racc_migration.rb +87 -0
  111. data/lib/ibex/cli/reduce.rb +202 -0
  112. data/lib/ibex/cli/reduce_reporting.rb +71 -0
  113. data/lib/ibex/cli/samples.rb +118 -0
  114. data/lib/ibex/cli/verify.rb +116 -0
  115. data/lib/ibex/cli/watch.rb +104 -0
  116. data/lib/ibex/cli.rb +825 -55
  117. data/lib/ibex/codegen/action_locations.rb +103 -0
  118. data/lib/ibex/codegen/action_method_source.rb +209 -0
  119. data/lib/ibex/codegen/action_source.rb +119 -0
  120. data/lib/ibex/codegen/ambiguity.rb +174 -0
  121. data/lib/ibex/codegen/cst_metadata.rb +171 -0
  122. data/lib/ibex/codegen/documentation.rb +170 -0
  123. data/lib/ibex/codegen/explain.rb +380 -0
  124. data/lib/ibex/codegen/generated_action_abi.rb +293 -0
  125. data/lib/ibex/codegen/html.rb +94 -10
  126. data/lib/ibex/codegen/mermaid.rb +43 -0
  127. data/lib/ibex/codegen/railroad.rb +197 -0
  128. data/lib/ibex/codegen/railroad_documentation.rb +59 -0
  129. data/lib/ibex/codegen/rbs.rb +331 -2
  130. data/lib/ibex/codegen/report.rb +67 -15
  131. data/lib/ibex/codegen/ruby.rb +305 -66
  132. data/lib/ibex/codegen/ruby_actions.rb +146 -0
  133. data/lib/ibex/codegen/ruby_ast.rb +121 -0
  134. data/lib/ibex/codegen/ruby_error_messages.rb +28 -0
  135. data/lib/ibex/codegen/ruby_lexer.rb +83 -0
  136. data/lib/ibex/codegen/ruby_syntax.rb +96 -0
  137. data/lib/ibex/codegen/ruby_table_metadata.rb +57 -0
  138. data/lib/ibex/codegen/ruby_value_printers.rb +56 -0
  139. data/lib/ibex/codegen/symbol_labels.rb +1 -1
  140. data/lib/ibex/configuration/analysis_grammar.rb +35 -0
  141. data/lib/ibex/configuration/explanation.rb +421 -0
  142. data/lib/ibex/configuration/inspector.rb +232 -0
  143. data/lib/ibex/configuration.rb +580 -0
  144. data/lib/ibex/coverage/collector.rb +198 -0
  145. data/lib/ibex/coverage/event_stream.rb +103 -0
  146. data/lib/ibex/coverage/report.rb +267 -0
  147. data/lib/ibex/coverage/runtime_event_validator.rb +169 -0
  148. data/lib/ibex/coverage.rb +13 -0
  149. data/lib/ibex/delta_reducer.rb +99 -0
  150. data/lib/ibex/diff.rb +140 -0
  151. data/lib/ibex/equiv/machine.rb +135 -0
  152. data/lib/ibex/equiv.rb +373 -0
  153. data/lib/ibex/error_messages/parser.rb +159 -0
  154. data/lib/ibex/error_messages/parser_v2.rb +198 -0
  155. data/lib/ibex/error_messages/renderer.rb +65 -0
  156. data/lib/ibex/error_messages/sentence_search.rb +196 -0
  157. data/lib/ibex/error_messages/update.rb +169 -0
  158. data/lib/ibex/error_messages.rb +165 -0
  159. data/lib/ibex/fix.rb +557 -0
  160. data/lib/ibex/frontend/ast.rb +166 -7
  161. data/lib/ibex/frontend/bootstrap_parser.rb +40 -4
  162. data/lib/ibex/frontend/diagnostic.rb +81 -0
  163. data/lib/ibex/frontend/diagnostic_recovery.rb +268 -0
  164. data/lib/ibex/frontend/dsl.rb +66 -7
  165. data/lib/ibex/frontend/formatter.rb +453 -0
  166. data/lib/ibex/frontend/generated_parser.rb +644 -190
  167. data/lib/ibex/frontend/generated_parser_base.rb +170 -32
  168. data/lib/ibex/frontend/generated_parser_includes.rb +51 -0
  169. data/lib/ibex/frontend/generated_parser_metadata.rb +61 -0
  170. data/lib/ibex/frontend/generated_parser_parameters.rb +60 -0
  171. data/lib/ibex/frontend/generation.rb +33 -0
  172. data/lib/ibex/frontend/lexer.rb +162 -10
  173. data/lib/ibex/frontend/lexer_recovery.rb +84 -0
  174. data/lib/ibex/frontend/parser/declarations.rb +262 -11
  175. data/lib/ibex/frontend/parser/parameters.rb +82 -0
  176. data/lib/ibex/frontend/parser/rules.rb +43 -6
  177. data/lib/ibex/frontend/parser.rb +182 -4
  178. data/lib/ibex/frontend/parser_configuration_support.rb +56 -0
  179. data/lib/ibex/frontend/regenerator.rb +27 -1
  180. data/lib/ibex/frontend/resolution.rb +70 -0
  181. data/lib/ibex/frontend/resolver.rb +217 -0
  182. data/lib/ibex/frontend/rule_documentation.rb +104 -0
  183. data/lib/ibex/frontend/source_cursor.rb +133 -9
  184. data/lib/ibex/frontend/source_document.rb +229 -0
  185. data/lib/ibex/frontend/source_loader.rb +150 -0
  186. data/lib/ibex/frontend/source_span.rb +89 -0
  187. data/lib/ibex/frontend/token_adapter/declaration_document_state.rb +47 -0
  188. data/lib/ibex/frontend/token_adapter/declaration_lexer_state.rb +83 -0
  189. data/lib/ibex/frontend/token_adapter/declaration_state.rb +244 -22
  190. data/lib/ibex/frontend/token_adapter/delimiter_tracker.rb +8 -2
  191. data/lib/ibex/frontend/token_adapter/rule_state.rb +60 -2
  192. data/lib/ibex/frontend/token_adapter.rb +18 -3
  193. data/lib/ibex/frontend.rb +14 -2
  194. data/lib/ibex/fuzz.rb +219 -0
  195. data/lib/ibex/generation_input.rb +57 -0
  196. data/lib/ibex/generation_manifest.rb +211 -0
  197. data/lib/ibex/generation_transaction.rb +261 -0
  198. data/lib/ibex/generation_transaction_recovery.rb +109 -0
  199. data/lib/ibex/generation_transaction_validation.rb +196 -0
  200. data/lib/ibex/grammar_tests.rb +206 -0
  201. data/lib/ibex/ir/automaton_ir.rb +86 -11
  202. data/lib/ibex/ir/grammar_ir.rb +170 -26
  203. data/lib/ibex/ir/lexer_ir.rb +76 -0
  204. data/lib/ibex/ir/parser_contract.rb +135 -0
  205. data/lib/ibex/ir/serialize.rb +268 -50
  206. data/lib/ibex/ir/validator/automaton.rb +375 -0
  207. data/lib/ibex/ir/validator/base.rb +147 -0
  208. data/lib/ibex/ir/validator/grammar.rb +634 -0
  209. data/lib/ibex/ir/validator/lexer.rb +113 -0
  210. data/lib/ibex/ir/validator.rb +63 -0
  211. data/lib/ibex/ir.rb +71 -5
  212. data/lib/ibex/lalr/build_metrics.rb +71 -0
  213. data/lib/ibex/lalr/builder.rb +514 -52
  214. data/lib/ibex/lalr/conflict.rb +1 -0
  215. data/lib/ibex/lalr/conflict_search.rb +26 -9
  216. data/lib/ibex/lalr/counterexample.rb +38 -18
  217. data/lib/ibex/lalr/direct_lookaheads.rb +289 -0
  218. data/lib/ibex/lalr/goto_follows.rb +229 -0
  219. data/lib/ibex/lalr/ielr/annotator.rb +214 -0
  220. data/lib/ibex/lalr/ielr/bits.rb +28 -0
  221. data/lib/ibex/lalr/ielr/inadequacy.rb +47 -0
  222. data/lib/ibex/lalr/ielr/item_lookaheads.rb +78 -0
  223. data/lib/ibex/lalr/ielr/pipeline.rb +75 -0
  224. data/lib/ibex/lalr/ielr/split_stability.rb +78 -0
  225. data/lib/ibex/lalr/ielr/split_state.rb +20 -0
  226. data/lib/ibex/lalr/ielr/state_splitter.rb +258 -0
  227. data/lib/ibex/lalr/ielr_partition.rb +166 -0
  228. data/lib/ibex/lalr/inadequacy_report.rb +50 -0
  229. data/lib/ibex/lalr/lookahead_propagation.rb +111 -0
  230. data/lib/ibex/lalr/lr0_collection.rb +121 -0
  231. data/lib/ibex/lalr/on_error_reductions.rb +74 -0
  232. data/lib/ibex/lalr/unreachable_states.rb +80 -0
  233. data/lib/ibex/lalr.rb +59 -1
  234. data/lib/ibex/location.rb +129 -0
  235. data/lib/ibex/lsp/document_handlers.rb +68 -0
  236. data/lib/ibex/lsp/document_store.rb +264 -0
  237. data/lib/ibex/lsp/document_store_diagnostics.rb +44 -0
  238. data/lib/ibex/lsp/document_store_validation.rb +61 -0
  239. data/lib/ibex/lsp/initialization_handlers.rb +80 -0
  240. data/lib/ibex/lsp/navigation_handlers.rb +70 -0
  241. data/lib/ibex/lsp/parser_configuration_assistance.rb +149 -0
  242. data/lib/ibex/lsp/position_codec.rb +113 -0
  243. data/lib/ibex/lsp/protocol_error.rb +33 -0
  244. data/lib/ibex/lsp/request_handlers.rb +46 -0
  245. data/lib/ibex/lsp/request_support.rb +94 -0
  246. data/lib/ibex/lsp/server.rb +148 -0
  247. data/lib/ibex/lsp/symbol_index.rb +241 -0
  248. data/lib/ibex/lsp/symbol_index_builder.rb +277 -0
  249. data/lib/ibex/lsp/symbol_index_precedence_references.rb +44 -0
  250. data/lib/ibex/lsp/symbol_index_source_queries.rb +61 -0
  251. data/lib/ibex/lsp/symbol_occurrence.rb +23 -0
  252. data/lib/ibex/lsp/transport.rb +128 -0
  253. data/lib/ibex/lsp/workspace.rb +128 -0
  254. data/lib/ibex/lsp/workspace_analyzer.rb +199 -0
  255. data/lib/ibex/lsp.rb +33 -0
  256. data/lib/ibex/messages/en.yml +28 -0
  257. data/lib/ibex/messages/ja.yml +28 -0
  258. data/lib/ibex/messages.rb +68 -0
  259. data/lib/ibex/metrics.rb +175 -0
  260. data/lib/ibex/normalize/declarations.rb +142 -7
  261. data/lib/ibex/normalize/diagnostics.rb +94 -24
  262. data/lib/ibex/normalize/expander.rb +64 -59
  263. data/lib/ibex/normalize/expression.rb +63 -40
  264. data/lib/ibex/normalize/grammar_builder.rb +26 -0
  265. data/lib/ibex/normalize/inline_expansion.rb +465 -0
  266. data/lib/ibex/normalize/inline_validation.rb +174 -0
  267. data/lib/ibex/normalize/lexer.rb +131 -0
  268. data/lib/ibex/normalize/named_references.rb +60 -0
  269. data/lib/ibex/normalize/nodes.rb +46 -0
  270. data/lib/ibex/normalize/parameter_ebnf_lowering.rb +70 -0
  271. data/lib/ibex/normalize/parameter_lowering.rb +143 -0
  272. data/lib/ibex/normalize/parameter_substitution.rb +125 -0
  273. data/lib/ibex/normalize/parameter_validation.rb +140 -0
  274. data/lib/ibex/normalize/parameters.rb +226 -0
  275. data/lib/ibex/normalize/parser_configuration.rb +70 -0
  276. data/lib/ibex/normalize/recovery_declarations.rb +84 -0
  277. data/lib/ibex/normalize.rb +172 -17
  278. data/lib/ibex/racc_migration/checker.rb +122 -0
  279. data/lib/ibex/racc_migration/harness.rb +177 -0
  280. data/lib/ibex/racc_migration/report.rb +97 -0
  281. data/lib/ibex/racc_migration.rb +12 -0
  282. data/lib/ibex/rake_task.rb +116 -0
  283. data/lib/ibex/samples.rb +216 -0
  284. data/lib/ibex/table_artifact/builder.rb +266 -0
  285. data/lib/ibex/table_artifact/cst_projection.rb +70 -0
  286. data/lib/ibex/table_artifact/document.rb +39 -0
  287. data/lib/ibex/table_artifact/executor.rb +187 -0
  288. data/lib/ibex/table_artifact/serializer.rb +57 -0
  289. data/lib/ibex/table_artifact/validator/metadata.rb +179 -0
  290. data/lib/ibex/table_artifact/validator/support.rb +86 -0
  291. data/lib/ibex/table_artifact/validator/tables.rb +238 -0
  292. data/lib/ibex/table_artifact/validator.rb +253 -0
  293. data/lib/ibex/table_artifact.rb +88 -0
  294. data/lib/ibex/table_simulation/result.rb +55 -0
  295. data/lib/ibex/table_simulation/simulator.rb +253 -0
  296. data/lib/ibex/table_simulation/step.rb +62 -0
  297. data/lib/ibex/table_simulation/text.rb +31 -0
  298. data/lib/ibex/table_simulation.rb +13 -0
  299. data/lib/ibex/tables.rb +22 -69
  300. data/lib/ibex/verifiable_generation_bundle.rb +86 -0
  301. data/lib/ibex/verification_report/builder.rb +159 -0
  302. data/lib/ibex/verification_report/canonical_ir.rb +123 -0
  303. data/lib/ibex/verification_report/logical_path.rb +68 -0
  304. data/lib/ibex/verification_report/validator.rb +329 -0
  305. data/lib/ibex/verification_report.rb +69 -0
  306. data/lib/ibex/verify/action_correspondence.rb +138 -0
  307. data/lib/ibex/verify/language_witness.rb +295 -0
  308. data/lib/ibex/verify/reference_collection.rb +190 -0
  309. data/lib/ibex/verify/result.rb +73 -0
  310. data/lib/ibex/verify/verifier.rb +598 -0
  311. data/lib/ibex/verify.rb +15 -0
  312. data/lib/ibex/version.rb +1 -1
  313. data/lib/ibex/watch/runner.rb +181 -0
  314. data/lib/ibex/watch/source_snapshot.rb +98 -0
  315. data/lib/ibex/watch.rb +11 -0
  316. data/lib/ibex.rb +35 -1
  317. data/schema/automaton-ir-definitions.schema.json +401 -0
  318. data/schema/automaton-ir.schema.json +65 -0
  319. data/schema/benchmark-v1.schema.json +212 -0
  320. data/schema/benchmark-v2.schema.json +61 -0
  321. data/schema/bison-import-v1.schema.json +106 -0
  322. data/schema/conflict-explanation-review-v1.schema.json +196 -0
  323. data/schema/conflict-explanation-study-v1.schema.json +528 -0
  324. data/schema/construction-profile-v1.schema.json +779 -0
  325. data/schema/cst-v1.json +170 -0
  326. data/schema/diff-v1.schema.json +41 -0
  327. data/schema/direct-ielr-decision-v1.schema.json +200 -0
  328. data/schema/equiv-v1.schema.json +64 -0
  329. data/schema/error-ux-review-v1.schema.json +609 -0
  330. data/schema/error-ux-round2-review-v1.schema.json +191 -0
  331. data/schema/error-ux-round2-v1.schema.json +519 -0
  332. data/schema/error-ux-v1.schema.json +258 -0
  333. data/schema/explain-v1.schema.json +495 -0
  334. data/schema/fix-v1.schema.json +64 -0
  335. data/schema/fix-v2.schema.json +66 -0
  336. data/schema/fix-v3.schema.json +101 -0
  337. data/schema/frontend-diagnostics-v1.schema.json +154 -0
  338. data/schema/fuzz-regression-v1.schema.json +79 -0
  339. data/schema/fuzz-v1.schema.json +114 -0
  340. data/schema/generation-manifest-v1.schema.json +115 -0
  341. data/schema/grammar-ir-extensions.schema.json +734 -0
  342. data/schema/grammar-ir-foundation.schema.json +426 -0
  343. data/schema/grammar-ir.schema.json +271 -0
  344. data/schema/ielr-benchmark-v1.schema.json +85 -0
  345. data/schema/lexer-ir-v1.schema.json +215 -0
  346. data/schema/lexer-profile-v1.schema.json +491 -0
  347. data/schema/metrics-v1.schema.json +60 -0
  348. data/schema/migration-check-v1.schema.json +60 -0
  349. data/schema/performance-comparison-v1.schema.json +395 -0
  350. data/schema/public-performance-comparison-v1.schema.json +506 -0
  351. data/schema/public-performance-profile-v1.schema.json +360 -0
  352. data/schema/reduce-v1.schema.json +22 -0
  353. data/schema/reduce-v2.schema.json +63 -0
  354. data/schema/runtime-coverage-v1.schema.json +86 -0
  355. data/schema/runtime-event-v1.schema.json +308 -0
  356. data/schema/table-artifact-v1.schema.json +377 -0
  357. data/schema/table-simulation-v1.schema.json +70 -0
  358. data/schema/verification-report-v1.schema.json +222 -0
  359. data/schema/verify-v1.schema.json +42 -0
  360. data/sig/ibex/analysis/digraph.rbs +19 -0
  361. data/sig/ibex/artifact_set.rbs +37 -0
  362. data/sig/ibex/bison_import/importer.rbs +140 -0
  363. data/sig/ibex/bison_import/tokenizer.rbs +91 -0
  364. data/sig/ibex/bison_import.rbs +95 -0
  365. data/sig/ibex/bounded_subprocess.rbs +76 -0
  366. data/sig/ibex/cli/ambiguity.rbs +28 -0
  367. data/sig/ibex/cli/analysis.rbs +43 -0
  368. data/sig/ibex/cli/bison_import.rbs +32 -0
  369. data/sig/ibex/cli/config.rbs +35 -0
  370. data/sig/ibex/cli/counterexample_options.rbs +2 -0
  371. data/sig/ibex/cli/coverage.rbs +53 -0
  372. data/sig/ibex/cli/debug.rbs +28 -0
  373. data/sig/ibex/cli/diagnostics.rbs +51 -0
  374. data/sig/ibex/cli/documentation.rbs +29 -0
  375. data/sig/ibex/cli/equiv.rbs +49 -0
  376. data/sig/ibex/cli/error_messages.rbs +63 -0
  377. data/sig/ibex/cli/explain.rbs +31 -0
  378. data/sig/ibex/cli/fix.rbs +53 -0
  379. data/sig/ibex/cli/formatting.rbs +107 -0
  380. data/sig/ibex/cli/fuzz.rbs +47 -0
  381. data/sig/ibex/cli/fuzz_regressions.rbs +40 -0
  382. data/sig/ibex/cli/generation_artifacts.rbs +69 -0
  383. data/sig/ibex/cli/generation_error_messages.rbs +19 -0
  384. data/sig/ibex/cli/grammar_tests.rbs +48 -0
  385. data/sig/ibex/cli/ir_tools.rbs +39 -0
  386. data/sig/ibex/cli/lsp.rbs +14 -0
  387. data/sig/ibex/cli/outputs.rbs +26 -3
  388. data/sig/ibex/cli/racc_migration.rbs +30 -0
  389. data/sig/ibex/cli/reduce.rbs +60 -0
  390. data/sig/ibex/cli/reduce_reporting.rbs +27 -0
  391. data/sig/ibex/cli/samples.rbs +38 -0
  392. data/sig/ibex/cli/verify.rbs +28 -0
  393. data/sig/ibex/cli/watch.rbs +43 -0
  394. data/sig/ibex/cli.rbs +182 -9
  395. data/sig/ibex/codegen/action_locations.rbs +45 -0
  396. data/sig/ibex/codegen/action_method_source.rbs +65 -0
  397. data/sig/ibex/codegen/action_source.rbs +50 -0
  398. data/sig/ibex/codegen/ambiguity.rbs +60 -0
  399. data/sig/ibex/codegen/cst_metadata.rbs +59 -0
  400. data/sig/ibex/codegen/documentation.rbs +50 -0
  401. data/sig/ibex/codegen/explain.rbs +105 -0
  402. data/sig/ibex/codegen/generated_action_abi.rbs +105 -0
  403. data/sig/ibex/codegen/html.rbs +18 -2
  404. data/sig/ibex/codegen/mermaid.rbs +16 -0
  405. data/sig/ibex/codegen/railroad.rbs +82 -0
  406. data/sig/ibex/codegen/railroad_documentation.rbs +31 -0
  407. data/sig/ibex/codegen/rbs.rbs +86 -4
  408. data/sig/ibex/codegen/report.rbs +16 -8
  409. data/sig/ibex/codegen/ruby.rbs +105 -28
  410. data/sig/ibex/codegen/ruby_actions.rbs +54 -0
  411. data/sig/ibex/codegen/ruby_ast.rbs +34 -0
  412. data/sig/ibex/codegen/ruby_error_messages.rbs +16 -0
  413. data/sig/ibex/codegen/ruby_lexer.rbs +25 -0
  414. data/sig/ibex/codegen/ruby_syntax.rbs +27 -0
  415. data/sig/ibex/codegen/ruby_table_metadata.rbs +26 -0
  416. data/sig/ibex/codegen/ruby_value_printers.rbs +28 -0
  417. data/sig/ibex/configuration/analysis_grammar.rbs +13 -0
  418. data/sig/ibex/configuration/explanation.rbs +195 -0
  419. data/sig/ibex/configuration/inspector.rbs +53 -0
  420. data/sig/ibex/configuration.rbs +242 -0
  421. data/sig/ibex/coverage/collector.rbs +78 -0
  422. data/sig/ibex/coverage/event_stream.rbs +44 -0
  423. data/sig/ibex/coverage/report.rbs +102 -0
  424. data/sig/ibex/coverage/runtime_event_validator.rbs +70 -0
  425. data/sig/ibex/coverage.rbs +7 -0
  426. data/sig/ibex/delta_reducer.rbs +38 -0
  427. data/sig/ibex/diff.rbs +47 -0
  428. data/sig/ibex/equiv/machine.rbs +54 -0
  429. data/sig/ibex/equiv.rbs +129 -0
  430. data/sig/ibex/error_messages/parser.rbs +58 -0
  431. data/sig/ibex/error_messages/parser_v2.rbs +67 -0
  432. data/sig/ibex/error_messages/renderer.rbs +23 -0
  433. data/sig/ibex/error_messages/sentence_search.rbs +80 -0
  434. data/sig/ibex/error_messages/update.rbs +43 -0
  435. data/sig/ibex/error_messages.rbs +85 -0
  436. data/sig/ibex/fix.rbs +138 -0
  437. data/sig/ibex/frontend/ast.rbs +237 -22
  438. data/sig/ibex/frontend/bootstrap_parser.rbs +13 -0
  439. data/sig/ibex/frontend/diagnostic.rbs +53 -0
  440. data/sig/ibex/frontend/diagnostic_recovery.rbs +98 -0
  441. data/sig/ibex/frontend/dsl.rbs +33 -4
  442. data/sig/ibex/frontend/formatter.rbs +143 -0
  443. data/sig/ibex/frontend/generated_parser.rbs +228 -68
  444. data/sig/ibex/frontend/generated_parser_base.rbs +65 -12
  445. data/sig/ibex/frontend/generated_parser_includes.rbs +23 -0
  446. data/sig/ibex/frontend/generated_parser_metadata.rbs +23 -0
  447. data/sig/ibex/frontend/generated_parser_parameters.rbs +24 -0
  448. data/sig/ibex/frontend/generation.rbs +6 -0
  449. data/sig/ibex/frontend/lexer.rbs +49 -2
  450. data/sig/ibex/frontend/lexer_recovery.rbs +25 -0
  451. data/sig/ibex/frontend/parser/declarations.rbs +57 -0
  452. data/sig/ibex/frontend/parser/parameters.rbs +28 -0
  453. data/sig/ibex/frontend/parser/rules.rbs +3 -0
  454. data/sig/ibex/frontend/parser.rbs +66 -0
  455. data/sig/ibex/frontend/parser_configuration_support.rbs +27 -0
  456. data/sig/ibex/frontend/regenerator.rbs +11 -0
  457. data/sig/ibex/frontend/resolution.rbs +34 -0
  458. data/sig/ibex/frontend/resolver.rbs +91 -0
  459. data/sig/ibex/frontend/rule_documentation.rbs +42 -0
  460. data/sig/ibex/frontend/source_cursor.rbs +38 -5
  461. data/sig/ibex/frontend/source_document.rbs +119 -0
  462. data/sig/ibex/frontend/source_loader.rbs +66 -0
  463. data/sig/ibex/frontend/source_span.rbs +56 -0
  464. data/sig/ibex/frontend/token_adapter/declaration_document_state.rbs +21 -0
  465. data/sig/ibex/frontend/token_adapter/declaration_lexer_state.rbs +27 -0
  466. data/sig/ibex/frontend/token_adapter/declaration_state.rbs +83 -3
  467. data/sig/ibex/frontend/token_adapter/rule_state.rbs +20 -0
  468. data/sig/ibex/frontend/token_adapter.rbs +11 -2
  469. data/sig/ibex/frontend.rbs +1 -1
  470. data/sig/ibex/fuzz.rbs +71 -0
  471. data/sig/ibex/generation_input.rbs +37 -0
  472. data/sig/ibex/generation_manifest.rbs +70 -0
  473. data/sig/ibex/generation_transaction.rbs +82 -0
  474. data/sig/ibex/generation_transaction_recovery.rbs +36 -0
  475. data/sig/ibex/generation_transaction_validation.rbs +65 -0
  476. data/sig/ibex/grammar_tests.rbs +93 -0
  477. data/sig/ibex/ir/automaton_ir.rbs +35 -10
  478. data/sig/ibex/ir/grammar_ir.rbs +96 -22
  479. data/sig/ibex/ir/lexer_ir.rbs +57 -0
  480. data/sig/ibex/ir/parser_contract.rbs +69 -0
  481. data/sig/ibex/ir/serialize.rbs +75 -23
  482. data/sig/ibex/ir/validator/automaton.rbs +112 -0
  483. data/sig/ibex/ir/validator/base.rbs +69 -0
  484. data/sig/ibex/ir/validator/grammar.rbs +195 -0
  485. data/sig/ibex/ir/validator/lexer.rbs +37 -0
  486. data/sig/ibex/ir/validator.rbs +16 -0
  487. data/sig/ibex/ir.rbs +45 -5
  488. data/sig/ibex/lalr/build_metrics.rbs +60 -0
  489. data/sig/ibex/lalr/builder.rbs +150 -19
  490. data/sig/ibex/lalr/conflict_search.rbs +12 -5
  491. data/sig/ibex/lalr/counterexample.rbs +20 -14
  492. data/sig/ibex/lalr/direct_lookaheads.rbs +93 -0
  493. data/sig/ibex/lalr/goto_follows.rbs +89 -0
  494. data/sig/ibex/lalr/ielr/annotator.rbs +67 -0
  495. data/sig/ibex/lalr/ielr/bits.rbs +14 -0
  496. data/sig/ibex/lalr/ielr/inadequacy.rbs +24 -0
  497. data/sig/ibex/lalr/ielr/item_lookaheads.rbs +35 -0
  498. data/sig/ibex/lalr/ielr/pipeline.rbs +17 -0
  499. data/sig/ibex/lalr/ielr/split_stability.rbs +27 -0
  500. data/sig/ibex/lalr/ielr/split_state.rbs +14 -0
  501. data/sig/ibex/lalr/ielr/state_splitter.rbs +76 -0
  502. data/sig/ibex/lalr/ielr_partition.rbs +71 -0
  503. data/sig/ibex/lalr/inadequacy_report.rbs +21 -0
  504. data/sig/ibex/lalr/lookahead_propagation.rbs +38 -0
  505. data/sig/ibex/lalr/lr0_collection.rbs +50 -0
  506. data/sig/ibex/lalr/on_error_reductions.rbs +22 -0
  507. data/sig/ibex/lalr/unreachable_states.rbs +25 -0
  508. data/sig/ibex/lalr.rbs +17 -1
  509. data/sig/ibex/location.rbs +67 -0
  510. data/sig/ibex/lsp/document_handlers.rbs +24 -0
  511. data/sig/ibex/lsp/document_store.rbs +94 -0
  512. data/sig/ibex/lsp/document_store_diagnostics.rbs +20 -0
  513. data/sig/ibex/lsp/document_store_validation.rbs +26 -0
  514. data/sig/ibex/lsp/initialization_handlers.rbs +30 -0
  515. data/sig/ibex/lsp/navigation_handlers.rbs +33 -0
  516. data/sig/ibex/lsp/parser_configuration_assistance.rbs +49 -0
  517. data/sig/ibex/lsp/position_codec.rbs +44 -0
  518. data/sig/ibex/lsp/protocol_error.rbs +32 -0
  519. data/sig/ibex/lsp/request_handlers.rbs +26 -0
  520. data/sig/ibex/lsp/request_support.rbs +40 -0
  521. data/sig/ibex/lsp/server.rbs +55 -0
  522. data/sig/ibex/lsp/symbol_index.rbs +77 -0
  523. data/sig/ibex/lsp/symbol_index_builder.rbs +88 -0
  524. data/sig/ibex/lsp/symbol_index_precedence_references.rbs +18 -0
  525. data/sig/ibex/lsp/symbol_index_source_queries.rbs +26 -0
  526. data/sig/ibex/lsp/symbol_occurrence.rbs +31 -0
  527. data/sig/ibex/lsp/transport.rbs +47 -0
  528. data/sig/ibex/lsp/workspace.rbs +42 -0
  529. data/sig/ibex/lsp/workspace_analyzer.rbs +69 -0
  530. data/sig/ibex/lsp.rbs +7 -0
  531. data/sig/ibex/messages.rbs +26 -0
  532. data/sig/ibex/metrics.rbs +50 -0
  533. data/sig/ibex/normalize/declarations.rbs +31 -0
  534. data/sig/ibex/normalize/diagnostics.rbs +13 -4
  535. data/sig/ibex/normalize/expander.rbs +22 -16
  536. data/sig/ibex/normalize/expression.rbs +11 -9
  537. data/sig/ibex/normalize/grammar_builder.rbs +11 -0
  538. data/sig/ibex/normalize/inline_expansion.rbs +129 -0
  539. data/sig/ibex/normalize/inline_validation.rbs +40 -0
  540. data/sig/ibex/normalize/lexer.rbs +37 -0
  541. data/sig/ibex/normalize/named_references.rbs +20 -0
  542. data/sig/ibex/normalize/nodes.rbs +14 -0
  543. data/sig/ibex/normalize/parameter_ebnf_lowering.rbs +33 -0
  544. data/sig/ibex/normalize/parameter_lowering.rbs +35 -0
  545. data/sig/ibex/normalize/parameter_substitution.rbs +42 -0
  546. data/sig/ibex/normalize/parameter_validation.rbs +44 -0
  547. data/sig/ibex/normalize/parameters.rbs +51 -0
  548. data/sig/ibex/normalize/parser_configuration.rbs +23 -0
  549. data/sig/ibex/normalize/recovery_declarations.rbs +24 -0
  550. data/sig/ibex/normalize.rbs +129 -18
  551. data/sig/ibex/racc_migration/checker.rbs +36 -0
  552. data/sig/ibex/racc_migration/harness.rbs +16 -0
  553. data/sig/ibex/racc_migration/report.rbs +55 -0
  554. data/sig/ibex/racc_migration.rbs +8 -0
  555. data/sig/ibex/rake_task.rbs +51 -0
  556. data/sig/ibex/samples.rbs +60 -0
  557. data/sig/ibex/table_artifact/builder.rbs +93 -0
  558. data/sig/ibex/table_artifact/cst_projection.rbs +20 -0
  559. data/sig/ibex/table_artifact/document.rbs +27 -0
  560. data/sig/ibex/table_artifact/executor.rbs +66 -0
  561. data/sig/ibex/table_artifact/serializer.rbs +25 -0
  562. data/sig/ibex/table_artifact/validator/metadata.rbs +52 -0
  563. data/sig/ibex/table_artifact/validator/support.rbs +46 -0
  564. data/sig/ibex/table_artifact/validator/tables.rbs +63 -0
  565. data/sig/ibex/table_artifact/validator.rbs +66 -0
  566. data/sig/ibex/table_artifact.rbs +32 -0
  567. data/sig/ibex/table_simulation/result.rbs +36 -0
  568. data/sig/ibex/table_simulation/simulator.rbs +98 -0
  569. data/sig/ibex/table_simulation/step.rbs +42 -0
  570. data/sig/ibex/table_simulation/text.rbs +14 -0
  571. data/sig/ibex/table_simulation.rbs +7 -0
  572. data/sig/ibex/tables.rbs +10 -35
  573. data/sig/ibex/verifiable_generation_bundle.rbs +24 -0
  574. data/sig/ibex/verification_report/builder.rbs +53 -0
  575. data/sig/ibex/verification_report/canonical_ir.rbs +41 -0
  576. data/sig/ibex/verification_report/logical_path.rbs +34 -0
  577. data/sig/ibex/verification_report/validator.rbs +114 -0
  578. data/sig/ibex/verification_report.rbs +44 -0
  579. data/sig/ibex/verify/action_correspondence.rbs +50 -0
  580. data/sig/ibex/verify/language_witness.rbs +112 -0
  581. data/sig/ibex/verify/reference_collection.rbs +63 -0
  582. data/sig/ibex/verify/result.rbs +52 -0
  583. data/sig/ibex/verify/verifier.rbs +170 -0
  584. data/sig/ibex/verify.rbs +6 -0
  585. data/sig/ibex/watch/runner.rbs +58 -0
  586. data/sig/ibex/watch/source_snapshot.rbs +46 -0
  587. data/sig/ibex/watch.rbs +7 -0
  588. data/sig/ibex.rbs +2 -0
  589. metadata +524 -19
  590. data/.rubocop.yml +0 -43
  591. data/CHANGELOG.md +0 -30
  592. data/Rakefile +0 -25
  593. data/Steepfile +0 -10
  594. data/docs/compat-notes.md +0 -37
  595. data/docs/lexer-coverage.md +0 -14
  596. data/docs/phase10-extensions.md +0 -27
  597. data/gemfiles/Gemfile +0 -7
  598. data/gemfiles/Gemfile.lock +0 -98
  599. data/lib/ibex/frontend/grammar.y +0 -156
  600. data/lib/ibex/runtime/parser.rb +0 -360
  601. data/lib/ibex/runtime.rb +0 -8
  602. data/sig/ibex/runtime/parser.rbs +0 -167
  603. data/sig/ibex/runtime.rbs +0 -6
@@ -1,360 +0,0 @@
1
- # frozen_string_literal: true
2
- # rbs_inline: enabled
3
-
4
- module Ibex
5
- module Runtime
6
- # Parser-table shape understood by this runtime.
7
- PARSER_TABLE_FORMAT_VERSION = 1 #: Integer
8
-
9
- # Raised by the default parser error handler.
10
- class ParseError < StandardError; end
11
-
12
- # rubocop:disable Metrics/ClassLength
13
-
14
- # Drives a table-defined LR parser without native extensions.
15
- #
16
- # Subclasses provide `.parser_tables`, returning `:tokens`, `:token_names`,
17
- # `:actions`, `:gotos`, and `:productions`. Actions are represented by
18
- # `[:shift, state]`, `[:reduce, production]`, `[:accept]`, or `[:error]`.
19
- class Parser
20
- EOF_TOKEN = 0 #: Integer
21
- ERROR_TOKEN = 1 #: Integer
22
- NO_LOOKAHEAD = Object.new.freeze #: Object
23
- RECOVERY_SHIFTS = 3 #: Integer
24
- empty_row = {} # @type var empty_row: Hash[Integer, untyped]
25
-
26
- EMPTY_ROW = empty_row.freeze #: Hash[Integer, untyped]
27
-
28
- # @rbs @yydebug: bool
29
- # @rbs @yydebug_output: IO
30
- # @rbs @source: (^() -> untyped)?
31
- # @rbs @state_stack: Array[Integer]
32
- # @rbs @value_stack: Array[untyped]
33
- # @rbs @lookahead: untyped
34
- # @rbs @lookahead_value: untyped
35
- # @rbs @recovery_shifts: Integer
36
- # @rbs @semantic_error: bool
37
- # @rbs @accept_requested: bool
38
- # @rbs @unknown_token_id: Integer?
39
- # @rbs @unknown_token_name: String?
40
-
41
- attr_accessor :yydebug #: bool
42
- attr_writer :yydebug_output #: IO
43
-
44
- # @rbs () -> void
45
- def initialize
46
- @yydebug = false
47
- @yydebug_output = $stderr
48
- @source = nil
49
- @state_stack = []
50
- @value_stack = []
51
- @lookahead = NO_LOOKAHEAD
52
- @lookahead_value = nil
53
- @recovery_shifts = 0
54
- @semantic_error = false
55
- @accept_requested = false
56
- @unknown_token_id = nil
57
- end
58
-
59
- # Pull tokens from `next_token` and parse them.
60
- # @rbs () -> untyped
61
- def do_parse
62
- drive_parser(-> { next_token })
63
- end
64
-
65
- # Parse tokens yielded by `receiver.method_id`.
66
- # @rbs (untyped receiver, Symbol method_id) -> untyped
67
- def yyparse(receiver, method_id)
68
- stream = Enumerator.new do |tokens|
69
- receiver.__send__(method_id) { |token| tokens << token }
70
- end
71
- drive_parser(-> { stream.next })
72
- end
73
-
74
- # Override in pull parsers. Return `[token, value]`, `false`, or `nil`.
75
- # @rbs () -> ([untyped, untyped] | false | nil)
76
- def next_token
77
- raise NotImplementedError, "(input):1:1: next_token must be implemented"
78
- end
79
-
80
- # Override to recover from syntax errors. The default always raises.
81
- # @rbs (Integer token_id, untyped value, Array[untyped] value_stack) -> untyped
82
- def on_error(token_id, value, _value_stack)
83
- expected = expected_tokens
84
- suffix = expected.empty? ? "" : "; expected #{expected.join(', ')}"
85
- raise ParseError, "(input):1:1: unexpected #{token_to_str(token_id)}#{suffix} (#{value.inspect})"
86
- end
87
-
88
- # Called after an ordinary input token is shifted. Override to observe
89
- # the internal token id, semantic value, and destination state.
90
- # @rbs (Integer token_id, untyped value, Integer state) -> void
91
- def on_shift(_token_id, _value, _state); end
92
-
93
- # Called after a production's semantic action and goto are committed.
94
- # Override to observe its id, RHS values, and semantic result.
95
- # @rbs (Integer production_id, Array[untyped] values, untyped result) -> void
96
- def on_reduce(_production_id, _values, _result); end
97
-
98
- # Called after the synthetic error token enters a recovery state.
99
- # The payload describes the original error before recovery popped stacks.
100
- # @rbs (Integer token_id, untyped value, Array[untyped] value_stack) -> void
101
- def on_error_recover(_token_id, _value, _value_stack); end
102
-
103
- # Return a human-readable name for an internal token id.
104
- # @rbs (Integer token_id) -> String
105
- def token_to_str(token_id)
106
- return @unknown_token_name || token_id.to_s if token_id == @unknown_token_id
107
-
108
- parser_tables.fetch(:token_names).fetch(token_id, token_id.to_s)
109
- end
110
-
111
- # Enter error recovery from a semantic action without calling `on_error`.
112
- # @rbs () -> nil
113
- def yyerror
114
- @semantic_error = true
115
- nil
116
- end
117
-
118
- # Leave error recovery immediately.
119
- # @rbs () -> nil
120
- def yyerrok
121
- @recovery_shifts = 0
122
- nil
123
- end
124
-
125
- # Accept immediately after the current semantic action completes.
126
- # @rbs () -> nil
127
- def yyaccept
128
- @accept_requested = true
129
- nil
130
- end
131
-
132
- # Return token names accepted in the current parser state.
133
- # @rbs () -> Array[String]
134
- def expected_tokens
135
- return [] if @state_stack.empty?
136
-
137
- state = @state_stack.last
138
- parser_tables.fetch(:token_names).keys.filter_map do |token_id|
139
- action = table_lookup(parser_tables.fetch(:actions), state, token_id) || default_action(state) || [:error]
140
- token_to_str(token_id) unless error_action?(action) || token_id == ERROR_TOKEN
141
- end
142
- end
143
-
144
- private
145
-
146
- # @rbs (^() -> untyped source) -> untyped
147
- def drive_parser(source)
148
- prepare_parse(source)
149
- loop do
150
- action = action_for_current_state
151
- outcome = perform(action)
152
- return outcome[1] if outcome[0] == :done
153
- end
154
- ensure
155
- @source = nil
156
- end
157
-
158
- # @rbs (^() -> untyped source) -> void
159
- def prepare_parse(source)
160
- validate_parser_table_format!
161
- @source = source
162
- @state_stack = [0]
163
- @value_stack = []
164
- @lookahead = NO_LOOKAHEAD
165
- @lookahead_value = nil
166
- @recovery_shifts = 0
167
- @semantic_error = false
168
- @accept_requested = false
169
- @unknown_token_id = nil
170
- trace("start state 0")
171
- end
172
-
173
- # @rbs () -> void
174
- def validate_parser_table_format!
175
- tables = parser_tables
176
- unless tables.key?(:format_version)
177
- raise ParseError,
178
- "(tables):1:1: parser tables for #{self.class} are missing :format_version; " \
179
- "regenerate the parser with the installed Ibex version"
180
- end
181
-
182
- actual = tables.fetch(:format_version)
183
- return if actual == PARSER_TABLE_FORMAT_VERSION
184
-
185
- raise ParseError,
186
- "(tables):1:1: unsupported parser table format version #{actual.inspect} for #{self.class}; " \
187
- "runtime supports #{PARSER_TABLE_FORMAT_VERSION}; regenerate the parser with the installed Ibex version"
188
- end
189
-
190
- # @rbs () -> untyped
191
- def action_for_current_state
192
- read_lookahead if @lookahead.equal?(NO_LOOKAHEAD)
193
- state = @state_stack.last
194
- return [:error] unless parser_tables.fetch(:token_names).key?(@lookahead)
195
-
196
- explicit = table_lookup(parser_tables.fetch(:actions), state, @lookahead)
197
- return explicit if explicit
198
-
199
- default_action(state) || [:error]
200
- end
201
-
202
- # @rbs (untyped action) -> untyped
203
- def perform(action)
204
- case action.first
205
- when :shift then shift(action.fetch(1))
206
- when :reduce then reduce(action.fetch(1))
207
- when :accept then [:done, @value_stack.last]
208
- when :error then recover
209
- else raise ParseError, "(tables):1:1: unknown parser action #{action.inspect}"
210
- end
211
- end
212
-
213
- # @rbs (Integer next_state) -> untyped
214
- def shift(next_state)
215
- token_id = @lookahead
216
- value = @lookahead_value
217
- trace("shift #{token_to_str(token_id)} -> state #{next_state}")
218
- @state_stack << next_state
219
- @value_stack << value
220
- @lookahead = NO_LOOKAHEAD
221
- @recovery_shifts -= 1 if @recovery_shifts.positive?
222
- on_shift(token_id, value, next_state)
223
- [:continue]
224
- end
225
-
226
- # @rbs (Integer production_id) -> untyped
227
- def reduce(production_id)
228
- production = parser_tables.fetch(:productions).fetch(production_id)
229
- length = production.fetch(:length)
230
- values = @value_stack.last(length)
231
- hook_values = values.dup
232
- @state_stack.pop(length)
233
- @value_stack.pop(length)
234
- result = reduction_value(production, values)
235
- next_state = table_lookup(parser_tables.fetch(:gotos), @state_stack.last, production.fetch(:lhs))
236
- raise ParseError, "(tables):1:1: missing goto for production #{production_id}" if next_state.nil?
237
-
238
- @state_stack << next_state
239
- @value_stack << result
240
- trace("reduce #{production_id} (#{length}) -> state #{next_state}")
241
- on_reduce(production_id, hook_values, result)
242
- return [:done, result] if @accept_requested
243
- return recover(report: false) if @semantic_error
244
-
245
- [:continue]
246
- end
247
-
248
- # @rbs (Hash[Symbol, untyped] production, Array[untyped] values) -> untyped
249
- def reduction_value(production, values)
250
- action = production[:action]
251
- return values.first unless action
252
- return instance_exec(values, @value_stack.dup, &action) if action.respond_to?(:call)
253
-
254
- __send__(action, values, @value_stack.dup)
255
- end
256
-
257
- # @rbs (?report: bool) -> untyped
258
- def recover(report: true)
259
- @semantic_error = false
260
- if @recovery_shifts.positive?
261
- return [:done, nil] if @lookahead == EOF_TOKEN
262
-
263
- trace("discard #{token_to_str(@lookahead)} during recovery")
264
- @lookahead = NO_LOOKAHEAD
265
- return [:continue]
266
- end
267
-
268
- token_id = @lookahead
269
- value = @lookahead_value
270
- value_stack = @value_stack.dup
271
- on_error(token_id, value, value_stack.dup) if report
272
- return [:done, nil] unless shift_error_token
273
-
274
- @recovery_shifts = RECOVERY_SHIFTS
275
- on_error_recover(token_id, value, value_stack)
276
- [:continue]
277
- end
278
-
279
- # @rbs () -> bool
280
- def shift_error_token
281
- loop do
282
- action = table_lookup(parser_tables.fetch(:actions), @state_stack.last, ERROR_TOKEN)
283
- if action&.first == :shift
284
- trace("recover: shift error -> state #{action.fetch(1)}")
285
- @state_stack << action.fetch(1)
286
- @value_stack << nil
287
- return true
288
- end
289
- return false if @state_stack.length == 1
290
-
291
- trace("recover: pop state #{@state_stack.last}")
292
- @state_stack.pop
293
- @value_stack.pop
294
- end
295
- end
296
-
297
- # @rbs () -> void
298
- def read_lookahead
299
- pair = read_external_token
300
- if pair.nil? || pair == false
301
- @lookahead = EOF_TOKEN
302
- @lookahead_value = nil
303
- else
304
- external_token, @lookahead_value = pair
305
- @lookahead = internal_token_id(external_token)
306
- end
307
- trace("read #{token_to_str(@lookahead)}")
308
- end
309
-
310
- # @rbs () -> untyped
311
- def read_external_token
312
- source = @source
313
- raise ParseError, "(input):1:1: token source is not available" unless source
314
-
315
- source.call
316
- rescue StopIteration
317
- false
318
- end
319
-
320
- # @rbs (untyped external_token) -> Integer
321
- def internal_token_id(external_token)
322
- token_id = parser_tables.fetch(:tokens)[external_token]
323
- return token_id if token_id
324
-
325
- @unknown_token_name = external_token.inspect
326
- @unknown_token_id = -external_token.object_id.abs
327
- end
328
-
329
- # @rbs () -> Hash[Symbol, untyped]
330
- def parser_tables
331
- self.class.__send__(:parser_tables)
332
- rescue NoMethodError
333
- raise ParseError, "(tables):1:1: #{self.class} must define .parser_tables"
334
- end
335
-
336
- # @rbs (untyped action) -> bool
337
- def error_action?(action)
338
- action.nil? || action.first == :error
339
- end
340
-
341
- # @rbs (Integer state) -> untyped
342
- def default_action(state)
343
- parser_tables.fetch(:default_actions, EMPTY_ROW)[state]
344
- end
345
-
346
- # @rbs (untyped table, Integer row, Integer column) -> untyped
347
- def table_lookup(table, row, column)
348
- return table.lookup(row, column) if table.respond_to?(:lookup)
349
-
350
- table.fetch(row, EMPTY_ROW)[column]
351
- end
352
-
353
- # @rbs (String message) -> void
354
- def trace(message)
355
- @yydebug_output.puts("ibex: #{message}") if @yydebug
356
- end
357
- end
358
- # rubocop:enable Metrics/ClassLength
359
- end
360
- end
data/lib/ibex/runtime.rb DELETED
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "runtime/parser"
4
-
5
- module Ibex
6
- module Runtime
7
- end
8
- end
@@ -1,167 +0,0 @@
1
- # Generated from lib/ibex/runtime/parser.rb with RBS::Inline
2
-
3
- module Ibex
4
- module Runtime
5
- # Parser-table shape understood by this runtime.
6
- PARSER_TABLE_FORMAT_VERSION: Integer
7
-
8
- # Raised by the default parser error handler.
9
- class ParseError < StandardError
10
- end
11
-
12
- # Drives a table-defined LR parser without native extensions.
13
- #
14
- # Subclasses provide `.parser_tables`, returning `:tokens`, `:token_names`,
15
- # `:actions`, `:gotos`, and `:productions`. Actions are represented by
16
- # `[:shift, state]`, `[:reduce, production]`, `[:accept]`, or `[:error]`.
17
- class Parser
18
- EOF_TOKEN: Integer
19
-
20
- ERROR_TOKEN: Integer
21
-
22
- NO_LOOKAHEAD: Object
23
-
24
- RECOVERY_SHIFTS: Integer
25
-
26
- EMPTY_ROW: Hash[Integer, untyped]
27
-
28
- @yydebug: bool
29
-
30
- @yydebug_output: IO
31
-
32
- @source: (^() -> untyped)?
33
-
34
- @state_stack: Array[Integer]
35
-
36
- @value_stack: Array[untyped]
37
-
38
- @lookahead: untyped
39
-
40
- @lookahead_value: untyped
41
-
42
- @recovery_shifts: Integer
43
-
44
- @semantic_error: bool
45
-
46
- @accept_requested: bool
47
-
48
- @unknown_token_id: Integer?
49
-
50
- @unknown_token_name: String?
51
-
52
- attr_accessor yydebug: bool
53
-
54
- attr_writer yydebug_output: IO
55
-
56
- # @rbs () -> void
57
- def initialize: () -> void
58
-
59
- # Pull tokens from `next_token` and parse them.
60
- # @rbs () -> untyped
61
- def do_parse: () -> untyped
62
-
63
- # Parse tokens yielded by `receiver.method_id`.
64
- # @rbs (untyped receiver, Symbol method_id) -> untyped
65
- def yyparse: (untyped receiver, Symbol method_id) -> untyped
66
-
67
- # Override in pull parsers. Return `[token, value]`, `false`, or `nil`.
68
- # @rbs () -> ([untyped, untyped] | false | nil)
69
- def next_token: () -> ([ untyped, untyped ] | false | nil)
70
-
71
- # Override to recover from syntax errors. The default always raises.
72
- # @rbs (Integer token_id, untyped value, Array[untyped] value_stack) -> untyped
73
- def on_error: (Integer token_id, untyped value, Array[untyped] value_stack) -> untyped
74
-
75
- # Called after an ordinary input token is shifted. Override to observe
76
- # the internal token id, semantic value, and destination state.
77
- # @rbs (Integer token_id, untyped value, Integer state) -> void
78
- def on_shift: (Integer token_id, untyped value, Integer state) -> void
79
-
80
- # Called after a production's semantic action and goto are committed.
81
- # Override to observe its id, RHS values, and semantic result.
82
- # @rbs (Integer production_id, Array[untyped] values, untyped result) -> void
83
- def on_reduce: (Integer production_id, Array[untyped] values, untyped result) -> void
84
-
85
- # Called after the synthetic error token enters a recovery state.
86
- # The payload describes the original error before recovery popped stacks.
87
- # @rbs (Integer token_id, untyped value, Array[untyped] value_stack) -> void
88
- def on_error_recover: (Integer token_id, untyped value, Array[untyped] value_stack) -> void
89
-
90
- # Return a human-readable name for an internal token id.
91
- # @rbs (Integer token_id) -> String
92
- def token_to_str: (Integer token_id) -> String
93
-
94
- # Enter error recovery from a semantic action without calling `on_error`.
95
- # @rbs () -> nil
96
- def yyerror: () -> nil
97
-
98
- # Leave error recovery immediately.
99
- # @rbs () -> nil
100
- def yyerrok: () -> nil
101
-
102
- # Accept immediately after the current semantic action completes.
103
- # @rbs () -> nil
104
- def yyaccept: () -> nil
105
-
106
- # Return token names accepted in the current parser state.
107
- # @rbs () -> Array[String]
108
- def expected_tokens: () -> Array[String]
109
-
110
- private
111
-
112
- # @rbs (^() -> untyped source) -> untyped
113
- def drive_parser: (^() -> untyped source) -> untyped
114
-
115
- # @rbs (^() -> untyped source) -> void
116
- def prepare_parse: (^() -> untyped source) -> void
117
-
118
- # @rbs () -> void
119
- def validate_parser_table_format!: () -> void
120
-
121
- # @rbs () -> untyped
122
- def action_for_current_state: () -> untyped
123
-
124
- # @rbs (untyped action) -> untyped
125
- def perform: (untyped action) -> untyped
126
-
127
- # @rbs (Integer next_state) -> untyped
128
- def shift: (Integer next_state) -> untyped
129
-
130
- # @rbs (Integer production_id) -> untyped
131
- def reduce: (Integer production_id) -> untyped
132
-
133
- # @rbs (Hash[Symbol, untyped] production, Array[untyped] values) -> untyped
134
- def reduction_value: (Hash[Symbol, untyped] production, Array[untyped] values) -> untyped
135
-
136
- # @rbs (?report: bool) -> untyped
137
- def recover: (?report: bool) -> untyped
138
-
139
- # @rbs () -> bool
140
- def shift_error_token: () -> bool
141
-
142
- # @rbs () -> void
143
- def read_lookahead: () -> void
144
-
145
- # @rbs () -> untyped
146
- def read_external_token: () -> untyped
147
-
148
- # @rbs (untyped external_token) -> Integer
149
- def internal_token_id: (untyped external_token) -> Integer
150
-
151
- # @rbs () -> Hash[Symbol, untyped]
152
- def parser_tables: () -> Hash[Symbol, untyped]
153
-
154
- # @rbs (untyped action) -> bool
155
- def error_action?: (untyped action) -> bool
156
-
157
- # @rbs (Integer state) -> untyped
158
- def default_action: (Integer state) -> untyped
159
-
160
- # @rbs (untyped table, Integer row, Integer column) -> untyped
161
- def table_lookup: (untyped table, Integer row, Integer column) -> untyped
162
-
163
- # @rbs (String message) -> void
164
- def trace: (String message) -> void
165
- end
166
- end
167
- end
data/sig/ibex/runtime.rbs DELETED
@@ -1,6 +0,0 @@
1
- # Generated from lib/ibex/runtime.rb with RBS::Inline
2
-
3
- module Ibex
4
- module Runtime
5
- end
6
- end