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,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibex
4
+ module Frontend
5
+ class TokenAdapter
6
+ # Context transitions for the extended root-only lexer declaration.
7
+ module DeclarationLexerState
8
+ private
9
+
10
+ # @rbs () -> bool
11
+ def lexer_declaration_state?
12
+ @declaration == :lexer
13
+ end
14
+
15
+ # @rbs (Token token) -> external_token
16
+ def classify_lexer_identifier(token)
17
+ # @type self: DeclarationState
18
+ case @state
19
+ when :lexer_entries, :lexer_action_or_entry then begin_lexer_entry(token)
20
+ when :lexer_state_name
21
+ @state = :lexer_state_do
22
+ :IDENTIFIER
23
+ when :lexer_state_do
24
+ value = string_value(token)
25
+ raise Ibex::Error, "#{token.location}: expected do, got #{value}" unless value == "do"
26
+
27
+ @lexer_state_depth = (@lexer_state_depth || 0) + 1
28
+ @state = :lexer_entries
29
+ :DO
30
+ else
31
+ :IDENTIFIER
32
+ end
33
+ end
34
+
35
+ # @rbs (Token token) -> external_token
36
+ def begin_lexer_entry(token)
37
+ # @type self: DeclarationState
38
+ value = string_value(token)
39
+ case value
40
+ when "end" then finish_lexer_scope
41
+ when "state"
42
+ @state = :lexer_state_name
43
+ :STATE
44
+ when "skip"
45
+ @state = :lexer_pattern
46
+ :SKIP
47
+ when "on"
48
+ @state = :lexer_pattern
49
+ :ON
50
+ else
51
+ @state = :lexer_pattern
52
+ :IDENTIFIER
53
+ end
54
+ end
55
+
56
+ # @rbs () -> external_token
57
+ def finish_lexer_scope
58
+ depth = @lexer_state_depth || 0
59
+ if depth.positive?
60
+ @lexer_state_depth = depth - 1
61
+ @state = :lexer_entries
62
+ else
63
+ @state = :declaration
64
+ @declaration = nil
65
+ end
66
+ :END
67
+ end
68
+
69
+ # @rbs (external_token type) -> external_token?
70
+ def classify_lexer_scalar(type)
71
+ if @state == :lexer_pattern && %i[REGEXP LITERAL].include?(type)
72
+ @state = :lexer_action_or_entry
73
+ return type
74
+ end
75
+ return unless @state == :lexer_action_or_entry && type == :ACTION
76
+
77
+ @state = :lexer_entries
78
+ type
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -1,25 +1,55 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "declaration_lexer_state"
4
+
3
5
  module Ibex
4
6
  module Frontend
5
7
  class TokenAdapter
6
8
  # Classifies tokens through the class header and declaration section.
9
+ # rubocop:disable Metrics/ClassLength, Metrics/CyclomaticComplexity
10
+ # One state machine owns declaration-boundary classification.
7
11
  class DeclarationState
12
+ include DeclarationDocumentState
13
+ include DeclarationLexerState
14
+
8
15
  DECLARATIONS = {
16
+ "include" => %i[INCLUDE include_path],
17
+ "import" => %i[IMPORT include_path],
9
18
  "token" => %i[TOKEN token_symbols], "options" => %i[OPTIONS options_identifiers],
10
- "expect" => %i[EXPECT expect_integer], "start" => %i[START start_symbol],
19
+ "expect" => %i[EXPECT expect_integer], "start" => %i[START start_first_symbol],
20
+ "expect_rr" => %i[EXPECT_RR expect_rr_integer],
21
+ "recover" => %i[RECOVER recover_kind],
22
+ "on_error_reduce" => %i[ON_ERROR_REDUCE on_error_reduce_first_symbol],
23
+ "test" => %i[TEST test_expectation],
24
+ "lexer" => %i[LEXER lexer_entries],
11
25
  "convert" => %i[CONVERT convert_name], "pragma" => %i[PRAGMA pragma_value],
26
+ "display" => %i[DISPLAY display_symbol], "type" => %i[TYPE type_symbol],
27
+ "param" => %i[PARAM param_name],
28
+ "printer" => %i[PRINTER printer_symbol],
12
29
  "rule" => %i[RULE rules]
13
30
  }.freeze #: Hash[String, [external_token, Symbol]]
14
31
  ASSOCIATIONS = {
15
- "left" => :LEFT, "right" => :RIGHT, "nonassoc" => :NONASSOC
32
+ "left" => :LEFT, "right" => :RIGHT, "nonassoc" => :NONASSOC, "precedence" => :PRECEDENCE
16
33
  }.freeze #: Hash[String, external_token]
17
34
  SCALAR_TYPES = {
18
- literal: :LITERAL, integer: :INTEGER, action: :ACTION, user_code: :USER_CODE
35
+ literal: :LITERAL, regexp: :REGEXP, integer: :INTEGER, action: :ACTION, user_code: :USER_CODE
19
36
  }.freeze #: Hash[Symbol, external_token]
20
37
  EXPECTATIONS = {
21
38
  class_keyword: "class", class_name: "identifier", superclass_name: "identifier",
22
- expect_integer: "integer", start_symbol: "a grammar symbol"
39
+ expect_integer: "integer", expect_rr_integer: "integer",
40
+ start_first_symbol: "a grammar symbol", start_symbols: "a grammar symbol",
41
+ include_path: "a double-quoted relative path",
42
+ display_symbol: "a grammar symbol", type_symbol: "a grammar symbol",
43
+ display_value: "a quoted string", type_value: "a quoted string",
44
+ param_name: "an identifier", param_type: "a quoted type or declaration",
45
+ printer_symbol: "a grammar symbol", printer_action: "an action",
46
+ recover_kind: "sync", recovery_colon: ":", recovery_first_symbol: "a grammar symbol",
47
+ recovery_symbols: "a grammar symbol", on_error_reduce_first_symbol: "a grammar symbol",
48
+ on_error_reduce_symbols: "a grammar symbol", test_expectation: "accept or reject",
49
+ test_source: "a double-quoted string",
50
+ lexer_entries: "a lexer rule, state, or end", lexer_state_name: "a state name",
51
+ lexer_state_do: "do", lexer_pattern: "a regular expression or quoted literal",
52
+ lexer_action_or_entry: "an action, lexer rule, state, or end"
23
53
  }.freeze #: Hash[Symbol, String]
24
54
 
25
55
  attr_reader :conversion_name #: Token?
@@ -27,8 +57,15 @@ module Ibex
27
57
  attr_reader :precedence_closer #: String?
28
58
  attr_reader :state #: Symbol
29
59
 
30
- # @rbs () -> void
31
- def initialize
60
+ # @rbs @extended_mode: bool
61
+ # @rbs @fragment: bool?
62
+ # @rbs @pragmas: Hash[String, bool]
63
+ # @rbs @pragma_location: Location?
64
+
65
+ # @rbs (?extended: bool) -> void
66
+ def initialize(extended: false)
67
+ @extended_mode = extended
68
+ @pragmas = {} #: Hash[String, bool]
32
69
  @state = :class_keyword
33
70
  end
34
71
 
@@ -47,7 +84,12 @@ module Ibex
47
84
 
48
85
  # @rbs () -> bool
49
86
  def extended_pragma?
50
- @extended_pragma == true
87
+ @pragmas["extended"] == true
88
+ end
89
+
90
+ # @rbs () -> bool
91
+ def cst_pragma?
92
+ @pragmas["cst"] == true
51
93
  end
52
94
 
53
95
  # @rbs (Token? token) -> String?
@@ -70,27 +112,32 @@ module Ibex
70
112
 
71
113
  # @rbs (Token token, Array[Token] remaining) -> external_token
72
114
  def classify_identifier(token, remaining)
115
+ return classify_lexer_identifier(token) if lexer_declaration_state?
116
+
73
117
  case @state
74
118
  when :class_keyword then class_keyword(token)
75
119
  when :class_name, :superclass_name then constant_name(remaining)
76
- when :declaration then begin_declaration(token)
77
- when :token_symbols, :options_identifiers then declaration_symbol(token)
120
+ when :declaration, :param_type then begin_declaration(token)
121
+ when :token_symbols
122
+ @token_alias_candidate = token
123
+ declaration_symbol(token)
124
+ when :options_identifiers, :start_symbols, :recovery_symbols, :on_error_reduce_symbols
125
+ declaration_symbol(token)
78
126
  when :precedence_association, :precedence_symbols then precedence_identifier(token)
79
- when :start_symbol then finish_single_symbol(:IDENTIFIER)
127
+ when :start_first_symbol then continue_start_symbols(:IDENTIFIER)
128
+ when :display_symbol, :type_symbol then begin_metadata_value(:IDENTIFIER)
129
+ when :param_name then begin_param_type
130
+ when :printer_symbol then begin_printer_action(:IDENTIFIER)
131
+ when :recover_kind then begin_recovery_colon(token)
132
+ when :recovery_first_symbol then continue_recovery_symbols(:IDENTIFIER)
133
+ when :on_error_reduce_first_symbol then continue_on_error_reduce_symbols(:IDENTIFIER)
134
+ when :test_expectation then begin_test_source(token)
80
135
  when :pragma_value then finish_pragma(token)
81
136
  when :convert_name then begin_conversion(token, :IDENTIFIER, remaining)
82
137
  else :IDENTIFIER
83
138
  end
84
139
  end
85
140
 
86
- # @rbs (Token token) -> external_token
87
- def class_keyword(token)
88
- return :IDENTIFIER unless string_value(token) == "class"
89
-
90
- @state = :class_name
91
- :CLASS
92
- end
93
-
94
141
  # @rbs (Array[Token] remaining) -> external_token
95
142
  def constant_name(remaining)
96
143
  following = remaining.first
@@ -111,11 +158,13 @@ module Ibex
111
158
  value = string_value(token)
112
159
  return begin_precedence(token) if %w[prechigh preclow].include?(value)
113
160
 
114
- raise Ibex::Error, "#{token.location}: duplicate pragma extended" if value == "pragma" && @extended_pragma
161
+ reject_fragment_pragma(token, value)
115
162
 
116
163
  terminal, next_state = DECLARATIONS[value]
117
164
  return :IDENTIFIER unless terminal
118
165
 
166
+ @pragma_location = token.location if terminal == :PRAGMA
167
+ @token_alias_candidate = nil
119
168
  @state = next_state
120
169
  @declaration = value.to_sym unless terminal == :RULE
121
170
  @declaration = nil if terminal == :RULE
@@ -125,9 +174,13 @@ module Ibex
125
174
  # @rbs (Token token) -> external_token
126
175
  def finish_pragma(token)
127
176
  value = string_value(token)
128
- raise Ibex::Error, "#{token.location}: unknown pragma #{value}" unless value == "extended"
177
+ raise Ibex::Error, "#{token.location}: unknown pragma #{value}" unless %w[extended cst].include?(value)
129
178
 
130
- @extended_pragma = true
179
+ location = @pragma_location || token.location
180
+ raise Ibex::Error, "#{location}: duplicate pragma #{value}" if @pragmas[value]
181
+
182
+ @pragmas[value] = true
183
+ @pragma_location = nil
131
184
  @state = :declaration
132
185
  @declaration = nil
133
186
  :IDENTIFIER
@@ -151,9 +204,16 @@ module Ibex
151
204
 
152
205
  # @rbs (String value) -> bool
153
206
  def declaration_boundary?(value)
207
+ return false if %w[display type param printer].include?(value) && !extended_features?
208
+
154
209
  DECLARATIONS.key?(value) || %w[prechigh preclow].include?(value)
155
210
  end
156
211
 
212
+ # @rbs () -> bool
213
+ def extended_features?
214
+ @extended_mode || extended_pragma? || cst_pragma?
215
+ end
216
+
157
217
  # @rbs (Token token) -> external_token
158
218
  def precedence_identifier(token)
159
219
  value = string_value(token)
@@ -189,14 +249,80 @@ module Ibex
189
249
  # @rbs (Token token, Array[Token] remaining) -> external_token
190
250
  def classify_scalar(token, remaining)
191
251
  type = SCALAR_TYPES.fetch(token.type)
192
- return finish_single_symbol(type) if @state == :expect_integer && type == :INTEGER
193
- return finish_single_symbol(type) if @state == :start_symbol && type == :LITERAL
194
- return begin_conversion(token, type, remaining) if @state == :convert_name && type == :LITERAL
195
- return finish_conversion(type) if @state == :convert_expression && type == :LITERAL
252
+ classified = classify_lexer_scalar(type) ||
253
+ classify_token_alias(token, type) || classify_include(type) || classify_single_symbol(type) ||
254
+ classify_metadata(type) || classify_printer(type) || classify_grammar_test(type) ||
255
+ classify_conversion(token, type, remaining)
256
+
257
+ classified || type
258
+ end
259
+
260
+ # @rbs (external_token type) -> external_token?
261
+ def classify_single_symbol(type)
262
+ return finish_single_symbol(type) if %i[expect_integer expect_rr_integer].include?(@state) && type == :INTEGER
263
+
264
+ first = continue_first_symbol(type)
265
+ return first if first
266
+
267
+ type if @state == :start_symbols && type == :LITERAL
268
+ end
196
269
 
270
+ # @rbs (external_token type) -> external_token?
271
+ def continue_first_symbol(type)
272
+ return unless type == :LITERAL
273
+ return continue_start_symbols(type) if @state == :start_first_symbol
274
+ return continue_recovery_symbols(type) if @state == :recovery_first_symbol
275
+
276
+ continue_on_error_reduce_symbols(type) if @state == :on_error_reduce_first_symbol
277
+ end
278
+
279
+ # @rbs (Token token, external_token type) -> external_token?
280
+ def classify_token_alias(token, type)
281
+ candidate = @token_alias_candidate
282
+ return unless extended_features? && @state == :token_symbols &&
283
+ type == :LITERAL && candidate
284
+ return unless candidate.location.line == token.location.line
285
+
286
+ @token_alias_candidate = nil
287
+ :TOKEN_ALIAS
288
+ end
289
+
290
+ # @rbs (external_token type) -> external_token?
291
+ def classify_metadata(type)
292
+ return unless type == :LITERAL
293
+ return begin_metadata_value(type) if %i[display_symbol type_symbol].include?(@state)
294
+ return finish_param_type(type) if @state == :param_type
295
+
296
+ finish_metadata_value(type) if %i[display_value type_value].include?(@state)
297
+ end
298
+
299
+ # @rbs (external_token type) -> external_token?
300
+ def classify_printer(type)
301
+ return begin_printer_action(type) if @state == :printer_symbol && type == :LITERAL
302
+ return unless @state == :printer_action && type == :ACTION
303
+
304
+ @state = :declaration
305
+ @declaration = nil
306
+ type
307
+ end
308
+
309
+ # @rbs (external_token type) -> external_token?
310
+ def classify_grammar_test(type)
311
+ return unless @state == :test_source && type == :LITERAL
312
+
313
+ @state = :declaration
314
+ @declaration = nil
197
315
  type
198
316
  end
199
317
 
318
+ # @rbs (Token token, external_token type, Array[Token] remaining) -> external_token?
319
+ def classify_conversion(token, type, remaining)
320
+ return unless type == :LITERAL
321
+ return begin_conversion(token, type, remaining) if @state == :convert_name
322
+
323
+ finish_conversion(type) if @state == :convert_expression
324
+ end
325
+
200
326
  # @rbs (external_token type) -> external_token
201
327
  def finish_single_symbol(type)
202
328
  @state = :declaration
@@ -204,6 +330,68 @@ module Ibex
204
330
  type
205
331
  end
206
332
 
333
+ # @rbs (external_token type) -> external_token
334
+ def continue_start_symbols(type)
335
+ @state = :start_symbols
336
+ type
337
+ end
338
+
339
+ # @rbs (external_token type) -> external_token
340
+ def continue_recovery_symbols(type)
341
+ @state = :recovery_symbols
342
+ type
343
+ end
344
+
345
+ # @rbs (external_token type) -> external_token
346
+ def continue_on_error_reduce_symbols(type)
347
+ @state = :on_error_reduce_symbols
348
+ type
349
+ end
350
+
351
+ # @rbs (external_token type) -> external_token
352
+ def begin_metadata_value(type)
353
+ @state = @state == :display_symbol ? :display_value : :type_value
354
+ type
355
+ end
356
+
357
+ # @rbs () -> external_token
358
+ def begin_param_type
359
+ @state = :param_type
360
+ :IDENTIFIER
361
+ end
362
+
363
+ # @rbs (external_token type) -> external_token
364
+ def begin_printer_action(type)
365
+ @state = :printer_action
366
+ type
367
+ end
368
+
369
+ # @rbs (Token token) -> external_token
370
+ def begin_recovery_colon(_token)
371
+ @state = :recovery_colon
372
+ :IDENTIFIER
373
+ end
374
+
375
+ # @rbs (Token token) -> external_token
376
+ def begin_test_source(_token)
377
+ @state = :test_source
378
+ :IDENTIFIER
379
+ end
380
+
381
+ # @rbs (external_token type) -> external_token
382
+ def finish_param_type(type)
383
+ @state = :declaration
384
+ @declaration = nil
385
+ type
386
+ end
387
+
388
+ # @rbs (external_token type) -> external_token
389
+ def finish_metadata_value(type)
390
+ @state = :declaration
391
+ @declaration = nil
392
+ type
393
+ end
394
+
207
395
  # @rbs (external_token type) -> external_token
208
396
  def finish_conversion(type)
209
397
  @state = :convert_name
@@ -214,6 +402,7 @@ module Ibex
214
402
  # @rbs (Token token) -> external_token
215
403
  def classify_punctuation(token)
216
404
  @state = :superclass_name if @state == :superclass_marker && token.type == :<
405
+ @state = :recovery_first_symbol if @state == :recovery_colon && token.type == :":"
217
406
  string_value(token)
218
407
  end
219
408
 
@@ -232,7 +421,7 @@ module Ibex
232
421
  def precedence_expectation(token)
233
422
  return @precedence_closer if token&.type == :eof
234
423
 
235
- "left or right or nonassoc" if @state == :precedence_association
424
+ "left or right or nonassoc or precedence" if @state == :precedence_association
236
425
  end
237
426
 
238
427
  # @rbs (Token token) -> String
@@ -243,6 +432,7 @@ module Ibex
243
432
  raise Ibex::Error, "#{token.location}: expected text token"
244
433
  end
245
434
  end
435
+ # rubocop:enable Metrics/ClassLength, Metrics/CyclomaticComplexity
246
436
  end
247
437
  end
248
438
  end
@@ -23,8 +23,14 @@ module Ibex
23
23
  # @rbs (Token token, external_token external, external_token? previous_external) -> void
24
24
  def observe(token, external, previous_external)
25
25
  if external == "("
26
- separated = %i[SEPARATED_LIST SEPARATED_NONEMPTY_LIST].include?(previous_external)
27
- @stack << [separated ? :separated : :group, token] #: [delimiter_kind, Token]
26
+ kind = if %i[SEPARATED_LIST SEPARATED_NONEMPTY_LIST].include?(previous_external)
27
+ :separated
28
+ elsif %i[LHS PARAMETERIZED_REFERENCE].include?(previous_external)
29
+ :parameter
30
+ else
31
+ :group
32
+ end #: delimiter_kind
33
+ @stack << [kind, token] #: [delimiter_kind, Token]
28
34
  elsif external == ")"
29
35
  @stack.pop
30
36
  end
@@ -15,6 +15,7 @@ module Ibex
15
15
  # @rbs @delimiters: DelimiterTracker
16
16
  # @rbs @lhs_column: Integer?
17
17
  # @rbs @rule_seen: bool?
18
+ # @rbs @node_annotation: bool?
18
19
 
19
20
  # @rbs () -> void
20
21
  def initialize
@@ -28,12 +29,20 @@ module Ibex
28
29
  def classify(token, remaining, last_external:, previous_external:)
29
30
  external = if token.type == :identifier
30
31
  classify_identifier(token, remaining, last_external, previous_external)
32
+ elsif token.type == :node
33
+ @node_annotation = true
34
+ :NODE
35
+ elsif token.type == :inline
36
+ classify_inline
37
+ elsif token.type == :empty
38
+ :EMPTY
31
39
  elsif SCALAR_TYPES.key?(token.type)
32
40
  SCALAR_TYPES.fetch(token.type)
33
41
  else
34
42
  classify_punctuation(token)
35
43
  end
36
44
  @delimiters.observe(token, external, last_external)
45
+ @node_annotation = false if token.type == :")" && @node_annotation
37
46
  external
38
47
  end
39
48
 
@@ -60,21 +69,35 @@ module Ibex
60
69
 
61
70
  private
62
71
 
72
+ # @rbs () -> external_token
73
+ def classify_inline
74
+ reset_rule_boundary if @state == :rule_rhs && @delimiters.empty?
75
+ :INLINE
76
+ end
77
+
63
78
  # @rbs (Token token, Array[Token] remaining, external_token? last_external,
64
79
  # external_token? previous_external) -> external_token
65
80
  def classify_identifier(token, remaining, last_external, previous_external)
81
+ return :IDENTIFIER if @node_annotation
66
82
  return rule_lhs(token) if @state == :rules_lhs
67
83
  return :IDENTIFIER unless @state == :rule_rhs
68
84
  return :IDENTIFIER if named_reference_name?(last_external, previous_external)
69
85
 
86
+ classify_rhs_identifier(token, remaining)
87
+ end
88
+
89
+ # @rbs (Token token, Array[Token] remaining) -> external_token
90
+ def classify_rhs_identifier(token, remaining)
70
91
  value = string_value(token)
71
- return :IDENTIFIER if value == "end" && @delimiters.open_kind == :separated
92
+ return :IDENTIFIER if value == "end" && @delimiters.open_kind
72
93
  return finish_rules if value == "end"
73
94
 
74
95
  following = remaining.first
75
96
  return :IDENTIFIER unless following
76
- return start_rule(token) if rule_boundary?(token, following)
97
+ return start_rule(token) if rule_boundary?(token, following) ||
98
+ parameterized_rule_boundary?(token, remaining)
77
99
  return separated_terminal(token) if separated_list_call?(token, following)
100
+ return :PARAMETERIZED_REFERENCE if parameterized_call?(token, following)
78
101
 
79
102
  :IDENTIFIER
80
103
  end
@@ -105,6 +128,26 @@ module Ibex
105
128
  @delimiters.empty? && following.type == :":" && token.location.column <= lhs_column
106
129
  end
107
130
 
131
+ # @rbs (Token token, Array[Token] remaining) -> bool
132
+ def parameterized_rule_boundary?(token, remaining)
133
+ lhs_column = @lhs_column
134
+ opening = remaining.first
135
+ return false unless lhs_column && @delimiters.empty? && token.location.column <= lhs_column
136
+ return false unless opening&.type == :"(" && adjacent?(token, opening)
137
+
138
+ parameter_definition_tail?(remaining.drop(1))
139
+ end
140
+
141
+ # @rbs (Array[Token] tail) -> bool
142
+ def parameter_definition_tail?(tail)
143
+ closing = tail.index { |entry| entry.type == :")" }
144
+ return false unless closing && tail[closing + 1]&.type == :":"
145
+
146
+ formals = tail.take(closing)
147
+ !formals.empty? && formals.length.odd? &&
148
+ formals.each_with_index.all? { |entry, index| entry.type == (index.even? ? :identifier : :",") }
149
+ end
150
+
108
151
  # @rbs (Token token) -> external_token
109
152
  def start_rule(token)
110
153
  @rule_seen = true
@@ -129,6 +172,21 @@ module Ibex
129
172
  string_value(token) == "separated_list" ? :SEPARATED_LIST : :SEPARATED_NONEMPTY_LIST
130
173
  end
131
174
 
175
+ # @rbs (Token token, Token following) -> bool
176
+ def parameterized_call?(token, following)
177
+ following.type == :"(" && adjacent?(token, following)
178
+ end
179
+
180
+ # @rbs (Token left, Token right) -> bool
181
+ def adjacent?(left, right)
182
+ left_span = left.span
183
+ right_span = right.span
184
+ return left_span.end_byte == right_span.start_byte if left_span && right_span
185
+
186
+ left.location.line == right.location.line &&
187
+ left.location.column + string_value(left).length == right.location.column
188
+ end
189
+
132
190
  # @rbs (Token token) -> external_token
133
191
  def classify_punctuation(token)
134
192
  @state = :rule_rhs if @state == :rule_colon && token.type == :":"
@@ -15,11 +15,11 @@ module Ibex
15
15
  # @rbs @rules: RuleState?
16
16
  # @rbs @last_external: external_token?
17
17
 
18
- # @rbs (Array[Token] tokens) -> void
19
- def initialize(tokens)
18
+ # @rbs (Array[Token] tokens, ?extended: bool) -> void
19
+ def initialize(tokens, extended: false)
20
20
  @tokens = tokens
21
21
  @index = 0
22
- @declarations = DeclarationState.new
22
+ @declarations = DeclarationState.new(extended: extended)
23
23
  @classifier = @declarations
24
24
  end
25
25
 
@@ -60,6 +60,11 @@ module Ibex
60
60
  @declarations.extended_pragma?
61
61
  end
62
62
 
63
+ # @rbs () -> bool
64
+ def cst_pragma?
65
+ @declarations.cst_pragma?
66
+ end
67
+
63
68
  # @rbs () -> parser_section
64
69
  def section
65
70
  rules = @rules
data/lib/ibex/frontend.rb CHANGED
@@ -2,18 +2,29 @@
2
2
 
3
3
  require_relative "error"
4
4
  require_relative "tables"
5
- require_relative "runtime"
5
+ require "ibex/runtime"
6
+ require_relative "frontend/source_span"
6
7
  require_relative "frontend/source_cursor"
8
+ require_relative "frontend/source_document"
9
+ require_relative "frontend/diagnostic"
7
10
  require_relative "frontend/action_scanner"
8
11
  require_relative "frontend/lexer"
12
+ require_relative "frontend/lexer_recovery"
9
13
  require_relative "frontend/ast"
14
+ require_relative "frontend/rule_documentation"
15
+ require_relative "frontend/token_adapter/declaration_document_state"
10
16
  require_relative "frontend/token_adapter/declaration_state"
11
17
  require_relative "frontend/token_adapter/delimiter_tracker"
12
18
  require_relative "frontend/token_adapter/rule_state"
13
19
  require_relative "frontend/token_adapter"
14
20
  require_relative "frontend/generated_parser_base"
15
21
  require_relative "frontend/generated_parser"
22
+ require_relative "frontend/diagnostic_recovery"
16
23
  require_relative "frontend/parser"
24
+ require_relative "frontend/formatter"
25
+ require_relative "frontend/resolution"
26
+ require_relative "frontend/source_loader"
27
+ require_relative "frontend/resolver"
17
28
  require_relative "frontend/dsl"
18
29
 
19
30
  module Ibex
@@ -23,6 +34,6 @@ module Ibex
23
34
  # type token_value = String | Integer | user_code_token | nil
24
35
  # type external_token = Symbol | String
25
36
  # type parser_section = :declarations | :rules | :user_code
26
- # type delimiter_kind = :group | :separated
37
+ # type delimiter_kind = :group | :separated | :parameter
27
38
  end
28
39
  end