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
@@ -3,11 +3,24 @@
3
3
  module Ibex
4
4
  module Frontend
5
5
  # Tokenizes a racc-compatible grammar while preserving source locations.
6
+ # rubocop:disable Metrics/ClassLength -- token scanners stay together to preserve cursor invariants.
6
7
  class Lexer
7
8
  PUNCTUATION: Hash[String, Symbol]
8
9
 
9
10
  USER_CODE: Regexp
10
11
 
12
+ NODE_DIRECTIVE: Regexp
13
+
14
+ PERCENT_DIRECTIVES: Hash[String, [ Symbol, String ]]
15
+
16
+ @active_token_start: SourcePosition?
17
+
18
+ @eof_token: Token?
19
+
20
+ @emitted_tokens: Array[Token]
21
+
22
+ @segments: Array[Segment]
23
+
11
24
  @cursor: SourceCursor
12
25
 
13
26
  # @rbs (String source, ?file: String) -> void
@@ -16,17 +29,35 @@ module Ibex
16
29
  # @rbs () -> Array[Token]
17
30
  def tokenize: () -> Array[Token]
18
31
 
32
+ # @rbs () -> SourceDocument
33
+ def tokenize_document: () -> SourceDocument
34
+
19
35
  # @rbs () -> Token
20
36
  def next_token: () -> Token
21
37
 
22
38
  private
23
39
 
40
+ # @rbs () -> Token
41
+ def scan_from_cursor: () -> Token
42
+
24
43
  # @rbs (String character) -> Token
25
44
  def scan_regular_token: (String character) -> Token
26
45
 
27
46
  # @rbs () -> void
28
47
  def skip_ignored: () -> void
29
48
 
49
+ # @rbs () -> void
50
+ def scan_whitespace: () -> void
51
+
52
+ # @rbs () -> bool
53
+ def newline?: () -> bool
54
+
55
+ # @rbs () -> void
56
+ def scan_newline: () -> void
57
+
58
+ # @rbs () -> void
59
+ def scan_line_comment: () -> void
60
+
30
61
  # @rbs () -> void
31
62
  def skip_block_comment: () -> void
32
63
 
@@ -39,6 +70,12 @@ module Ibex
39
70
  # @rbs () -> Token
40
71
  def scan_scope: () -> Token
41
72
 
73
+ # @rbs () -> Token
74
+ def scan_percent_directive: () -> Token
75
+
76
+ # @rbs () -> Token
77
+ def scan_node_directive: () -> Token
78
+
42
79
  # @rbs () -> Token
43
80
  def scan_identifier: () -> Token
44
81
 
@@ -48,14 +85,24 @@ module Ibex
48
85
  # @rbs () -> Token
49
86
  def scan_literal: () -> Token
50
87
 
88
+ # @rbs () -> Token
89
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
90
+ def scan_regexp: () -> Token
91
+
51
92
  # @rbs () -> Token
52
93
  def scan_punctuation: () -> Token
53
94
 
54
95
  # @rbs (Symbol type, Regexp pattern) ?{ (String) -> token_value } -> Token
55
96
  def scan_match: (Symbol type, Regexp pattern) ?{ (String) -> token_value } -> Token
56
97
 
57
- # @rbs (Symbol type, token_value value, ?Location location) -> Token
58
- def token: (Symbol type, token_value value, ?Location location) -> Token
98
+ # @rbs (Symbol type, token_value value, ?Location location, ?SourceSpan? span) -> Token
99
+ def token: (Symbol type, token_value value, ?Location location, ?SourceSpan? span) -> Token
100
+
101
+ # @rbs (Token token, SourcePosition start) -> void
102
+ def emit_token: (Token token, SourcePosition start) -> void
103
+
104
+ # @rbs (Symbol kind, SourcePosition start, ?token_type: Symbol?, ?token_index: Integer?) -> void
105
+ def emit_segment: (Symbol kind, SourcePosition start, ?token_type: Symbol?, ?token_index: Integer?) -> void
59
106
  end
60
107
  end
61
108
  end
@@ -0,0 +1,25 @@
1
+ # Generated from lib/ibex/frontend/lexer_recovery.rb with RBS::Inline
2
+
3
+ module Ibex
4
+ module Frontend
5
+ class Lexer
6
+ # Recover lexical failures while retaining every source byte.
7
+ # @rbs (?max_diagnostics: Integer) -> [SourceDocument, Array[Diagnostic]]
8
+ def tokenize_document_recovering: (?max_diagnostics: Integer) -> [ SourceDocument, Array[Diagnostic] ]
9
+
10
+ private
11
+
12
+ # @rbs (Exception error, capture: bool) -> Diagnostic?
13
+ def recover_lexical_error: (Exception error, capture: bool) -> Diagnostic?
14
+
15
+ # @rbs (Exception error, SourcePosition fallback) -> [Location, String]
16
+ def lexical_error_details: (Exception error, SourcePosition fallback) -> [ Location, String ]
17
+
18
+ # @rbs (SourcePosition start) -> void
19
+ def emit_invalid_segment: (SourcePosition start) -> void
20
+
21
+ # @rbs (Exception error, SourcePosition start) -> void
22
+ def advance_after_lexical_error: (Exception error, SourcePosition start) -> void
23
+ end
24
+ end
25
+ end
@@ -3,6 +3,8 @@
3
3
  module Ibex
4
4
  module Frontend
5
5
  # Parses the declaration section of a grammar.
6
+ # rubocop:disable Metrics/ModuleLength, Metrics/CyclomaticComplexity
7
+ # Bootstrap declarations intentionally mirror the generated frontend's complete declaration vocabulary.
6
8
  module BootstrapParserDeclarations
7
9
  DECLARATIONS: Array[String]
8
10
 
@@ -19,6 +21,9 @@ module Ibex
19
21
  # @rbs () -> AST::declaration
20
22
  def parse_declaration: () -> AST::declaration
21
23
 
24
+ # @rbs () -> AST::Include
25
+ def parse_import: () -> AST::Include
26
+
22
27
  # @rbs () -> AST::Tokens
23
28
  def parse_tokens: () -> AST::Tokens
24
29
 
@@ -34,18 +39,67 @@ module Ibex
34
39
  # @rbs () -> AST::Expect
35
40
  def parse_expect: () -> AST::Expect
36
41
 
42
+ # @rbs () -> AST::ExpectRR
43
+ def parse_expect_rr: () -> AST::ExpectRR
44
+
45
+ # @rbs () -> AST::Parameter
46
+ def parse_parameter: () -> AST::Parameter
47
+
48
+ # @rbs () -> AST::Printer
49
+ def parse_printer: () -> AST::Printer
50
+
37
51
  # @rbs () -> AST::Start
38
52
  def parse_start: () -> AST::Start
39
53
 
54
+ # @rbs () -> AST::Recovery
55
+ def parse_recovery: () -> AST::Recovery
56
+
57
+ # @rbs () -> AST::OnErrorReduce
58
+ def parse_on_error_reduce: () -> AST::OnErrorReduce
59
+
60
+ # @rbs () -> AST::GrammarTest
61
+ def parse_grammar_test: () -> AST::GrammarTest
62
+
63
+ # @rbs () -> AST::Lexer
64
+ def parse_lexer: () -> AST::Lexer
65
+
66
+ # @rbs () -> Array[AST::lexer_entry]
67
+ def parse_lexer_entries: () -> Array[AST::lexer_entry]
68
+
69
+ # @rbs () -> AST::lexer_entry
70
+ def parse_lexer_entry: () -> AST::lexer_entry
71
+
72
+ # @rbs () -> AST::LexerState
73
+ def parse_lexer_state: () -> AST::LexerState
74
+
75
+ # @rbs () -> Token
76
+ def expect_lexer_pattern: () -> Token
77
+
78
+ # @rbs (Symbol kind, Token marker, Token pattern, Token? action) -> AST::LexerRule
79
+ def build_bootstrap_lexer_rule: (Symbol kind, Token marker, Token pattern, Token? action) -> AST::LexerRule
80
+
40
81
  # @rbs () -> AST::Convert
41
82
  def parse_convert: () -> AST::Convert
42
83
 
84
+ # @rbs (singleton(AST::DisplayName) | singleton(AST::SemanticType) node_class, String feature) ->
85
+ # (AST::DisplayName | AST::SemanticType)
86
+ def parse_symbol_metadata: (singleton(AST::DisplayName) | singleton(AST::SemanticType) node_class, String feature) -> (AST::DisplayName | AST::SemanticType)
87
+
88
+ # @rbs () -> Token
89
+ def expect_metadata_value: () -> Token
90
+
43
91
  # @rbs (Integer line) -> Array[Token]
44
92
  def tokens_on_line: (Integer line) -> Array[Token]
45
93
 
46
94
  # @rbs (Array[Token] tokens, Location location) -> String
47
95
  def decode_conversion: (Array[Token] tokens, Location location) -> String
48
96
 
97
+ # @rbs (Token keyword, Token name, Token value, String feature) -> void
98
+ def validate_metadata_line: (Token keyword, Token name, Token value, String feature) -> void
99
+
100
+ # @rbs (Token token, String feature) -> String
101
+ def decode_quoted_literal: (Token token, String feature) -> String
102
+
49
103
  # @rbs () -> bool
50
104
  def declaration_start?: () -> bool
51
105
 
@@ -0,0 +1,28 @@
1
+ # Generated from lib/ibex/frontend/parser/parameters.rb with RBS::Inline
2
+
3
+ module Ibex
4
+ module Frontend
5
+ # Parses extended-mode parameter lists and parameterized references during bootstrap.
6
+ module BootstrapParserParameters
7
+ private
8
+
9
+ # @rbs (Token lhs) -> Array[String]
10
+ def parse_rule_parameters: (Token lhs) -> Array[String]
11
+
12
+ # @rbs () -> AST::item
13
+ def parse_parameterized_reference: () -> AST::item
14
+
15
+ # @rbs () -> bool
16
+ def parameterized_call?: () -> bool
17
+
18
+ # @rbs () -> bool
19
+ def parameterized_rule_start?: () -> bool
20
+
21
+ # @rbs (Array[Token] tail) -> bool
22
+ def parameter_definition_tail?: (Array[Token] tail) -> bool
23
+
24
+ # @rbs (Token left, Token right) -> bool
25
+ def adjacent_tokens?: (Token left, Token right) -> bool
26
+ end
27
+ end
28
+ end
@@ -17,6 +17,9 @@ module Ibex
17
17
  # @rbs (Token lhs) -> AST::Alternative
18
18
  def parse_alternative: (Token lhs) -> AST::Alternative
19
19
 
20
+ # @rbs () -> AST::NodeAnnotation?
21
+ def parse_node_annotation: () -> AST::NodeAnnotation?
22
+
20
23
  # @rbs () -> AST::item
21
24
  def parse_item: () -> AST::item
22
25
 
@@ -4,13 +4,79 @@ module Ibex
4
4
  module Frontend
5
5
  # Public grammar parser backed by Ibex's generated LR frontend.
6
6
  class Parser
7
+ DEFAULT_MAX_DIAGNOSTICS: Integer
8
+
9
+ STRICT_LEXICAL_DIAGNOSTIC_LIMIT: Integer
10
+
7
11
  attr_reader implementation: GeneratedParser
8
12
 
13
+ @lexical_diagnostics: Array[Diagnostic]
14
+
15
+ @mode: Symbol
16
+
17
+ @tokens: Array[Token]
18
+
19
+ @source_document_error_message: String?
20
+
21
+ @parse_error_message: String?
22
+
23
+ @parsed_node: AST::Root | AST::Fragment | nil
24
+
25
+ @parsed_document: SourceDocument?
26
+
27
+ @source_document: SourceDocument?
28
+
9
29
  # @rbs (String | Array[Token] source, ?file: String, ?mode: Symbol) -> void
10
30
  def initialize: (String | Array[Token] source, ?file: String, ?mode: Symbol) -> void
11
31
 
12
32
  # @rbs () -> AST::Root
13
33
  def parse: () -> AST::Root
34
+
35
+ # Parse an explicit fragment without resolving its includes.
36
+ # @rbs () -> AST::Fragment
37
+ def parse_fragment: () -> AST::Fragment
38
+
39
+ # Parse the grammar and return its lossless source model.
40
+ # @rbs () -> SourceDocument
41
+ def parse_document: () -> SourceDocument
42
+
43
+ # Parse either a root grammar or an explicit fragment and return its lossless source model.
44
+ # @rbs () -> SourceDocument
45
+ def parse_source_document: () -> SourceDocument
46
+
47
+ # Parse with conservative boundary recovery and collect multiple errors.
48
+ # @rbs (?max_diagnostics: Integer) -> ParseResult
49
+ def parse_with_diagnostics: (?max_diagnostics: Integer) -> ParseResult
50
+
51
+ private
52
+
53
+ # @rbs () -> SourceDocument
54
+ def source_document!: () -> SourceDocument
55
+
56
+ # @rbs () -> (AST::Root | AST::Fragment)
57
+ def parse_node: () -> (AST::Root | AST::Fragment)
58
+
59
+ # @rbs (AST::Root | AST::Fragment node) -> (AST::Root | AST::Fragment)
60
+ def enrich_rule_documentation: (AST::Root | AST::Fragment node) -> (AST::Root | AST::Fragment)
61
+
62
+ # @rbs (AST::Root | AST::Fragment | nil node, Array[Diagnostic] diagnostics) ->
63
+ # [AST::Root?, Array[Diagnostic]]
64
+ def root_diagnostic_result: (AST::Root | AST::Fragment | nil node, Array[Diagnostic] diagnostics) -> [ AST::Root?, Array[Diagnostic] ]
65
+
66
+ # @rbs (String source, String file) -> Array[Token]
67
+ def tokenize_source: (String source, String file) -> Array[Token]
68
+
69
+ # @rbs (Integer max_diagnostics) -> Array[Diagnostic]
70
+ def lexical_diagnostics_for: (Integer max_diagnostics) -> Array[Diagnostic]
71
+
72
+ # @rbs (Array[Diagnostic] lexical, Array[Diagnostic] syntax, Integer limit) -> Array[Diagnostic]
73
+ def merge_diagnostics: (Array[Diagnostic] lexical, Array[Diagnostic] syntax, Integer limit) -> Array[Diagnostic]
74
+
75
+ # @rbs (Diagnostic diagnostic) -> [String, String, Integer, Integer, String]
76
+ def diagnostic_key: (Diagnostic diagnostic) -> [ String, String, Integer, Integer, String ]
77
+
78
+ # @rbs (Diagnostic diagnostic) -> [String, Integer, Integer, String, String]
79
+ def diagnostic_sort_key: (Diagnostic diagnostic) -> [ String, Integer, Integer, String, String ]
14
80
  end
15
81
  end
16
82
  end
@@ -6,11 +6,22 @@ module Ibex
6
6
  module Regenerator
7
7
  GRAMMAR_PATH: String
8
8
 
9
+ SHADOW_GRAMMAR_PATH: String
10
+
9
11
  # @rbs () -> String
10
12
  def self?.generate: () -> String
11
13
 
14
+ # Build the non-published parameterized/inline grammar used to verify
15
+ # that preview composition features can describe the production
16
+ # frontend without changing its observable AST.
17
+ # @rbs () -> String
18
+ def self?.generate_shadow: () -> String
19
+
12
20
  # @rbs () -> String
13
21
  def self?.relative_grammar_path: () -> String
22
+
23
+ # @rbs () -> String
24
+ def self?.relative_shadow_grammar_path: () -> String
14
25
  end
15
26
  end
16
27
  end
@@ -0,0 +1,33 @@
1
+ # Generated from lib/ibex/frontend/resolution.rb with RBS::Inline
2
+
3
+ module Ibex
4
+ module Frontend
5
+ # Immutable result of resolving one root grammar and its fragment closure.
6
+ class Resolution
7
+ EMPTY_CHAIN: Array[IR::source_provenance]
8
+
9
+ attr_reader root: AST::Root
10
+
11
+ attr_reader root_path: String
12
+
13
+ attr_reader root_directory: String
14
+
15
+ attr_reader files: Array[String]
16
+
17
+ # @rbs (root: AST::Root, root_path: String, root_directory: String, files: Array[String],
18
+ # include_chains: Hash[AST::Rule, Array[IR::source_provenance]]) -> void
19
+ def initialize: (root: AST::Root, root_path: String, root_directory: String, files: Array[String], include_chains: Hash[AST::Rule, Array[IR::source_provenance]]) -> void
20
+
21
+ # @rbs (AST::Rule rule) -> Array[IR::source_provenance]
22
+ def include_chain_for: (AST::Rule rule) -> Array[IR::source_provenance]
23
+
24
+ private
25
+
26
+ # @rbs (untyped value) -> untyped
27
+ def deep_freeze_ast: (untyped value) -> untyped
28
+
29
+ # @rbs (IR::source_provenance entry) -> IR::source_provenance
30
+ def copy_provenance: (IR::source_provenance entry) -> IR::source_provenance
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,91 @@
1
+ # Generated from lib/ibex/frontend/resolver.rb with RBS::Inline
2
+
3
+ module Ibex
4
+ module Frontend
5
+ # An actual filesystem read failure while resolving a grammar closure.
6
+ class ResolutionIOError < Ibex::Error
7
+ end
8
+
9
+ # Loads an explicit root grammar and resolves its extended-mode fragment graph.
10
+ class Resolver
11
+ GLOB_CHARACTERS: Regexp
12
+
13
+ WINDOWS_ABSOLUTE: Regexp
14
+
15
+ @attempted_paths: Array[String]
16
+
17
+ @include_chains: Hash[AST::Rule, Array[IR::source_provenance]]
18
+
19
+ @loaded: Hash[String, bool]
20
+
21
+ @visiting: Array[String]
22
+
23
+ @files: Array[String]
24
+
25
+ @root_directory: String
26
+
27
+ @root_path: String
28
+
29
+ @loader: SourceLoader
30
+
31
+ @mode: Symbol
32
+
33
+ @input_path: String
34
+
35
+ attr_reader attempted_paths: Array[String]
36
+
37
+ # @rbs (String path, ?mode: Symbol, ?loader: SourceLoader) -> void
38
+ def initialize: (String path, ?mode: Symbol, ?loader: SourceLoader) -> void
39
+
40
+ # @rbs () -> Resolution
41
+ def resolve: () -> Resolution
42
+
43
+ # @rbs () -> Array[String]
44
+ def dependencies: () -> Array[String]
45
+
46
+ # Source bytes actually consumed by the parser, in resolution order.
47
+ # @rbs () -> Array[GenerationInput]
48
+ def source_records: () -> Array[GenerationInput]
49
+
50
+ private
51
+
52
+ # @rbs () -> void
53
+ def prepare_resolution: () -> void
54
+
55
+ # @rbs () -> String
56
+ def canonical_root: () -> String
57
+
58
+ # @rbs (String path) -> AST::Root
59
+ def parse_root: (String path) -> AST::Root
60
+
61
+ # @rbs (String path) -> AST::Fragment
62
+ def parse_fragment: (String path) -> AST::Fragment
63
+
64
+ # @rbs (AST::Root | AST::Fragment node, Array[IR::source_provenance] chain) ->
65
+ # [Array[AST::declaration], Array[AST::Rule]]
66
+ def expand_node: (AST::Root | AST::Fragment node, Array[IR::source_provenance] chain) -> [ Array[AST::declaration], Array[AST::Rule] ]
67
+
68
+ # @rbs (AST::Include include_node, Array[IR::source_provenance] chain) ->
69
+ # [Array[AST::declaration], Array[AST::Rule]]
70
+ def expand_include: (AST::Include include_node, Array[IR::source_provenance] chain) -> [ Array[AST::declaration], Array[AST::Rule] ]
71
+
72
+ # @rbs (AST::Include include_node) -> String
73
+ def canonical_include: (AST::Include include_node) -> String
74
+
75
+ # @rbs (AST::Include include_node) -> void
76
+ def validate_include_path: (AST::Include include_node) -> void
77
+
78
+ # @rbs (String path) -> bool
79
+ def inside_root?: (String path) -> bool
80
+
81
+ # @rbs (AST::Include include_node, String target) -> void
82
+ def reject_cycle: (AST::Include include_node, String target) -> void
83
+
84
+ # @rbs (String file) -> IR::source_provenance
85
+ def source_provenance: (String file) -> IR::source_provenance
86
+
87
+ # @rbs (AST::Include include_node, String message) -> bot
88
+ def fail_include: (AST::Include include_node, String message) -> bot
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,42 @@
1
+ # Generated from lib/ibex/frontend/rule_documentation.rb with RBS::Inline
2
+
3
+ module Ibex
4
+ module Frontend
5
+ # Attaches immediately preceding lossless line-comment blocks to parsed rules.
6
+ class RuleDocumentation
7
+ EMPTY_SEGMENTS: Array[Segment]
8
+
9
+ # @rbs (AST::Root | AST::Fragment node, SourceDocument document) -> (AST::Root | AST::Fragment)
10
+ def self.enrich: (AST::Root | AST::Fragment node, SourceDocument document) -> (AST::Root | AST::Fragment)
11
+
12
+ # @rbs (SourceDocument document) -> void
13
+ def initialize: (SourceDocument document) -> void
14
+
15
+ # @rbs (AST::Root | AST::Fragment node) -> (AST::Root | AST::Fragment)
16
+ def enrich: (AST::Root | AST::Fragment node) -> (AST::Root | AST::Fragment)
17
+
18
+ private
19
+
20
+ # @rbs (AST::Rule rule) -> AST::Rule
21
+ def documented_rule: (AST::Rule rule) -> AST::Rule
22
+
23
+ # @rbs (AST::Rule rule) -> Integer
24
+ def documentation_anchor: (AST::Rule rule) -> Integer
25
+
26
+ # @rbs (Integer rule_line) -> String?
27
+ def documentation_before: (Integer rule_line) -> String?
28
+
29
+ # @rbs (Integer line) -> String?
30
+ def documentation_line: (Integer line) -> String?
31
+
32
+ # @rbs (Segment segment, Segment comment) -> bool
33
+ def documentation_line_segment?: (Segment segment, Segment comment) -> bool
34
+
35
+ # @rbs (SourceDocument document) -> Hash[Integer, Array[Segment]]
36
+ def index_segments: (SourceDocument document) -> Hash[Integer, Array[Segment]]
37
+
38
+ # @rbs (Segment segment) -> Array[Integer]
39
+ def covered_lines: (Segment segment) -> Array[Integer]
40
+ end
41
+ end
42
+ end
@@ -23,15 +23,17 @@ module Ibex
23
23
  end
24
24
 
25
25
  # A grammar token and its source coordinate.
26
- class Token < Struct[Symbol | token_value | Location]
26
+ class Token < Struct[Symbol | token_value | Location | SourceSpan?]
27
27
  attr_accessor type(): Symbol
28
28
 
29
29
  attr_accessor value(): token_value
30
30
 
31
31
  attr_accessor location(): Location
32
32
 
33
- def self.new: (?type: Symbol, ?value: token_value, ?location: Location) -> instance
34
- | ({ ?type: Symbol, ?value: token_value, ?location: Location }) -> instance
33
+ attr_accessor span(): SourceSpan?
34
+
35
+ def self.new: (?type: Symbol, ?value: token_value, ?location: Location, ?span: SourceSpan?) -> instance
36
+ | ({ ?type: Symbol, ?value: token_value, ?location: Location, ?span: SourceSpan? }) -> instance
35
37
  end
36
38
 
37
39
  class Token
@@ -47,6 +49,8 @@ module Ibex
47
49
 
48
50
  attr_reader index: Integer
49
51
 
52
+ attr_reader byte_offset: Integer
53
+
50
54
  attr_reader line: Integer
51
55
 
52
56
  attr_reader column: Integer
@@ -66,8 +70,37 @@ module Ibex
66
70
  # @rbs () -> Location
67
71
  def location: () -> Location
68
72
 
73
+ # @rbs () -> SourcePosition
74
+ def position: () -> SourcePosition
75
+
76
+ # @rbs (SourcePosition start) -> SourceSpan
77
+ def span_from: (SourcePosition start) -> SourceSpan
78
+
69
79
  # @rbs (?Integer count) -> void
70
80
  def advance: (?Integer count) -> void
81
+
82
+ private
83
+
84
+ # @rbs (Integer count) -> void
85
+ def advance_ascii: (Integer count) -> void
86
+
87
+ # @rbs (Integer count) -> void
88
+ def advance_utf8: (Integer count) -> void
89
+
90
+ # @rbs (Integer character_index) -> Integer
91
+ def byte_offset_for_character: (Integer character_index) -> Integer
92
+
93
+ # @rbs (Integer byte_offset, Integer from_index, Integer to_index) -> Integer
94
+ def walk_to_character: (Integer byte_offset, Integer from_index, Integer to_index) -> Integer
95
+
96
+ # @rbs (Integer byte_offset) -> Integer
97
+ def previous_character_byte_offset: (Integer byte_offset) -> Integer
98
+
99
+ # @rbs (Integer byte_offset) -> Integer
100
+ def utf8_character_width: (Integer byte_offset) -> Integer
101
+
102
+ # @rbs (Integer byte) -> bool
103
+ def continuation_byte?: (Integer byte) -> bool
71
104
  end
72
105
  end
73
106
  end