ibex 0.1.0 → 0.2.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 (384) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +247 -104
  3. data/docs/architecture.md +322 -28
  4. data/docs/cst-migration.md +107 -0
  5. data/docs/cst.md +213 -0
  6. data/docs/development.md +129 -0
  7. data/docs/editor-setup.md +25 -0
  8. data/docs/error-ux.md +60 -0
  9. data/docs/grammar-reference.md +458 -18
  10. data/docs/lexer-migration.md +51 -0
  11. data/docs/racc-migration.md +34 -6
  12. data/docs/release-readiness.md +163 -0
  13. data/docs/stability.md +124 -0
  14. data/examples/README.md +60 -0
  15. data/examples/calculator.y +44 -0
  16. data/examples/csv.y +32 -0
  17. data/examples/ini.y +70 -0
  18. data/examples/json.y +48 -0
  19. data/examples/tiny_language.y +75 -0
  20. data/lib/ibex/analysis/sets.rb +5 -4
  21. data/lib/ibex/artifact_set.rb +63 -0
  22. data/lib/ibex/cli/ambiguity.rb +66 -0
  23. data/lib/ibex/cli/counterexample_options.rb +6 -2
  24. data/lib/ibex/cli/coverage.rb +173 -0
  25. data/lib/ibex/cli/debug.rb +106 -0
  26. data/lib/ibex/cli/diagnostics.rb +116 -0
  27. data/lib/ibex/cli/documentation.rb +67 -0
  28. data/lib/ibex/cli/error_messages.rb +177 -0
  29. data/lib/ibex/cli/explain.rb +76 -0
  30. data/lib/ibex/cli/formatting.rb +386 -0
  31. data/lib/ibex/cli/generation_artifacts.rb +138 -0
  32. data/lib/ibex/cli/generation_error_messages.rb +39 -0
  33. data/lib/ibex/cli/grammar_tests.rb +122 -0
  34. data/lib/ibex/cli/ir_tools.rb +184 -0
  35. data/lib/ibex/cli/lsp.rb +33 -0
  36. data/lib/ibex/cli/outputs.rb +91 -8
  37. data/lib/ibex/cli/racc_migration.rb +87 -0
  38. data/lib/ibex/cli/samples.rb +92 -0
  39. data/lib/ibex/cli/watch.rb +103 -0
  40. data/lib/ibex/cli.rb +506 -37
  41. data/lib/ibex/codegen/action_locations.rb +103 -0
  42. data/lib/ibex/codegen/action_method_source.rb +210 -0
  43. data/lib/ibex/codegen/action_source.rb +118 -0
  44. data/lib/ibex/codegen/ambiguity.rb +173 -0
  45. data/lib/ibex/codegen/cst_metadata.rb +171 -0
  46. data/lib/ibex/codegen/documentation.rb +170 -0
  47. data/lib/ibex/codegen/explain.rb +312 -0
  48. data/lib/ibex/codegen/generated_action_abi.rb +288 -0
  49. data/lib/ibex/codegen/html.rb +94 -10
  50. data/lib/ibex/codegen/mermaid.rb +43 -0
  51. data/lib/ibex/codegen/railroad.rb +197 -0
  52. data/lib/ibex/codegen/railroad_documentation.rb +59 -0
  53. data/lib/ibex/codegen/rbs.rb +323 -2
  54. data/lib/ibex/codegen/report.rb +46 -6
  55. data/lib/ibex/codegen/ruby.rb +334 -59
  56. data/lib/ibex/codegen/ruby_actions.rb +143 -0
  57. data/lib/ibex/codegen/ruby_ast.rb +121 -0
  58. data/lib/ibex/codegen/ruby_error_messages.rb +28 -0
  59. data/lib/ibex/codegen/ruby_lexer.rb +83 -0
  60. data/lib/ibex/codegen/ruby_syntax.rb +90 -0
  61. data/lib/ibex/codegen/ruby_table_metadata.rb +57 -0
  62. data/lib/ibex/codegen/ruby_value_printers.rb +56 -0
  63. data/lib/ibex/codegen/symbol_labels.rb +1 -1
  64. data/lib/ibex/coverage/collector.rb +188 -0
  65. data/lib/ibex/coverage/event_stream.rb +97 -0
  66. data/lib/ibex/coverage/report.rb +259 -0
  67. data/lib/ibex/coverage/runtime_event_validator.rb +160 -0
  68. data/lib/ibex/coverage.rb +13 -0
  69. data/lib/ibex/error_messages/parser.rb +159 -0
  70. data/lib/ibex/error_messages/parser_v2.rb +198 -0
  71. data/lib/ibex/error_messages/renderer.rb +65 -0
  72. data/lib/ibex/error_messages/sentence_search.rb +196 -0
  73. data/lib/ibex/error_messages/update.rb +169 -0
  74. data/lib/ibex/error_messages.rb +165 -0
  75. data/lib/ibex/frontend/ast.rb +145 -6
  76. data/lib/ibex/frontend/bootstrap_parser.rb +47 -4
  77. data/lib/ibex/frontend/diagnostic.rb +81 -0
  78. data/lib/ibex/frontend/diagnostic_recovery.rb +268 -0
  79. data/lib/ibex/frontend/dsl.rb +66 -7
  80. data/lib/ibex/frontend/formatter.rb +407 -0
  81. data/lib/ibex/frontend/generated_parser.rb +614 -190
  82. data/lib/ibex/frontend/generated_parser_base.rb +164 -30
  83. data/lib/ibex/frontend/generated_parser_includes.rb +61 -0
  84. data/lib/ibex/frontend/generated_parser_metadata.rb +61 -0
  85. data/lib/ibex/frontend/generated_parser_parameters.rb +60 -0
  86. data/lib/ibex/frontend/generation.rb +33 -0
  87. data/lib/ibex/frontend/lexer.rb +162 -10
  88. data/lib/ibex/frontend/lexer_recovery.rb +84 -0
  89. data/lib/ibex/frontend/parser/declarations.rb +247 -11
  90. data/lib/ibex/frontend/parser/parameters.rb +82 -0
  91. data/lib/ibex/frontend/parser/rules.rb +43 -6
  92. data/lib/ibex/frontend/parser.rb +182 -4
  93. data/lib/ibex/frontend/regenerator.rb +26 -1
  94. data/lib/ibex/frontend/resolution.rb +69 -0
  95. data/lib/ibex/frontend/resolver.rb +217 -0
  96. data/lib/ibex/frontend/rule_documentation.rb +103 -0
  97. data/lib/ibex/frontend/source_cursor.rb +132 -8
  98. data/lib/ibex/frontend/source_document.rb +229 -0
  99. data/lib/ibex/frontend/source_loader.rb +150 -0
  100. data/lib/ibex/frontend/source_span.rb +81 -0
  101. data/lib/ibex/frontend/token_adapter/declaration_document_state.rb +47 -0
  102. data/lib/ibex/frontend/token_adapter/declaration_lexer_state.rb +83 -0
  103. data/lib/ibex/frontend/token_adapter/declaration_state.rb +216 -26
  104. data/lib/ibex/frontend/token_adapter/delimiter_tracker.rb +8 -2
  105. data/lib/ibex/frontend/token_adapter/rule_state.rb +60 -2
  106. data/lib/ibex/frontend/token_adapter.rb +8 -3
  107. data/lib/ibex/frontend.rb +13 -2
  108. data/lib/ibex/generation_input.rb +57 -0
  109. data/lib/ibex/generation_manifest.rb +200 -0
  110. data/lib/ibex/generation_transaction.rb +261 -0
  111. data/lib/ibex/generation_transaction_recovery.rb +109 -0
  112. data/lib/ibex/generation_transaction_validation.rb +196 -0
  113. data/lib/ibex/grammar_tests.rb +206 -0
  114. data/lib/ibex/ir/automaton_ir.rb +38 -5
  115. data/lib/ibex/ir/grammar_ir.rb +137 -24
  116. data/lib/ibex/ir/lexer_ir.rb +76 -0
  117. data/lib/ibex/ir/migration.rb +120 -0
  118. data/lib/ibex/ir/serialize.rb +110 -19
  119. data/lib/ibex/ir/validator/automaton.rb +345 -0
  120. data/lib/ibex/ir/validator/base.rb +129 -0
  121. data/lib/ibex/ir/validator/grammar.rb +604 -0
  122. data/lib/ibex/ir/validator/lexer.rb +113 -0
  123. data/lib/ibex/ir/validator.rb +62 -0
  124. data/lib/ibex/ir.rb +57 -4
  125. data/lib/ibex/lalr/build_metrics.rb +23 -0
  126. data/lib/ibex/lalr/builder.rb +379 -52
  127. data/lib/ibex/lalr/conflict.rb +1 -0
  128. data/lib/ibex/lalr/conflict_search.rb +11 -5
  129. data/lib/ibex/lalr/counterexample.rb +20 -5
  130. data/lib/ibex/lalr/direct_lookaheads.rb +236 -0
  131. data/lib/ibex/lalr/ielr_partition.rb +152 -0
  132. data/lib/ibex/lalr/on_error_reductions.rb +74 -0
  133. data/lib/ibex/lalr.rb +7 -0
  134. data/lib/ibex/location.rb +129 -0
  135. data/lib/ibex/lsp/document_handlers.rb +66 -0
  136. data/lib/ibex/lsp/document_store.rb +264 -0
  137. data/lib/ibex/lsp/document_store_diagnostics.rb +44 -0
  138. data/lib/ibex/lsp/document_store_validation.rb +61 -0
  139. data/lib/ibex/lsp/initialization_handlers.rb +78 -0
  140. data/lib/ibex/lsp/navigation_handlers.rb +56 -0
  141. data/lib/ibex/lsp/position_codec.rb +109 -0
  142. data/lib/ibex/lsp/protocol_error.rb +33 -0
  143. data/lib/ibex/lsp/request_handlers.rb +45 -0
  144. data/lib/ibex/lsp/request_support.rb +87 -0
  145. data/lib/ibex/lsp/server.rb +146 -0
  146. data/lib/ibex/lsp/symbol_index.rb +241 -0
  147. data/lib/ibex/lsp/symbol_index_builder.rb +267 -0
  148. data/lib/ibex/lsp/symbol_index_precedence_references.rb +44 -0
  149. data/lib/ibex/lsp/symbol_index_source_queries.rb +61 -0
  150. data/lib/ibex/lsp/symbol_occurrence.rb +17 -0
  151. data/lib/ibex/lsp/transport.rb +118 -0
  152. data/lib/ibex/lsp/workspace.rb +127 -0
  153. data/lib/ibex/lsp/workspace_analyzer.rb +199 -0
  154. data/lib/ibex/lsp.rb +32 -0
  155. data/lib/ibex/normalize/declarations.rb +140 -7
  156. data/lib/ibex/normalize/diagnostics.rb +50 -5
  157. data/lib/ibex/normalize/expander.rb +59 -55
  158. data/lib/ibex/normalize/expression.rb +60 -39
  159. data/lib/ibex/normalize/inline_expansion.rb +414 -0
  160. data/lib/ibex/normalize/inline_validation.rb +174 -0
  161. data/lib/ibex/normalize/lexer.rb +131 -0
  162. data/lib/ibex/normalize/named_references.rb +60 -0
  163. data/lib/ibex/normalize/nodes.rb +46 -0
  164. data/lib/ibex/normalize/parameter_ebnf_lowering.rb +69 -0
  165. data/lib/ibex/normalize/parameter_lowering.rb +126 -0
  166. data/lib/ibex/normalize/parameter_substitution.rb +125 -0
  167. data/lib/ibex/normalize/parameter_validation.rb +140 -0
  168. data/lib/ibex/normalize/parameters.rb +199 -0
  169. data/lib/ibex/normalize/recovery_declarations.rb +84 -0
  170. data/lib/ibex/normalize.rb +179 -14
  171. data/lib/ibex/racc_migration/checker.rb +122 -0
  172. data/lib/ibex/racc_migration/harness.rb +177 -0
  173. data/lib/ibex/racc_migration/report.rb +94 -0
  174. data/lib/ibex/racc_migration.rb +12 -0
  175. data/lib/ibex/rake_task.rb +116 -0
  176. data/lib/ibex/samples.rb +186 -0
  177. data/lib/ibex/table_simulation/result.rb +51 -0
  178. data/lib/ibex/table_simulation/simulator.rb +253 -0
  179. data/lib/ibex/table_simulation/step.rb +60 -0
  180. data/lib/ibex/table_simulation/text.rb +31 -0
  181. data/lib/ibex/table_simulation.rb +13 -0
  182. data/lib/ibex/tables.rb +9 -70
  183. data/lib/ibex/version.rb +1 -1
  184. data/lib/ibex/watch/runner.rb +172 -0
  185. data/lib/ibex/watch/source_snapshot.rb +93 -0
  186. data/lib/ibex/watch.rb +11 -0
  187. data/lib/ibex.rb +25 -1
  188. data/schema/automaton-ir-v1.schema.json +401 -0
  189. data/schema/automaton-ir-v2.schema.json +58 -0
  190. data/schema/benchmark-v1.schema.json +212 -0
  191. data/schema/benchmark-v2.schema.json +61 -0
  192. data/schema/cst-v1.json +170 -0
  193. data/schema/error-ux-v1.schema.json +258 -0
  194. data/schema/explain-v1.schema.json +433 -0
  195. data/schema/frontend-diagnostics-v1.schema.json +154 -0
  196. data/schema/generation-manifest-v1.schema.json +115 -0
  197. data/schema/grammar-ir-v1.schema.json +426 -0
  198. data/schema/grammar-ir-v2.schema.json +779 -0
  199. data/schema/lexer-ir-v1.schema.json +215 -0
  200. data/schema/migration-check-v1.schema.json +60 -0
  201. data/schema/performance-comparison-v1.schema.json +395 -0
  202. data/schema/public-performance-comparison-v1.schema.json +506 -0
  203. data/schema/public-performance-profile-v1.schema.json +360 -0
  204. data/schema/runtime-coverage-v1.schema.json +86 -0
  205. data/schema/runtime-event-v1.schema.json +308 -0
  206. data/schema/table-simulation-v1.schema.json +70 -0
  207. data/sig/ibex/artifact_set.rbs +37 -0
  208. data/sig/ibex/cli/ambiguity.rbs +22 -0
  209. data/sig/ibex/cli/counterexample_options.rbs +2 -0
  210. data/sig/ibex/cli/coverage.rbs +53 -0
  211. data/sig/ibex/cli/debug.rbs +28 -0
  212. data/sig/ibex/cli/diagnostics.rbs +38 -0
  213. data/sig/ibex/cli/documentation.rbs +25 -0
  214. data/sig/ibex/cli/error_messages.rbs +57 -0
  215. data/sig/ibex/cli/explain.rbs +25 -0
  216. data/sig/ibex/cli/formatting.rbs +103 -0
  217. data/sig/ibex/cli/generation_artifacts.rbs +50 -0
  218. data/sig/ibex/cli/generation_error_messages.rbs +19 -0
  219. data/sig/ibex/cli/grammar_tests.rbs +36 -0
  220. data/sig/ibex/cli/ir_tools.rbs +51 -0
  221. data/sig/ibex/cli/lsp.rbs +14 -0
  222. data/sig/ibex/cli/outputs.rbs +17 -0
  223. data/sig/ibex/cli/racc_migration.rbs +30 -0
  224. data/sig/ibex/cli/samples.rbs +30 -0
  225. data/sig/ibex/cli/watch.rbs +43 -0
  226. data/sig/ibex/cli.rbs +104 -5
  227. data/sig/ibex/codegen/action_locations.rbs +45 -0
  228. data/sig/ibex/codegen/action_method_source.rbs +65 -0
  229. data/sig/ibex/codegen/action_source.rbs +50 -0
  230. data/sig/ibex/codegen/ambiguity.rbs +60 -0
  231. data/sig/ibex/codegen/cst_metadata.rbs +59 -0
  232. data/sig/ibex/codegen/documentation.rbs +50 -0
  233. data/sig/ibex/codegen/explain.rbs +85 -0
  234. data/sig/ibex/codegen/generated_action_abi.rbs +101 -0
  235. data/sig/ibex/codegen/html.rbs +18 -2
  236. data/sig/ibex/codegen/mermaid.rbs +16 -0
  237. data/sig/ibex/codegen/railroad.rbs +82 -0
  238. data/sig/ibex/codegen/railroad_documentation.rbs +31 -0
  239. data/sig/ibex/codegen/rbs.rbs +84 -4
  240. data/sig/ibex/codegen/report.rbs +8 -0
  241. data/sig/ibex/codegen/ruby.rbs +97 -23
  242. data/sig/ibex/codegen/ruby_actions.rbs +54 -0
  243. data/sig/ibex/codegen/ruby_ast.rbs +34 -0
  244. data/sig/ibex/codegen/ruby_error_messages.rbs +16 -0
  245. data/sig/ibex/codegen/ruby_lexer.rbs +25 -0
  246. data/sig/ibex/codegen/ruby_syntax.rbs +25 -0
  247. data/sig/ibex/codegen/ruby_table_metadata.rbs +26 -0
  248. data/sig/ibex/codegen/ruby_value_printers.rbs +28 -0
  249. data/sig/ibex/coverage/collector.rbs +76 -0
  250. data/sig/ibex/coverage/event_stream.rbs +42 -0
  251. data/sig/ibex/coverage/report.rbs +100 -0
  252. data/sig/ibex/coverage/runtime_event_validator.rbs +68 -0
  253. data/sig/ibex/coverage.rbs +7 -0
  254. data/sig/ibex/error_messages/parser.rbs +58 -0
  255. data/sig/ibex/error_messages/parser_v2.rbs +67 -0
  256. data/sig/ibex/error_messages/renderer.rbs +23 -0
  257. data/sig/ibex/error_messages/sentence_search.rbs +80 -0
  258. data/sig/ibex/error_messages/update.rbs +43 -0
  259. data/sig/ibex/error_messages.rbs +85 -0
  260. data/sig/ibex/frontend/ast.rbs +208 -19
  261. data/sig/ibex/frontend/bootstrap_parser.rbs +11 -0
  262. data/sig/ibex/frontend/diagnostic.rbs +53 -0
  263. data/sig/ibex/frontend/diagnostic_recovery.rbs +98 -0
  264. data/sig/ibex/frontend/dsl.rbs +33 -4
  265. data/sig/ibex/frontend/formatter.rbs +135 -0
  266. data/sig/ibex/frontend/generated_parser.rbs +218 -68
  267. data/sig/ibex/frontend/generated_parser_base.rbs +61 -10
  268. data/sig/ibex/frontend/generated_parser_includes.rbs +23 -0
  269. data/sig/ibex/frontend/generated_parser_metadata.rbs +23 -0
  270. data/sig/ibex/frontend/generated_parser_parameters.rbs +24 -0
  271. data/sig/ibex/frontend/generation.rbs +6 -0
  272. data/sig/ibex/frontend/lexer.rbs +49 -2
  273. data/sig/ibex/frontend/lexer_recovery.rbs +25 -0
  274. data/sig/ibex/frontend/parser/declarations.rbs +54 -0
  275. data/sig/ibex/frontend/parser/parameters.rbs +28 -0
  276. data/sig/ibex/frontend/parser/rules.rbs +3 -0
  277. data/sig/ibex/frontend/parser.rbs +66 -0
  278. data/sig/ibex/frontend/regenerator.rbs +11 -0
  279. data/sig/ibex/frontend/resolution.rbs +33 -0
  280. data/sig/ibex/frontend/resolver.rbs +91 -0
  281. data/sig/ibex/frontend/rule_documentation.rbs +42 -0
  282. data/sig/ibex/frontend/source_cursor.rbs +36 -3
  283. data/sig/ibex/frontend/source_document.rbs +119 -0
  284. data/sig/ibex/frontend/source_loader.rbs +66 -0
  285. data/sig/ibex/frontend/source_span.rbs +53 -0
  286. data/sig/ibex/frontend/token_adapter/declaration_document_state.rbs +21 -0
  287. data/sig/ibex/frontend/token_adapter/declaration_lexer_state.rbs +27 -0
  288. data/sig/ibex/frontend/token_adapter/declaration_state.rbs +73 -5
  289. data/sig/ibex/frontend/token_adapter/rule_state.rbs +20 -0
  290. data/sig/ibex/frontend/token_adapter.rbs +5 -2
  291. data/sig/ibex/frontend.rbs +1 -1
  292. data/sig/ibex/generation_input.rbs +37 -0
  293. data/sig/ibex/generation_manifest.rbs +67 -0
  294. data/sig/ibex/generation_transaction.rbs +82 -0
  295. data/sig/ibex/generation_transaction_recovery.rbs +36 -0
  296. data/sig/ibex/generation_transaction_validation.rbs +65 -0
  297. data/sig/ibex/grammar_tests.rbs +93 -0
  298. data/sig/ibex/ir/automaton_ir.rbs +8 -2
  299. data/sig/ibex/ir/grammar_ir.rbs +75 -15
  300. data/sig/ibex/ir/lexer_ir.rbs +57 -0
  301. data/sig/ibex/ir/migration.rbs +34 -0
  302. data/sig/ibex/ir/serialize.rbs +23 -6
  303. data/sig/ibex/ir/validator/automaton.rbs +109 -0
  304. data/sig/ibex/ir/validator/base.rbs +65 -0
  305. data/sig/ibex/ir/validator/grammar.rbs +184 -0
  306. data/sig/ibex/ir/validator/lexer.rbs +37 -0
  307. data/sig/ibex/ir/validator.rbs +16 -0
  308. data/sig/ibex/ir.rbs +38 -4
  309. data/sig/ibex/lalr/build_metrics.rbs +20 -0
  310. data/sig/ibex/lalr/builder.rbs +95 -15
  311. data/sig/ibex/lalr/conflict_search.rbs +7 -3
  312. data/sig/ibex/lalr/counterexample.rbs +5 -2
  313. data/sig/ibex/lalr/direct_lookaheads.rbs +86 -0
  314. data/sig/ibex/lalr/ielr_partition.rbs +59 -0
  315. data/sig/ibex/lalr/on_error_reductions.rbs +22 -0
  316. data/sig/ibex/lalr.rbs +6 -0
  317. data/sig/ibex/location.rbs +67 -0
  318. data/sig/ibex/lsp/document_handlers.rbs +24 -0
  319. data/sig/ibex/lsp/document_store.rbs +94 -0
  320. data/sig/ibex/lsp/document_store_diagnostics.rbs +20 -0
  321. data/sig/ibex/lsp/document_store_validation.rbs +26 -0
  322. data/sig/ibex/lsp/initialization_handlers.rbs +30 -0
  323. data/sig/ibex/lsp/navigation_handlers.rbs +30 -0
  324. data/sig/ibex/lsp/position_codec.rbs +40 -0
  325. data/sig/ibex/lsp/protocol_error.rbs +32 -0
  326. data/sig/ibex/lsp/request_handlers.rbs +26 -0
  327. data/sig/ibex/lsp/request_support.rbs +40 -0
  328. data/sig/ibex/lsp/server.rbs +55 -0
  329. data/sig/ibex/lsp/symbol_index.rbs +78 -0
  330. data/sig/ibex/lsp/symbol_index_builder.rbs +87 -0
  331. data/sig/ibex/lsp/symbol_index_precedence_references.rbs +18 -0
  332. data/sig/ibex/lsp/symbol_index_source_queries.rbs +26 -0
  333. data/sig/ibex/lsp/symbol_occurrence.rbs +25 -0
  334. data/sig/ibex/lsp/transport.rbs +35 -0
  335. data/sig/ibex/lsp/workspace.rbs +41 -0
  336. data/sig/ibex/lsp/workspace_analyzer.rbs +69 -0
  337. data/sig/ibex/lsp.rbs +7 -0
  338. data/sig/ibex/normalize/declarations.rbs +31 -0
  339. data/sig/ibex/normalize/diagnostics.rbs +9 -0
  340. data/sig/ibex/normalize/expander.rbs +20 -14
  341. data/sig/ibex/normalize/expression.rbs +10 -10
  342. data/sig/ibex/normalize/inline_expansion.rbs +120 -0
  343. data/sig/ibex/normalize/inline_validation.rbs +40 -0
  344. data/sig/ibex/normalize/lexer.rbs +37 -0
  345. data/sig/ibex/normalize/named_references.rbs +20 -0
  346. data/sig/ibex/normalize/nodes.rbs +14 -0
  347. data/sig/ibex/normalize/parameter_ebnf_lowering.rbs +32 -0
  348. data/sig/ibex/normalize/parameter_lowering.rbs +35 -0
  349. data/sig/ibex/normalize/parameter_substitution.rbs +42 -0
  350. data/sig/ibex/normalize/parameter_validation.rbs +44 -0
  351. data/sig/ibex/normalize/parameters.rbs +46 -0
  352. data/sig/ibex/normalize/recovery_declarations.rbs +24 -0
  353. data/sig/ibex/normalize.rbs +123 -18
  354. data/sig/ibex/racc_migration/checker.rbs +36 -0
  355. data/sig/ibex/racc_migration/harness.rbs +16 -0
  356. data/sig/ibex/racc_migration/report.rbs +53 -0
  357. data/sig/ibex/racc_migration.rbs +8 -0
  358. data/sig/ibex/rake_task.rbs +51 -0
  359. data/sig/ibex/samples.rbs +51 -0
  360. data/sig/ibex/table_simulation/result.rbs +32 -0
  361. data/sig/ibex/table_simulation/simulator.rbs +98 -0
  362. data/sig/ibex/table_simulation/step.rbs +40 -0
  363. data/sig/ibex/table_simulation/text.rbs +14 -0
  364. data/sig/ibex/table_simulation.rbs +7 -0
  365. data/sig/ibex/tables.rbs +0 -26
  366. data/sig/ibex/watch/runner.rbs +48 -0
  367. data/sig/ibex/watch/source_snapshot.rbs +42 -0
  368. data/sig/ibex/watch.rbs +7 -0
  369. data/sig/ibex.rbs +2 -0
  370. metadata +301 -16
  371. data/.rubocop.yml +0 -43
  372. data/CHANGELOG.md +0 -30
  373. data/Rakefile +0 -25
  374. data/Steepfile +0 -10
  375. data/docs/compat-notes.md +0 -37
  376. data/docs/lexer-coverage.md +0 -14
  377. data/docs/phase10-extensions.md +0 -27
  378. data/gemfiles/Gemfile +0 -7
  379. data/gemfiles/Gemfile.lock +0 -98
  380. data/lib/ibex/frontend/grammar.y +0 -156
  381. data/lib/ibex/runtime/parser.rb +0 -360
  382. data/lib/ibex/runtime.rb +0 -8
  383. data/sig/ibex/runtime/parser.rbs +0 -167
  384. data/sig/ibex/runtime.rbs +0 -6
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibex
4
+ module IR
5
+ module Validator
6
+ # Structural validation for the independently versioned Lexer IR.
7
+ class LexerDocument < Base
8
+ ROOT_REQUIRED = %w[
9
+ ibex_ir schema_version initial_state states rules warnings source_provenance
10
+ ].freeze #: Array[String]
11
+ RULE_REQUIRED = %w[
12
+ id state kind token pattern pattern_kind options action loc
13
+ ].freeze #: Array[String]
14
+
15
+ # @rbs (Hash[String, untyped] data, ?path: String) -> void
16
+ def initialize(data, path: "$")
17
+ super()
18
+ @data = data
19
+ @path = path
20
+ end
21
+
22
+ # @rbs () -> self
23
+ def validate
24
+ record(@data, @path, ROOT_REQUIRED)
25
+ literal(@data["ibex_ir"], "#{@path}.ibex_ir", "lexer")
26
+ literal(@data["schema_version"], "#{@path}.schema_version", LEXER_SCHEMA_VERSION)
27
+ literal(@data["initial_state"], "#{@path}.initial_state", "INITIAL")
28
+ validate_states
29
+ validate_rules
30
+ validate_warnings
31
+ validate_source_provenance
32
+ self
33
+ end
34
+
35
+ private
36
+
37
+ # @rbs () -> void
38
+ def validate_states
39
+ seen = {} #: Hash[String, bool]
40
+ values = array(@data["states"], "#{@path}.states")
41
+ invalid("#{@path}.states", "must start with INITIAL") unless values.first == "INITIAL"
42
+ values.each_with_index do |value, index|
43
+ name = nonempty_string(value, "#{@path}.states[#{index}]")
44
+ invalid("#{@path}.states[#{index}]", "duplicates state #{name.inspect}") if seen[name]
45
+ seen[name] = true
46
+ end
47
+ @states = seen
48
+ end
49
+
50
+ # @rbs () -> void
51
+ def validate_rules # rubocop:disable Metrics/AbcSize
52
+ array(@data["rules"], "#{@path}.rules").each_with_index do |value, index|
53
+ path = "#{@path}.rules[#{index}]"
54
+ rule = record(value, path, RULE_REQUIRED)
55
+ literal(rule["id"], "#{path}.id", index)
56
+ state = nonempty_string(rule["state"], "#{path}.state")
57
+ invalid("#{path}.state", "references missing state #{state.inspect}") unless @states[state]
58
+ kind = enum(rule["kind"], "#{path}.kind", %w[token skip on])
59
+ nullable_string(rule["token"], "#{path}.token")
60
+ invalid("#{path}.token", "is required for token rules") if kind == "token" && rule["token"].nil?
61
+ invalid("#{path}.token", "must be null for #{kind} rules") if kind != "token" && rule["token"]
62
+ nonempty_string(rule["pattern"], "#{path}.pattern")
63
+ enum(rule["pattern_kind"], "#{path}.pattern_kind", %w[regexp literal])
64
+ options = string(rule["options"], "#{path}.options")
65
+ invalid("#{path}.options", "may contain only i, m, and x") unless options.match?(/\A[imx]*\z/)
66
+ validate_pattern(rule, path, options)
67
+ nullable_string(rule["action"], "#{path}.action")
68
+ invalid("#{path}.action", "is required for on rules") if kind == "on" && rule["action"].nil?
69
+ location(rule["loc"], "#{path}.loc", nullable: false)
70
+ end
71
+ end
72
+
73
+ # @rbs (Hash[String, untyped] rule, String path, String options) -> void
74
+ def validate_pattern(rule, path, options)
75
+ flags = 0
76
+ flags |= Regexp::IGNORECASE if options.include?("i")
77
+ flags |= Regexp::MULTILINE if options.include?("m")
78
+ flags |= Regexp::EXTENDED if options.include?("x")
79
+ regexp = Regexp.new("\\A(?:#{rule.fetch('pattern')})", flags)
80
+ invalid("#{path}.pattern", "must not match an empty string") if regexp.match?("")
81
+ rescue RegexpError => e
82
+ invalid("#{path}.pattern", "is not a valid regular expression: #{e.message}")
83
+ end
84
+
85
+ # @rbs () -> void
86
+ def validate_warnings
87
+ array(@data["warnings"], "#{@path}.warnings").each_with_index do |value, index|
88
+ path = "#{@path}.warnings[#{index}]"
89
+ warning = record(value, path, %w[type rule loc])
90
+ literal(warning["type"], "#{path}.type", "redos")
91
+ nonnegative_integer(warning["rule"], "#{path}.rule")
92
+ location(warning["loc"], "#{path}.loc", nullable: false)
93
+ end
94
+ end
95
+
96
+ # @rbs () -> void
97
+ def validate_source_provenance
98
+ value = @data["source_provenance"]
99
+ return if value.nil?
100
+
101
+ record(value, "#{@path}.source_provenance", %w[file root byte_span])
102
+ nullable_string(value["file"], "#{@path}.source_provenance.file")
103
+ nullable_string(value["root"], "#{@path}.source_provenance.root")
104
+ return if value["byte_span"].nil?
105
+
106
+ span = record(value["byte_span"], "#{@path}.source_provenance.byte_span", %w[start end])
107
+ nonnegative_integer(span["start"], "#{@path}.source_provenance.byte_span.start")
108
+ nonnegative_integer(span["end"], "#{@path}.source_provenance.byte_span.end")
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "digest"
5
+ require_relative "validator/base"
6
+ require_relative "validator/grammar"
7
+ require_relative "validator/automaton"
8
+ require_relative "validator/lexer"
9
+
10
+ module Ibex
11
+ module IR
12
+ # Validates a serialized public IR document before constructing immutable IR objects.
13
+ module Validator
14
+ POSITION = "(ir):1:1"
15
+
16
+ # @rbs (String source) -> (Grammar | Automaton | Lexer)
17
+ def validate(source)
18
+ data = JSON.parse(source)
19
+ raise Ibex::Error, "#{POSITION}: $ must be an object" unless data.is_a?(Hash)
20
+
21
+ type = data.fetch("ibex_ir") { raise Ibex::Error, "#{POSITION}: missing ibex_ir discriminator" }
22
+ version = data["schema_version"]
23
+ supported = type == "lexer" ? SUPPORTED_LEXER_SCHEMA_VERSIONS : SUPPORTED_SCHEMA_VERSIONS
24
+ unless supported.include?(version)
25
+ expected = supported.join(", ")
26
+ raise Ibex::Error, "#{POSITION}: unsupported schema_version #{version.inspect}; expected one of #{expected}"
27
+ end
28
+
29
+ case type
30
+ when "grammar" then GrammarDocument.new(data, version: version).validate
31
+ when "automaton" then AutomatonDocument.new(data, version: version).validate
32
+ when "lexer" then LexerDocument.new(data).validate
33
+ else raise Ibex::Error, "#{POSITION}: unsupported IR type #{type.inspect}"
34
+ end
35
+ value = Serialize.load(source)
36
+ validate_automaton_digest(value) if value.is_a?(Automaton)
37
+ value
38
+ rescue JSON::ParserError => e
39
+ raise Ibex::Error, "#{POSITION}: invalid JSON: #{e.message}"
40
+ rescue Ibex::Error
41
+ raise
42
+ rescue KeyError, NoMethodError, TypeError, ArgumentError => e
43
+ raise Ibex::Error, "#{POSITION}: invalid IR structure: #{e.message}"
44
+ end
45
+ module_function :validate
46
+
47
+ # @rbs (Automaton automaton) -> void
48
+ def validate_automaton_digest(automaton)
49
+ expected = "sha256:#{Digest::SHA256.hexdigest(Serialize.dump(automaton.grammar))}"
50
+ return if automaton.grammar_digest == expected
51
+
52
+ raise Ibex::Error,
53
+ "#{POSITION}: $.grammar_digest does not match the embedded grammar; expected #{expected.inspect}"
54
+ end
55
+ module_function :validate_automaton_digest
56
+
57
+ class << self
58
+ private :validate_automaton_digest
59
+ end
60
+ end
61
+ end
62
+ end
data/lib/ibex/ir.rb CHANGED
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "ir/grammar_ir"
4
+ require_relative "ir/lexer_ir"
5
+ require_relative "ir/migration"
4
6
  require_relative "ir/automaton_ir"
5
7
  require_relative "ir/serialize"
8
+ require_relative "ir/validator"
6
9
 
7
10
  module Ibex
8
11
  module IR
@@ -11,8 +14,52 @@ module Ibex
11
14
  # type location = { file: String, line: Integer, column: Integer }
12
15
  # type precedence = { associativity: Symbol, level: Integer }
13
16
  # type named_ref = { name: String, index: Integer }
17
+ # type byte_span = { start: Integer, end: Integer }
18
+ # type source_provenance = { file: String?, root: String?, byte_span: byte_span? }
19
+ # type parser_parameter = { name: String, semantic_type: String? }
20
+ # type value_printer = { symbol: String, code: String, loc: location }
21
+ # type recovery_policy = {
22
+ # sync_tokens: Array[String],
23
+ # on_error_reduce: Array[Array[String]]
24
+ # }
25
+ # type grammar_test = { expectation: :accept | :reject, source: String, loc: location }
26
+ # type node_annotation = { name: String, fields: Array[String], loc: location }
27
+ # type lexer_warning = { type: :redos, rule: Integer, loc: location }
28
+ # type parameter_expansion = { rule: String, arguments: Array[String] }
29
+ # type inline_expansion = { rule: String }
30
+ # type production_expansion = {
31
+ # parameter: parameter_expansion?,
32
+ # inline: inline_expansion?,
33
+ # include_chain: Array[source_provenance]
34
+ # }
35
+ # type action_fragment = { kind: :rule | :inline, source: source_provenance? }
36
+ # type action_composition_step = {
37
+ # kind: :rule | :inline,
38
+ # rule: String?,
39
+ # code: String?,
40
+ # loc: location,
41
+ # named_refs: Array[named_ref],
42
+ # context_length: Integer,
43
+ # inputs: Array[Integer],
44
+ # stack_inputs: Array[Integer],
45
+ # lookahead: Integer?,
46
+ # result_var: bool,
47
+ # result_type: String?
48
+ # }
49
+ # type action_composition_plan = {
50
+ # version: Integer,
51
+ # physical: Integer,
52
+ # steps: Array[action_composition_step]
53
+ # }
54
+ # type action_composition = {
55
+ # strategy: String,
56
+ # fragments: Array[action_fragment],
57
+ # ?plan: action_composition_plan
58
+ # }
59
+ # type migration_metadata = { from_schema_version: Integer, unavailable: Array[String] }
14
60
  # type user_code_chunks = Hash[String, Array[UserCodeChunk]]
15
- # type grammar_options = { result_var: bool, omit_action_call: bool }
61
+ # type grammar_options = { result_var: bool, omit_action_call: bool, ?cst: bool }
62
+ # type grammar_mode = :default | :extended
16
63
  # type grammar_warning = {
17
64
  # type: Symbol,
18
65
  # ?symbol: String,
@@ -28,16 +75,22 @@ module Ibex
28
75
  # type runtime_action = [:shift, Integer] | [:reduce, Integer] | [:accept] | [:error]
29
76
  # type conflict_resolution = { by: Symbol, chose: Symbol | Integer, ?associativity: Symbol }
30
77
  # type shift_reduce_conflict =
31
- # { type: :shift_reduce, symbol: String, shift_to: Integer, reduce: Integer, resolution: conflict_resolution }
78
+ # { type: :shift_reduce, symbol: String, shift_to: Integer, reduce: Integer,
79
+ # resolution: conflict_resolution, ?midrule_origins: Array[location],
80
+ # ?entries: Array[String], ?composite: bool }
32
81
  # type reduce_reduce_conflict =
33
- # { type: :reduce_reduce, symbol: String, reductions: Array[Integer], resolution: conflict_resolution }
82
+ # { type: :reduce_reduce, symbol: String, reductions: Array[Integer],
83
+ # resolution: conflict_resolution, ?midrule_origins: Array[location],
84
+ # ?entries: Array[String], ?composite: bool }
34
85
  # type conflict = shift_reduce_conflict | reduce_reduce_conflict
35
86
  # type conflict_summary = {
36
87
  # sr: Integer,
37
88
  # resolved_sr: Integer,
38
89
  # rr: Integer,
39
90
  # expected_sr: Integer,
40
- # expectation_met: bool
91
+ # expectation_met: bool,
92
+ # ?expected_rr: Integer,
93
+ # ?rr_expectation_met: bool
41
94
  # }
42
95
  # type interpretation = Hash[Symbol, untyped]
43
96
  # type counterexample = {
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibex
4
+ module LALR
5
+ # Immutable structural measurements from one automaton build. These counts
6
+ # are intended for diagnostics and benchmarks, not parser behavior.
7
+ class BuildMetrics
8
+ attr_reader :construction_states #: Integer
9
+ attr_reader :canonical_states #: Integer?
10
+ attr_reader :final_states #: Integer
11
+ attr_reader :strategy #: Symbol
12
+
13
+ # @rbs (construction_states: Integer, canonical_states: Integer?, final_states: Integer, strategy: Symbol) -> void
14
+ def initialize(construction_states:, canonical_states:, final_states:, strategy:)
15
+ @construction_states = construction_states
16
+ @canonical_states = canonical_states
17
+ @final_states = final_states
18
+ @strategy = strategy
19
+ freeze
20
+ end
21
+ end
22
+ end
23
+ end