ibex 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (603) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +89 -123
  3. data/docs/architecture.md +477 -31
  4. data/docs/bison-import.md +103 -0
  5. data/docs/comparison-policy.md +127 -0
  6. data/docs/configuration-model.md +59 -0
  7. data/docs/configuration-report.md +28 -0
  8. data/docs/conflict-explanation-reviews/v1/records/README.md +28 -0
  9. data/docs/conflict-explanation-study.md +62 -0
  10. data/docs/construction-profiling.md +157 -0
  11. data/docs/cst-migration.md +106 -0
  12. data/docs/cst.md +237 -0
  13. data/docs/decisions/0000-template.md +24 -0
  14. data/docs/decisions/0001-separate-ir-pipeline.md +34 -0
  15. data/docs/decisions/0002-opaque-user-code-boundary.md +32 -0
  16. data/docs/decisions/0003-self-hosted-grammar-frontend.md +32 -0
  17. data/docs/decisions/0004-shared-semantic-and-lossless-source-model.md +33 -0
  18. data/docs/decisions/0005-contained-grammar-composition.md +34 -0
  19. data/docs/decisions/0006-bounded-structural-grammar-lowering.md +32 -0
  20. data/docs/decisions/0007-shared-parser-construction-pipeline.md +33 -0
  21. data/docs/decisions/0008-versioned-runtime-package-boundary.md +36 -0
  22. data/docs/decisions/0009-isolated-parser-sessions.md +34 -0
  23. data/docs/decisions/0010-committed-runtime-observation.md +34 -0
  24. data/docs/decisions/0011-versioned-semantic-action-boundary.md +37 -0
  25. data/docs/decisions/0012-bounded-nonexecuting-analysis.md +37 -0
  26. data/docs/decisions/0013-transactional-generation-publication.md +37 -0
  27. data/docs/decisions/0014-versioned-generated-lexer.md +35 -0
  28. data/docs/decisions/0015-worker-isolated-browser-analysis.md +32 -0
  29. data/docs/decisions/0016-red-green-concrete-syntax.md +34 -0
  30. data/docs/decisions/0017-persistent-syntax-artifacts.md +35 -0
  31. data/docs/decisions/0018-conservative-incremental-syntax-reuse.md +38 -0
  32. data/docs/decisions/0019-runtime-syntax-session-boundary.md +51 -0
  33. data/docs/decisions/0020-grammar-ir-parser-contract.md +65 -0
  34. data/docs/decisions/0021-data-only-parser-table-sidecar.md +50 -0
  35. data/docs/decisions/0022-manifest-bound-verification-report.md +77 -0
  36. data/docs/decisions/0023-syntax-only-repair-results.md +48 -0
  37. data/docs/decisions/0024-direct-ielr-construction.md +42 -0
  38. data/docs/decisions/README.md +74 -0
  39. data/docs/declarative-configuration.md +262 -0
  40. data/docs/development.md +306 -0
  41. data/docs/direct-ielr-decision.md +120 -0
  42. data/docs/direct-multi-entry-decision.md +82 -0
  43. data/docs/editor-setup.md +26 -0
  44. data/docs/error-ux-review-rubric-v1.md +117 -0
  45. data/docs/error-ux-reviews/v1/records/README.md +22 -0
  46. data/docs/error-ux-round2-review-status-v1.json +27 -0
  47. data/docs/error-ux-round2-reviews/v1/records/README.md +30 -0
  48. data/docs/error-ux-round2-v1.json +1581 -0
  49. data/docs/error-ux-round2.md +111 -0
  50. data/docs/error-ux.md +114 -0
  51. data/docs/getting-started.md +80 -0
  52. data/docs/grammar-reference.md +629 -18
  53. data/docs/ielr-design.md +43 -0
  54. data/docs/ielr.md +92 -0
  55. data/docs/ja/bison-import.md +51 -0
  56. data/docs/ja/stable-api.md +53 -0
  57. data/docs/lexer-construction-profile.md +109 -0
  58. data/docs/lexer-migration.md +56 -0
  59. data/docs/maturity.md +128 -0
  60. data/docs/project-site-strategy.md +54 -0
  61. data/docs/racc-migration-evidence.md +45 -0
  62. data/docs/racc-migration.md +45 -6
  63. data/docs/release-readiness.md +221 -0
  64. data/docs/repair-semantics.md +123 -0
  65. data/docs/runtime-abi-evolution.md +307 -0
  66. data/docs/stability.md +234 -0
  67. data/docs/status.md +43 -0
  68. data/docs/syntax-sessions.md +183 -0
  69. data/docs/table-artifact.md +125 -0
  70. data/docs/test-interactions.md +219 -0
  71. data/docs/verification-report.md +137 -0
  72. data/docs/verifier-trust-boundary.md +199 -0
  73. data/docs/workloads.md +132 -0
  74. data/examples/README.md +60 -0
  75. data/examples/calculator.y +44 -0
  76. data/examples/csv.y +32 -0
  77. data/examples/ini.y +70 -0
  78. data/examples/json.y +48 -0
  79. data/examples/tiny_language.y +75 -0
  80. data/lib/ibex/analysis/digraph.rb +128 -0
  81. data/lib/ibex/analysis/sets.rb +5 -4
  82. data/lib/ibex/analysis.rb +1 -0
  83. data/lib/ibex/artifact_set.rb +63 -0
  84. data/lib/ibex/bison_import/importer.rb +516 -0
  85. data/lib/ibex/bison_import/tokenizer.rb +260 -0
  86. data/lib/ibex/bison_import.rb +200 -0
  87. data/lib/ibex/bounded_subprocess.rb +171 -0
  88. data/lib/ibex/cli/ambiguity.rb +75 -0
  89. data/lib/ibex/cli/analysis.rb +134 -0
  90. data/lib/ibex/cli/bison_import.rb +121 -0
  91. data/lib/ibex/cli/config.rb +128 -0
  92. data/lib/ibex/cli/counterexample_options.rb +6 -2
  93. data/lib/ibex/cli/coverage.rb +173 -0
  94. data/lib/ibex/cli/debug.rb +106 -0
  95. data/lib/ibex/cli/diagnostics.rb +136 -0
  96. data/lib/ibex/cli/documentation.rb +70 -0
  97. data/lib/ibex/cli/equiv.rb +169 -0
  98. data/lib/ibex/cli/error_messages.rb +184 -0
  99. data/lib/ibex/cli/explain.rb +85 -0
  100. data/lib/ibex/cli/fix.rb +203 -0
  101. data/lib/ibex/cli/formatting.rb +387 -0
  102. data/lib/ibex/cli/fuzz.rb +200 -0
  103. data/lib/ibex/cli/fuzz_regressions.rb +145 -0
  104. data/lib/ibex/cli/generation_artifacts.rb +189 -0
  105. data/lib/ibex/cli/generation_error_messages.rb +39 -0
  106. data/lib/ibex/cli/grammar_tests.rb +140 -0
  107. data/lib/ibex/cli/ir_tools.rb +128 -0
  108. data/lib/ibex/cli/lsp.rb +33 -0
  109. data/lib/ibex/cli/outputs.rb +133 -23
  110. data/lib/ibex/cli/racc_migration.rb +87 -0
  111. data/lib/ibex/cli/reduce.rb +202 -0
  112. data/lib/ibex/cli/reduce_reporting.rb +71 -0
  113. data/lib/ibex/cli/samples.rb +118 -0
  114. data/lib/ibex/cli/verify.rb +116 -0
  115. data/lib/ibex/cli/watch.rb +104 -0
  116. data/lib/ibex/cli.rb +825 -55
  117. data/lib/ibex/codegen/action_locations.rb +103 -0
  118. data/lib/ibex/codegen/action_method_source.rb +209 -0
  119. data/lib/ibex/codegen/action_source.rb +119 -0
  120. data/lib/ibex/codegen/ambiguity.rb +174 -0
  121. data/lib/ibex/codegen/cst_metadata.rb +171 -0
  122. data/lib/ibex/codegen/documentation.rb +170 -0
  123. data/lib/ibex/codegen/explain.rb +380 -0
  124. data/lib/ibex/codegen/generated_action_abi.rb +293 -0
  125. data/lib/ibex/codegen/html.rb +94 -10
  126. data/lib/ibex/codegen/mermaid.rb +43 -0
  127. data/lib/ibex/codegen/railroad.rb +197 -0
  128. data/lib/ibex/codegen/railroad_documentation.rb +59 -0
  129. data/lib/ibex/codegen/rbs.rb +331 -2
  130. data/lib/ibex/codegen/report.rb +67 -15
  131. data/lib/ibex/codegen/ruby.rb +305 -66
  132. data/lib/ibex/codegen/ruby_actions.rb +146 -0
  133. data/lib/ibex/codegen/ruby_ast.rb +121 -0
  134. data/lib/ibex/codegen/ruby_error_messages.rb +28 -0
  135. data/lib/ibex/codegen/ruby_lexer.rb +83 -0
  136. data/lib/ibex/codegen/ruby_syntax.rb +96 -0
  137. data/lib/ibex/codegen/ruby_table_metadata.rb +57 -0
  138. data/lib/ibex/codegen/ruby_value_printers.rb +56 -0
  139. data/lib/ibex/codegen/symbol_labels.rb +1 -1
  140. data/lib/ibex/configuration/analysis_grammar.rb +35 -0
  141. data/lib/ibex/configuration/explanation.rb +421 -0
  142. data/lib/ibex/configuration/inspector.rb +232 -0
  143. data/lib/ibex/configuration.rb +580 -0
  144. data/lib/ibex/coverage/collector.rb +198 -0
  145. data/lib/ibex/coverage/event_stream.rb +103 -0
  146. data/lib/ibex/coverage/report.rb +267 -0
  147. data/lib/ibex/coverage/runtime_event_validator.rb +169 -0
  148. data/lib/ibex/coverage.rb +13 -0
  149. data/lib/ibex/delta_reducer.rb +99 -0
  150. data/lib/ibex/diff.rb +140 -0
  151. data/lib/ibex/equiv/machine.rb +135 -0
  152. data/lib/ibex/equiv.rb +373 -0
  153. data/lib/ibex/error_messages/parser.rb +159 -0
  154. data/lib/ibex/error_messages/parser_v2.rb +198 -0
  155. data/lib/ibex/error_messages/renderer.rb +65 -0
  156. data/lib/ibex/error_messages/sentence_search.rb +196 -0
  157. data/lib/ibex/error_messages/update.rb +169 -0
  158. data/lib/ibex/error_messages.rb +165 -0
  159. data/lib/ibex/fix.rb +557 -0
  160. data/lib/ibex/frontend/ast.rb +166 -7
  161. data/lib/ibex/frontend/bootstrap_parser.rb +40 -4
  162. data/lib/ibex/frontend/diagnostic.rb +81 -0
  163. data/lib/ibex/frontend/diagnostic_recovery.rb +268 -0
  164. data/lib/ibex/frontend/dsl.rb +66 -7
  165. data/lib/ibex/frontend/formatter.rb +453 -0
  166. data/lib/ibex/frontend/generated_parser.rb +644 -190
  167. data/lib/ibex/frontend/generated_parser_base.rb +170 -32
  168. data/lib/ibex/frontend/generated_parser_includes.rb +51 -0
  169. data/lib/ibex/frontend/generated_parser_metadata.rb +61 -0
  170. data/lib/ibex/frontend/generated_parser_parameters.rb +60 -0
  171. data/lib/ibex/frontend/generation.rb +33 -0
  172. data/lib/ibex/frontend/lexer.rb +162 -10
  173. data/lib/ibex/frontend/lexer_recovery.rb +84 -0
  174. data/lib/ibex/frontend/parser/declarations.rb +262 -11
  175. data/lib/ibex/frontend/parser/parameters.rb +82 -0
  176. data/lib/ibex/frontend/parser/rules.rb +43 -6
  177. data/lib/ibex/frontend/parser.rb +182 -4
  178. data/lib/ibex/frontend/parser_configuration_support.rb +56 -0
  179. data/lib/ibex/frontend/regenerator.rb +27 -1
  180. data/lib/ibex/frontend/resolution.rb +70 -0
  181. data/lib/ibex/frontend/resolver.rb +217 -0
  182. data/lib/ibex/frontend/rule_documentation.rb +104 -0
  183. data/lib/ibex/frontend/source_cursor.rb +133 -9
  184. data/lib/ibex/frontend/source_document.rb +229 -0
  185. data/lib/ibex/frontend/source_loader.rb +150 -0
  186. data/lib/ibex/frontend/source_span.rb +89 -0
  187. data/lib/ibex/frontend/token_adapter/declaration_document_state.rb +47 -0
  188. data/lib/ibex/frontend/token_adapter/declaration_lexer_state.rb +83 -0
  189. data/lib/ibex/frontend/token_adapter/declaration_state.rb +244 -22
  190. data/lib/ibex/frontend/token_adapter/delimiter_tracker.rb +8 -2
  191. data/lib/ibex/frontend/token_adapter/rule_state.rb +60 -2
  192. data/lib/ibex/frontend/token_adapter.rb +18 -3
  193. data/lib/ibex/frontend.rb +14 -2
  194. data/lib/ibex/fuzz.rb +219 -0
  195. data/lib/ibex/generation_input.rb +57 -0
  196. data/lib/ibex/generation_manifest.rb +211 -0
  197. data/lib/ibex/generation_transaction.rb +261 -0
  198. data/lib/ibex/generation_transaction_recovery.rb +109 -0
  199. data/lib/ibex/generation_transaction_validation.rb +196 -0
  200. data/lib/ibex/grammar_tests.rb +206 -0
  201. data/lib/ibex/ir/automaton_ir.rb +86 -11
  202. data/lib/ibex/ir/grammar_ir.rb +170 -26
  203. data/lib/ibex/ir/lexer_ir.rb +76 -0
  204. data/lib/ibex/ir/parser_contract.rb +135 -0
  205. data/lib/ibex/ir/serialize.rb +268 -50
  206. data/lib/ibex/ir/validator/automaton.rb +375 -0
  207. data/lib/ibex/ir/validator/base.rb +147 -0
  208. data/lib/ibex/ir/validator/grammar.rb +634 -0
  209. data/lib/ibex/ir/validator/lexer.rb +113 -0
  210. data/lib/ibex/ir/validator.rb +63 -0
  211. data/lib/ibex/ir.rb +71 -5
  212. data/lib/ibex/lalr/build_metrics.rb +71 -0
  213. data/lib/ibex/lalr/builder.rb +514 -52
  214. data/lib/ibex/lalr/conflict.rb +1 -0
  215. data/lib/ibex/lalr/conflict_search.rb +26 -9
  216. data/lib/ibex/lalr/counterexample.rb +38 -18
  217. data/lib/ibex/lalr/direct_lookaheads.rb +289 -0
  218. data/lib/ibex/lalr/goto_follows.rb +229 -0
  219. data/lib/ibex/lalr/ielr/annotator.rb +214 -0
  220. data/lib/ibex/lalr/ielr/bits.rb +28 -0
  221. data/lib/ibex/lalr/ielr/inadequacy.rb +47 -0
  222. data/lib/ibex/lalr/ielr/item_lookaheads.rb +78 -0
  223. data/lib/ibex/lalr/ielr/pipeline.rb +75 -0
  224. data/lib/ibex/lalr/ielr/split_stability.rb +78 -0
  225. data/lib/ibex/lalr/ielr/split_state.rb +20 -0
  226. data/lib/ibex/lalr/ielr/state_splitter.rb +258 -0
  227. data/lib/ibex/lalr/ielr_partition.rb +166 -0
  228. data/lib/ibex/lalr/inadequacy_report.rb +50 -0
  229. data/lib/ibex/lalr/lookahead_propagation.rb +111 -0
  230. data/lib/ibex/lalr/lr0_collection.rb +121 -0
  231. data/lib/ibex/lalr/on_error_reductions.rb +74 -0
  232. data/lib/ibex/lalr/unreachable_states.rb +80 -0
  233. data/lib/ibex/lalr.rb +59 -1
  234. data/lib/ibex/location.rb +129 -0
  235. data/lib/ibex/lsp/document_handlers.rb +68 -0
  236. data/lib/ibex/lsp/document_store.rb +264 -0
  237. data/lib/ibex/lsp/document_store_diagnostics.rb +44 -0
  238. data/lib/ibex/lsp/document_store_validation.rb +61 -0
  239. data/lib/ibex/lsp/initialization_handlers.rb +80 -0
  240. data/lib/ibex/lsp/navigation_handlers.rb +70 -0
  241. data/lib/ibex/lsp/parser_configuration_assistance.rb +149 -0
  242. data/lib/ibex/lsp/position_codec.rb +113 -0
  243. data/lib/ibex/lsp/protocol_error.rb +33 -0
  244. data/lib/ibex/lsp/request_handlers.rb +46 -0
  245. data/lib/ibex/lsp/request_support.rb +94 -0
  246. data/lib/ibex/lsp/server.rb +148 -0
  247. data/lib/ibex/lsp/symbol_index.rb +241 -0
  248. data/lib/ibex/lsp/symbol_index_builder.rb +277 -0
  249. data/lib/ibex/lsp/symbol_index_precedence_references.rb +44 -0
  250. data/lib/ibex/lsp/symbol_index_source_queries.rb +61 -0
  251. data/lib/ibex/lsp/symbol_occurrence.rb +23 -0
  252. data/lib/ibex/lsp/transport.rb +128 -0
  253. data/lib/ibex/lsp/workspace.rb +128 -0
  254. data/lib/ibex/lsp/workspace_analyzer.rb +199 -0
  255. data/lib/ibex/lsp.rb +33 -0
  256. data/lib/ibex/messages/en.yml +28 -0
  257. data/lib/ibex/messages/ja.yml +28 -0
  258. data/lib/ibex/messages.rb +68 -0
  259. data/lib/ibex/metrics.rb +175 -0
  260. data/lib/ibex/normalize/declarations.rb +142 -7
  261. data/lib/ibex/normalize/diagnostics.rb +94 -24
  262. data/lib/ibex/normalize/expander.rb +64 -59
  263. data/lib/ibex/normalize/expression.rb +63 -40
  264. data/lib/ibex/normalize/grammar_builder.rb +26 -0
  265. data/lib/ibex/normalize/inline_expansion.rb +465 -0
  266. data/lib/ibex/normalize/inline_validation.rb +174 -0
  267. data/lib/ibex/normalize/lexer.rb +131 -0
  268. data/lib/ibex/normalize/named_references.rb +60 -0
  269. data/lib/ibex/normalize/nodes.rb +46 -0
  270. data/lib/ibex/normalize/parameter_ebnf_lowering.rb +70 -0
  271. data/lib/ibex/normalize/parameter_lowering.rb +143 -0
  272. data/lib/ibex/normalize/parameter_substitution.rb +125 -0
  273. data/lib/ibex/normalize/parameter_validation.rb +140 -0
  274. data/lib/ibex/normalize/parameters.rb +226 -0
  275. data/lib/ibex/normalize/parser_configuration.rb +70 -0
  276. data/lib/ibex/normalize/recovery_declarations.rb +84 -0
  277. data/lib/ibex/normalize.rb +172 -17
  278. data/lib/ibex/racc_migration/checker.rb +122 -0
  279. data/lib/ibex/racc_migration/harness.rb +177 -0
  280. data/lib/ibex/racc_migration/report.rb +97 -0
  281. data/lib/ibex/racc_migration.rb +12 -0
  282. data/lib/ibex/rake_task.rb +116 -0
  283. data/lib/ibex/samples.rb +216 -0
  284. data/lib/ibex/table_artifact/builder.rb +266 -0
  285. data/lib/ibex/table_artifact/cst_projection.rb +70 -0
  286. data/lib/ibex/table_artifact/document.rb +39 -0
  287. data/lib/ibex/table_artifact/executor.rb +187 -0
  288. data/lib/ibex/table_artifact/serializer.rb +57 -0
  289. data/lib/ibex/table_artifact/validator/metadata.rb +179 -0
  290. data/lib/ibex/table_artifact/validator/support.rb +86 -0
  291. data/lib/ibex/table_artifact/validator/tables.rb +238 -0
  292. data/lib/ibex/table_artifact/validator.rb +253 -0
  293. data/lib/ibex/table_artifact.rb +88 -0
  294. data/lib/ibex/table_simulation/result.rb +55 -0
  295. data/lib/ibex/table_simulation/simulator.rb +253 -0
  296. data/lib/ibex/table_simulation/step.rb +62 -0
  297. data/lib/ibex/table_simulation/text.rb +31 -0
  298. data/lib/ibex/table_simulation.rb +13 -0
  299. data/lib/ibex/tables.rb +22 -69
  300. data/lib/ibex/verifiable_generation_bundle.rb +86 -0
  301. data/lib/ibex/verification_report/builder.rb +159 -0
  302. data/lib/ibex/verification_report/canonical_ir.rb +123 -0
  303. data/lib/ibex/verification_report/logical_path.rb +68 -0
  304. data/lib/ibex/verification_report/validator.rb +329 -0
  305. data/lib/ibex/verification_report.rb +69 -0
  306. data/lib/ibex/verify/action_correspondence.rb +138 -0
  307. data/lib/ibex/verify/language_witness.rb +295 -0
  308. data/lib/ibex/verify/reference_collection.rb +190 -0
  309. data/lib/ibex/verify/result.rb +73 -0
  310. data/lib/ibex/verify/verifier.rb +598 -0
  311. data/lib/ibex/verify.rb +15 -0
  312. data/lib/ibex/version.rb +1 -1
  313. data/lib/ibex/watch/runner.rb +181 -0
  314. data/lib/ibex/watch/source_snapshot.rb +98 -0
  315. data/lib/ibex/watch.rb +11 -0
  316. data/lib/ibex.rb +35 -1
  317. data/schema/automaton-ir-definitions.schema.json +401 -0
  318. data/schema/automaton-ir.schema.json +65 -0
  319. data/schema/benchmark-v1.schema.json +212 -0
  320. data/schema/benchmark-v2.schema.json +61 -0
  321. data/schema/bison-import-v1.schema.json +106 -0
  322. data/schema/conflict-explanation-review-v1.schema.json +196 -0
  323. data/schema/conflict-explanation-study-v1.schema.json +528 -0
  324. data/schema/construction-profile-v1.schema.json +779 -0
  325. data/schema/cst-v1.json +170 -0
  326. data/schema/diff-v1.schema.json +41 -0
  327. data/schema/direct-ielr-decision-v1.schema.json +200 -0
  328. data/schema/equiv-v1.schema.json +64 -0
  329. data/schema/error-ux-review-v1.schema.json +609 -0
  330. data/schema/error-ux-round2-review-v1.schema.json +191 -0
  331. data/schema/error-ux-round2-v1.schema.json +519 -0
  332. data/schema/error-ux-v1.schema.json +258 -0
  333. data/schema/explain-v1.schema.json +495 -0
  334. data/schema/fix-v1.schema.json +64 -0
  335. data/schema/fix-v2.schema.json +66 -0
  336. data/schema/fix-v3.schema.json +101 -0
  337. data/schema/frontend-diagnostics-v1.schema.json +154 -0
  338. data/schema/fuzz-regression-v1.schema.json +79 -0
  339. data/schema/fuzz-v1.schema.json +114 -0
  340. data/schema/generation-manifest-v1.schema.json +115 -0
  341. data/schema/grammar-ir-extensions.schema.json +734 -0
  342. data/schema/grammar-ir-foundation.schema.json +426 -0
  343. data/schema/grammar-ir.schema.json +271 -0
  344. data/schema/ielr-benchmark-v1.schema.json +85 -0
  345. data/schema/lexer-ir-v1.schema.json +215 -0
  346. data/schema/lexer-profile-v1.schema.json +491 -0
  347. data/schema/metrics-v1.schema.json +60 -0
  348. data/schema/migration-check-v1.schema.json +60 -0
  349. data/schema/performance-comparison-v1.schema.json +395 -0
  350. data/schema/public-performance-comparison-v1.schema.json +506 -0
  351. data/schema/public-performance-profile-v1.schema.json +360 -0
  352. data/schema/reduce-v1.schema.json +22 -0
  353. data/schema/reduce-v2.schema.json +63 -0
  354. data/schema/runtime-coverage-v1.schema.json +86 -0
  355. data/schema/runtime-event-v1.schema.json +308 -0
  356. data/schema/table-artifact-v1.schema.json +377 -0
  357. data/schema/table-simulation-v1.schema.json +70 -0
  358. data/schema/verification-report-v1.schema.json +222 -0
  359. data/schema/verify-v1.schema.json +42 -0
  360. data/sig/ibex/analysis/digraph.rbs +19 -0
  361. data/sig/ibex/artifact_set.rbs +37 -0
  362. data/sig/ibex/bison_import/importer.rbs +140 -0
  363. data/sig/ibex/bison_import/tokenizer.rbs +91 -0
  364. data/sig/ibex/bison_import.rbs +95 -0
  365. data/sig/ibex/bounded_subprocess.rbs +76 -0
  366. data/sig/ibex/cli/ambiguity.rbs +28 -0
  367. data/sig/ibex/cli/analysis.rbs +43 -0
  368. data/sig/ibex/cli/bison_import.rbs +32 -0
  369. data/sig/ibex/cli/config.rbs +35 -0
  370. data/sig/ibex/cli/counterexample_options.rbs +2 -0
  371. data/sig/ibex/cli/coverage.rbs +53 -0
  372. data/sig/ibex/cli/debug.rbs +28 -0
  373. data/sig/ibex/cli/diagnostics.rbs +51 -0
  374. data/sig/ibex/cli/documentation.rbs +29 -0
  375. data/sig/ibex/cli/equiv.rbs +49 -0
  376. data/sig/ibex/cli/error_messages.rbs +63 -0
  377. data/sig/ibex/cli/explain.rbs +31 -0
  378. data/sig/ibex/cli/fix.rbs +53 -0
  379. data/sig/ibex/cli/formatting.rbs +107 -0
  380. data/sig/ibex/cli/fuzz.rbs +47 -0
  381. data/sig/ibex/cli/fuzz_regressions.rbs +40 -0
  382. data/sig/ibex/cli/generation_artifacts.rbs +69 -0
  383. data/sig/ibex/cli/generation_error_messages.rbs +19 -0
  384. data/sig/ibex/cli/grammar_tests.rbs +48 -0
  385. data/sig/ibex/cli/ir_tools.rbs +39 -0
  386. data/sig/ibex/cli/lsp.rbs +14 -0
  387. data/sig/ibex/cli/outputs.rbs +26 -3
  388. data/sig/ibex/cli/racc_migration.rbs +30 -0
  389. data/sig/ibex/cli/reduce.rbs +60 -0
  390. data/sig/ibex/cli/reduce_reporting.rbs +27 -0
  391. data/sig/ibex/cli/samples.rbs +38 -0
  392. data/sig/ibex/cli/verify.rbs +28 -0
  393. data/sig/ibex/cli/watch.rbs +43 -0
  394. data/sig/ibex/cli.rbs +182 -9
  395. data/sig/ibex/codegen/action_locations.rbs +45 -0
  396. data/sig/ibex/codegen/action_method_source.rbs +65 -0
  397. data/sig/ibex/codegen/action_source.rbs +50 -0
  398. data/sig/ibex/codegen/ambiguity.rbs +60 -0
  399. data/sig/ibex/codegen/cst_metadata.rbs +59 -0
  400. data/sig/ibex/codegen/documentation.rbs +50 -0
  401. data/sig/ibex/codegen/explain.rbs +105 -0
  402. data/sig/ibex/codegen/generated_action_abi.rbs +105 -0
  403. data/sig/ibex/codegen/html.rbs +18 -2
  404. data/sig/ibex/codegen/mermaid.rbs +16 -0
  405. data/sig/ibex/codegen/railroad.rbs +82 -0
  406. data/sig/ibex/codegen/railroad_documentation.rbs +31 -0
  407. data/sig/ibex/codegen/rbs.rbs +86 -4
  408. data/sig/ibex/codegen/report.rbs +16 -8
  409. data/sig/ibex/codegen/ruby.rbs +105 -28
  410. data/sig/ibex/codegen/ruby_actions.rbs +54 -0
  411. data/sig/ibex/codegen/ruby_ast.rbs +34 -0
  412. data/sig/ibex/codegen/ruby_error_messages.rbs +16 -0
  413. data/sig/ibex/codegen/ruby_lexer.rbs +25 -0
  414. data/sig/ibex/codegen/ruby_syntax.rbs +27 -0
  415. data/sig/ibex/codegen/ruby_table_metadata.rbs +26 -0
  416. data/sig/ibex/codegen/ruby_value_printers.rbs +28 -0
  417. data/sig/ibex/configuration/analysis_grammar.rbs +13 -0
  418. data/sig/ibex/configuration/explanation.rbs +195 -0
  419. data/sig/ibex/configuration/inspector.rbs +53 -0
  420. data/sig/ibex/configuration.rbs +242 -0
  421. data/sig/ibex/coverage/collector.rbs +78 -0
  422. data/sig/ibex/coverage/event_stream.rbs +44 -0
  423. data/sig/ibex/coverage/report.rbs +102 -0
  424. data/sig/ibex/coverage/runtime_event_validator.rbs +70 -0
  425. data/sig/ibex/coverage.rbs +7 -0
  426. data/sig/ibex/delta_reducer.rbs +38 -0
  427. data/sig/ibex/diff.rbs +47 -0
  428. data/sig/ibex/equiv/machine.rbs +54 -0
  429. data/sig/ibex/equiv.rbs +129 -0
  430. data/sig/ibex/error_messages/parser.rbs +58 -0
  431. data/sig/ibex/error_messages/parser_v2.rbs +67 -0
  432. data/sig/ibex/error_messages/renderer.rbs +23 -0
  433. data/sig/ibex/error_messages/sentence_search.rbs +80 -0
  434. data/sig/ibex/error_messages/update.rbs +43 -0
  435. data/sig/ibex/error_messages.rbs +85 -0
  436. data/sig/ibex/fix.rbs +138 -0
  437. data/sig/ibex/frontend/ast.rbs +237 -22
  438. data/sig/ibex/frontend/bootstrap_parser.rbs +13 -0
  439. data/sig/ibex/frontend/diagnostic.rbs +53 -0
  440. data/sig/ibex/frontend/diagnostic_recovery.rbs +98 -0
  441. data/sig/ibex/frontend/dsl.rbs +33 -4
  442. data/sig/ibex/frontend/formatter.rbs +143 -0
  443. data/sig/ibex/frontend/generated_parser.rbs +228 -68
  444. data/sig/ibex/frontend/generated_parser_base.rbs +65 -12
  445. data/sig/ibex/frontend/generated_parser_includes.rbs +23 -0
  446. data/sig/ibex/frontend/generated_parser_metadata.rbs +23 -0
  447. data/sig/ibex/frontend/generated_parser_parameters.rbs +24 -0
  448. data/sig/ibex/frontend/generation.rbs +6 -0
  449. data/sig/ibex/frontend/lexer.rbs +49 -2
  450. data/sig/ibex/frontend/lexer_recovery.rbs +25 -0
  451. data/sig/ibex/frontend/parser/declarations.rbs +57 -0
  452. data/sig/ibex/frontend/parser/parameters.rbs +28 -0
  453. data/sig/ibex/frontend/parser/rules.rbs +3 -0
  454. data/sig/ibex/frontend/parser.rbs +66 -0
  455. data/sig/ibex/frontend/parser_configuration_support.rbs +27 -0
  456. data/sig/ibex/frontend/regenerator.rbs +11 -0
  457. data/sig/ibex/frontend/resolution.rbs +34 -0
  458. data/sig/ibex/frontend/resolver.rbs +91 -0
  459. data/sig/ibex/frontend/rule_documentation.rbs +42 -0
  460. data/sig/ibex/frontend/source_cursor.rbs +38 -5
  461. data/sig/ibex/frontend/source_document.rbs +119 -0
  462. data/sig/ibex/frontend/source_loader.rbs +66 -0
  463. data/sig/ibex/frontend/source_span.rbs +56 -0
  464. data/sig/ibex/frontend/token_adapter/declaration_document_state.rbs +21 -0
  465. data/sig/ibex/frontend/token_adapter/declaration_lexer_state.rbs +27 -0
  466. data/sig/ibex/frontend/token_adapter/declaration_state.rbs +83 -3
  467. data/sig/ibex/frontend/token_adapter/rule_state.rbs +20 -0
  468. data/sig/ibex/frontend/token_adapter.rbs +11 -2
  469. data/sig/ibex/frontend.rbs +1 -1
  470. data/sig/ibex/fuzz.rbs +71 -0
  471. data/sig/ibex/generation_input.rbs +37 -0
  472. data/sig/ibex/generation_manifest.rbs +70 -0
  473. data/sig/ibex/generation_transaction.rbs +82 -0
  474. data/sig/ibex/generation_transaction_recovery.rbs +36 -0
  475. data/sig/ibex/generation_transaction_validation.rbs +65 -0
  476. data/sig/ibex/grammar_tests.rbs +93 -0
  477. data/sig/ibex/ir/automaton_ir.rbs +35 -10
  478. data/sig/ibex/ir/grammar_ir.rbs +96 -22
  479. data/sig/ibex/ir/lexer_ir.rbs +57 -0
  480. data/sig/ibex/ir/parser_contract.rbs +69 -0
  481. data/sig/ibex/ir/serialize.rbs +75 -23
  482. data/sig/ibex/ir/validator/automaton.rbs +112 -0
  483. data/sig/ibex/ir/validator/base.rbs +69 -0
  484. data/sig/ibex/ir/validator/grammar.rbs +195 -0
  485. data/sig/ibex/ir/validator/lexer.rbs +37 -0
  486. data/sig/ibex/ir/validator.rbs +16 -0
  487. data/sig/ibex/ir.rbs +45 -5
  488. data/sig/ibex/lalr/build_metrics.rbs +60 -0
  489. data/sig/ibex/lalr/builder.rbs +150 -19
  490. data/sig/ibex/lalr/conflict_search.rbs +12 -5
  491. data/sig/ibex/lalr/counterexample.rbs +20 -14
  492. data/sig/ibex/lalr/direct_lookaheads.rbs +93 -0
  493. data/sig/ibex/lalr/goto_follows.rbs +89 -0
  494. data/sig/ibex/lalr/ielr/annotator.rbs +67 -0
  495. data/sig/ibex/lalr/ielr/bits.rbs +14 -0
  496. data/sig/ibex/lalr/ielr/inadequacy.rbs +24 -0
  497. data/sig/ibex/lalr/ielr/item_lookaheads.rbs +35 -0
  498. data/sig/ibex/lalr/ielr/pipeline.rbs +17 -0
  499. data/sig/ibex/lalr/ielr/split_stability.rbs +27 -0
  500. data/sig/ibex/lalr/ielr/split_state.rbs +14 -0
  501. data/sig/ibex/lalr/ielr/state_splitter.rbs +76 -0
  502. data/sig/ibex/lalr/ielr_partition.rbs +71 -0
  503. data/sig/ibex/lalr/inadequacy_report.rbs +21 -0
  504. data/sig/ibex/lalr/lookahead_propagation.rbs +38 -0
  505. data/sig/ibex/lalr/lr0_collection.rbs +50 -0
  506. data/sig/ibex/lalr/on_error_reductions.rbs +22 -0
  507. data/sig/ibex/lalr/unreachable_states.rbs +25 -0
  508. data/sig/ibex/lalr.rbs +17 -1
  509. data/sig/ibex/location.rbs +67 -0
  510. data/sig/ibex/lsp/document_handlers.rbs +24 -0
  511. data/sig/ibex/lsp/document_store.rbs +94 -0
  512. data/sig/ibex/lsp/document_store_diagnostics.rbs +20 -0
  513. data/sig/ibex/lsp/document_store_validation.rbs +26 -0
  514. data/sig/ibex/lsp/initialization_handlers.rbs +30 -0
  515. data/sig/ibex/lsp/navigation_handlers.rbs +33 -0
  516. data/sig/ibex/lsp/parser_configuration_assistance.rbs +49 -0
  517. data/sig/ibex/lsp/position_codec.rbs +44 -0
  518. data/sig/ibex/lsp/protocol_error.rbs +32 -0
  519. data/sig/ibex/lsp/request_handlers.rbs +26 -0
  520. data/sig/ibex/lsp/request_support.rbs +40 -0
  521. data/sig/ibex/lsp/server.rbs +55 -0
  522. data/sig/ibex/lsp/symbol_index.rbs +77 -0
  523. data/sig/ibex/lsp/symbol_index_builder.rbs +88 -0
  524. data/sig/ibex/lsp/symbol_index_precedence_references.rbs +18 -0
  525. data/sig/ibex/lsp/symbol_index_source_queries.rbs +26 -0
  526. data/sig/ibex/lsp/symbol_occurrence.rbs +31 -0
  527. data/sig/ibex/lsp/transport.rbs +47 -0
  528. data/sig/ibex/lsp/workspace.rbs +42 -0
  529. data/sig/ibex/lsp/workspace_analyzer.rbs +69 -0
  530. data/sig/ibex/lsp.rbs +7 -0
  531. data/sig/ibex/messages.rbs +26 -0
  532. data/sig/ibex/metrics.rbs +50 -0
  533. data/sig/ibex/normalize/declarations.rbs +31 -0
  534. data/sig/ibex/normalize/diagnostics.rbs +13 -4
  535. data/sig/ibex/normalize/expander.rbs +22 -16
  536. data/sig/ibex/normalize/expression.rbs +11 -9
  537. data/sig/ibex/normalize/grammar_builder.rbs +11 -0
  538. data/sig/ibex/normalize/inline_expansion.rbs +129 -0
  539. data/sig/ibex/normalize/inline_validation.rbs +40 -0
  540. data/sig/ibex/normalize/lexer.rbs +37 -0
  541. data/sig/ibex/normalize/named_references.rbs +20 -0
  542. data/sig/ibex/normalize/nodes.rbs +14 -0
  543. data/sig/ibex/normalize/parameter_ebnf_lowering.rbs +33 -0
  544. data/sig/ibex/normalize/parameter_lowering.rbs +35 -0
  545. data/sig/ibex/normalize/parameter_substitution.rbs +42 -0
  546. data/sig/ibex/normalize/parameter_validation.rbs +44 -0
  547. data/sig/ibex/normalize/parameters.rbs +51 -0
  548. data/sig/ibex/normalize/parser_configuration.rbs +23 -0
  549. data/sig/ibex/normalize/recovery_declarations.rbs +24 -0
  550. data/sig/ibex/normalize.rbs +129 -18
  551. data/sig/ibex/racc_migration/checker.rbs +36 -0
  552. data/sig/ibex/racc_migration/harness.rbs +16 -0
  553. data/sig/ibex/racc_migration/report.rbs +55 -0
  554. data/sig/ibex/racc_migration.rbs +8 -0
  555. data/sig/ibex/rake_task.rbs +51 -0
  556. data/sig/ibex/samples.rbs +60 -0
  557. data/sig/ibex/table_artifact/builder.rbs +93 -0
  558. data/sig/ibex/table_artifact/cst_projection.rbs +20 -0
  559. data/sig/ibex/table_artifact/document.rbs +27 -0
  560. data/sig/ibex/table_artifact/executor.rbs +66 -0
  561. data/sig/ibex/table_artifact/serializer.rbs +25 -0
  562. data/sig/ibex/table_artifact/validator/metadata.rbs +52 -0
  563. data/sig/ibex/table_artifact/validator/support.rbs +46 -0
  564. data/sig/ibex/table_artifact/validator/tables.rbs +63 -0
  565. data/sig/ibex/table_artifact/validator.rbs +66 -0
  566. data/sig/ibex/table_artifact.rbs +32 -0
  567. data/sig/ibex/table_simulation/result.rbs +36 -0
  568. data/sig/ibex/table_simulation/simulator.rbs +98 -0
  569. data/sig/ibex/table_simulation/step.rbs +42 -0
  570. data/sig/ibex/table_simulation/text.rbs +14 -0
  571. data/sig/ibex/table_simulation.rbs +7 -0
  572. data/sig/ibex/tables.rbs +10 -35
  573. data/sig/ibex/verifiable_generation_bundle.rbs +24 -0
  574. data/sig/ibex/verification_report/builder.rbs +53 -0
  575. data/sig/ibex/verification_report/canonical_ir.rbs +41 -0
  576. data/sig/ibex/verification_report/logical_path.rbs +34 -0
  577. data/sig/ibex/verification_report/validator.rbs +114 -0
  578. data/sig/ibex/verification_report.rbs +44 -0
  579. data/sig/ibex/verify/action_correspondence.rbs +50 -0
  580. data/sig/ibex/verify/language_witness.rbs +112 -0
  581. data/sig/ibex/verify/reference_collection.rbs +63 -0
  582. data/sig/ibex/verify/result.rbs +52 -0
  583. data/sig/ibex/verify/verifier.rbs +170 -0
  584. data/sig/ibex/verify.rbs +6 -0
  585. data/sig/ibex/watch/runner.rbs +58 -0
  586. data/sig/ibex/watch/source_snapshot.rbs +46 -0
  587. data/sig/ibex/watch.rbs +7 -0
  588. data/sig/ibex.rbs +2 -0
  589. metadata +524 -19
  590. data/.rubocop.yml +0 -43
  591. data/CHANGELOG.md +0 -30
  592. data/Rakefile +0 -25
  593. data/Steepfile +0 -10
  594. data/docs/compat-notes.md +0 -37
  595. data/docs/lexer-coverage.md +0 -14
  596. data/docs/phase10-extensions.md +0 -27
  597. data/gemfiles/Gemfile +0 -7
  598. data/gemfiles/Gemfile.lock +0 -98
  599. data/lib/ibex/frontend/grammar.y +0 -156
  600. data/lib/ibex/runtime/parser.rb +0 -360
  601. data/lib/ibex/runtime.rb +0 -8
  602. data/sig/ibex/runtime/parser.rbs +0 -167
  603. data/sig/ibex/runtime.rbs +0 -6
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibex
4
+ module Frontend
5
+ # Normalizes grammar source without changing its bytes.
6
+ module SourceEncoding
7
+ # @rbs (String source, String file) -> String
8
+ def self.validated_utf8(source, file)
9
+ validated = source.dup.force_encoding(Encoding::UTF_8)
10
+ raise Ibex::Error, "#{file}: input must be valid UTF-8" unless validated.valid_encoding?
11
+
12
+ validated.freeze
13
+ end
14
+
15
+ # @rbs (String file) -> String
16
+ def self.validated_file(file)
17
+ validated = file.dup.force_encoding(Encoding::UTF_8)
18
+ raise Ibex::Error, "#{file}: file path must be valid UTF-8" unless validated.valid_encoding?
19
+
20
+ validated.freeze
21
+ end
22
+ end
23
+
24
+ # An immutable position in grammar source.
25
+ class SourcePosition
26
+ attr_reader :byte_offset #: Integer
27
+ attr_reader :line #: Integer
28
+ attr_reader :column #: Integer
29
+
30
+ # @rbs (byte_offset: Integer, line: Integer, column: Integer) -> void
31
+ def initialize(byte_offset:, line:, column:)
32
+ raise ArgumentError, "byte_offset must be non-negative" if byte_offset.negative?
33
+ raise ArgumentError, "line and column must be positive" unless line.positive? && column.positive?
34
+
35
+ @byte_offset = byte_offset
36
+ @line = line
37
+ @column = column
38
+ freeze
39
+ end
40
+
41
+ # @rbs () -> Hash[Symbol, Integer]
42
+ def to_h
43
+ { byte_offset: byte_offset, line: line, column: column }
44
+ end
45
+ end
46
+
47
+ # An immutable half-open byte span in one grammar source.
48
+ class SourceSpan
49
+ attr_reader :file #: String
50
+ attr_reader :start #: SourcePosition
51
+ attr_reader :finish #: SourcePosition
52
+
53
+ # @rbs (file: String, start: SourcePosition, finish: SourcePosition) -> void
54
+ def initialize(file:, start:, finish:)
55
+ raise ArgumentError, "span end precedes its start" if finish.byte_offset < start.byte_offset
56
+
57
+ @file = file.dup.freeze
58
+ @start = start
59
+ @finish = finish
60
+ freeze
61
+ end
62
+
63
+ # @rbs () -> Integer
64
+ def start_byte
65
+ start.byte_offset
66
+ end
67
+
68
+ # @rbs () -> Integer
69
+ def end_byte
70
+ finish.byte_offset
71
+ end
72
+
73
+ # @rbs () -> Integer
74
+ def length
75
+ end_byte - start_byte
76
+ end
77
+
78
+ # @rbs () -> bool
79
+ def empty?
80
+ length.zero?
81
+ end
82
+
83
+ # @rbs () -> Hash[Symbol, Object?]
84
+ def to_h
85
+ { file: file, start: start.to_h, end: finish.to_h }
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibex
4
+ module Frontend
5
+ class TokenAdapter
6
+ # Root/fragment header and include-path transitions for declaration classification.
7
+ module DeclarationDocumentState
8
+ private
9
+
10
+ # @rbs (Token token) -> external_token
11
+ def class_keyword(token)
12
+ # @type self: DeclarationState
13
+ value = string_value(token)
14
+ if value == "fragment"
15
+ raise Ibex::Error, "#{token.location}: fragments require extended mode" unless @extended_mode
16
+
17
+ @fragment = true
18
+ @state = :declaration
19
+ return :FRAGMENT
20
+ end
21
+ return :IDENTIFIER unless value == "class"
22
+
23
+ @state = :class_name
24
+ :CLASS
25
+ end
26
+
27
+ # @rbs (external_token type) -> external_token?
28
+ def classify_include(type)
29
+ # @type self: DeclarationState
30
+ return unless @state == :include_path && type == :LITERAL
31
+
32
+ @state = :declaration
33
+ @declaration = nil
34
+ type
35
+ end
36
+
37
+ # @rbs (Token token, String value) -> void
38
+ def reject_fragment_pragma(token, value)
39
+ # @type self: DeclarationState
40
+ return unless @fragment && value == "pragma"
41
+
42
+ raise Ibex::Error, "#{token.location}: pragma declarations are not allowed in fragments"
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -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,57 @@
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],
29
+ "parser" => %i[PARSER parser_key],
12
30
  "rule" => %i[RULE rules]
13
31
  }.freeze #: Hash[String, [external_token, Symbol]]
14
32
  ASSOCIATIONS = {
15
- "left" => :LEFT, "right" => :RIGHT, "nonassoc" => :NONASSOC
33
+ "left" => :LEFT, "right" => :RIGHT, "nonassoc" => :NONASSOC, "precedence" => :PRECEDENCE
16
34
  }.freeze #: Hash[String, external_token]
17
35
  SCALAR_TYPES = {
18
- literal: :LITERAL, integer: :INTEGER, action: :ACTION, user_code: :USER_CODE
36
+ literal: :LITERAL, regexp: :REGEXP, integer: :INTEGER, action: :ACTION, user_code: :USER_CODE
19
37
  }.freeze #: Hash[Symbol, external_token]
20
38
  EXPECTATIONS = {
21
39
  class_keyword: "class", class_name: "identifier", superclass_name: "identifier",
22
- expect_integer: "integer", start_symbol: "a grammar symbol"
40
+ expect_integer: "integer", expect_rr_integer: "integer",
41
+ start_first_symbol: "a grammar symbol", start_symbols: "a grammar symbol",
42
+ include_path: "a double-quoted relative path",
43
+ display_symbol: "a grammar symbol", type_symbol: "a grammar symbol",
44
+ display_value: "a quoted string", type_value: "a quoted string",
45
+ param_name: "an identifier", param_type: "a quoted type or declaration",
46
+ printer_symbol: "a grammar symbol", printer_action: "an action",
47
+ recover_kind: "sync", recovery_colon: ":", recovery_first_symbol: "a grammar symbol",
48
+ recovery_symbols: "a grammar symbol", on_error_reduce_first_symbol: "a grammar symbol",
49
+ on_error_reduce_symbols: "a grammar symbol", test_expectation: "accept or reject",
50
+ test_source: "a double-quoted string",
51
+ lexer_entries: "a lexer rule, state, or end", lexer_state_name: "a state name",
52
+ lexer_state_do: "do", lexer_pattern: "a regular expression or quoted literal",
53
+ lexer_action_or_entry: "an action, lexer rule, state, or end",
54
+ parser_key: "a parser setting or end", parser_value: "a parser setting value"
23
55
  }.freeze #: Hash[Symbol, String]
24
56
 
25
57
  attr_reader :conversion_name #: Token?
@@ -27,8 +59,15 @@ module Ibex
27
59
  attr_reader :precedence_closer #: String?
28
60
  attr_reader :state #: Symbol
29
61
 
30
- # @rbs () -> void
31
- def initialize
62
+ # @rbs @extended_mode: bool
63
+ # @rbs @fragment: bool?
64
+ # @rbs @pragmas: Hash[String, Location]
65
+ # @rbs @pragma_location: Location?
66
+
67
+ # @rbs (?extended: bool) -> void
68
+ def initialize(extended: false)
69
+ @extended_mode = extended
70
+ @pragmas = {} #: Hash[String, Location]
32
71
  @state = :class_keyword
33
72
  end
34
73
 
@@ -47,7 +86,22 @@ module Ibex
47
86
 
48
87
  # @rbs () -> bool
49
88
  def extended_pragma?
50
- @extended_pragma == true
89
+ @pragmas.key?("extended")
90
+ end
91
+
92
+ # @rbs () -> bool
93
+ def cst_pragma?
94
+ @pragmas.key?("cst")
95
+ end
96
+
97
+ # @rbs () -> Location?
98
+ def extended_pragma_location
99
+ @pragmas["extended"]
100
+ end
101
+
102
+ # @rbs () -> Location?
103
+ def cst_pragma_location
104
+ @pragmas["cst"]
51
105
  end
52
106
 
53
107
  # @rbs (Token? token) -> String?
@@ -70,25 +124,50 @@ module Ibex
70
124
 
71
125
  # @rbs (Token token, Array[Token] remaining) -> external_token
72
126
  def classify_identifier(token, remaining)
127
+ return classify_lexer_identifier(token) if lexer_declaration_state?
128
+
73
129
  case @state
74
130
  when :class_keyword then class_keyword(token)
75
131
  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)
132
+ when :declaration, :param_type then begin_declaration(token)
133
+ when :token_symbols
134
+ @token_alias_candidate = token
135
+ declaration_symbol(token)
136
+ when :options_identifiers, :start_symbols, :recovery_symbols, :on_error_reduce_symbols
137
+ declaration_symbol(token)
78
138
  when :precedence_association, :precedence_symbols then precedence_identifier(token)
79
- when :start_symbol then finish_single_symbol(:IDENTIFIER)
139
+ when :start_first_symbol then continue_start_symbols(:IDENTIFIER)
140
+ when :display_symbol, :type_symbol then begin_metadata_value(:IDENTIFIER)
141
+ when :param_name then begin_param_type
142
+ when :printer_symbol then begin_printer_action(:IDENTIFIER)
143
+ when :recover_kind then begin_recovery_colon(token)
144
+ when :recovery_first_symbol then continue_recovery_symbols(:IDENTIFIER)
145
+ when :on_error_reduce_first_symbol then continue_on_error_reduce_symbols(:IDENTIFIER)
146
+ when :test_expectation then begin_test_source(token)
80
147
  when :pragma_value then finish_pragma(token)
81
148
  when :convert_name then begin_conversion(token, :IDENTIFIER, remaining)
149
+ when :parser_key then begin_parser_setting(token)
150
+ when :parser_value then finish_parser_setting
82
151
  else :IDENTIFIER
83
152
  end
84
153
  end
85
154
 
86
155
  # @rbs (Token token) -> external_token
87
- def class_keyword(token)
88
- return :IDENTIFIER unless string_value(token) == "class"
156
+ def begin_parser_setting(token)
157
+ if string_value(token) == "end"
158
+ @state = :declaration
159
+ @declaration = nil
160
+ return :END
161
+ end
162
+
163
+ @state = :parser_value
164
+ :IDENTIFIER
165
+ end
89
166
 
90
- @state = :class_name
91
- :CLASS
167
+ # @rbs () -> external_token
168
+ def finish_parser_setting
169
+ @state = :parser_key
170
+ :IDENTIFIER
92
171
  end
93
172
 
94
173
  # @rbs (Array[Token] remaining) -> external_token
@@ -111,11 +190,13 @@ module Ibex
111
190
  value = string_value(token)
112
191
  return begin_precedence(token) if %w[prechigh preclow].include?(value)
113
192
 
114
- raise Ibex::Error, "#{token.location}: duplicate pragma extended" if value == "pragma" && @extended_pragma
193
+ reject_fragment_pragma(token, value)
115
194
 
116
195
  terminal, next_state = DECLARATIONS[value]
117
196
  return :IDENTIFIER unless terminal
118
197
 
198
+ @pragma_location = token.location if terminal == :PRAGMA
199
+ @token_alias_candidate = nil
119
200
  @state = next_state
120
201
  @declaration = value.to_sym unless terminal == :RULE
121
202
  @declaration = nil if terminal == :RULE
@@ -125,9 +206,13 @@ module Ibex
125
206
  # @rbs (Token token) -> external_token
126
207
  def finish_pragma(token)
127
208
  value = string_value(token)
128
- raise Ibex::Error, "#{token.location}: unknown pragma #{value}" unless value == "extended"
209
+ raise Ibex::Error, "#{token.location}: unknown pragma #{value}" unless %w[extended cst].include?(value)
210
+
211
+ location = @pragma_location || token.location
212
+ raise Ibex::Error, "#{location}: duplicate pragma #{value}" if @pragmas[value]
129
213
 
130
- @extended_pragma = true
214
+ @pragmas[value] = location
215
+ @pragma_location = nil
131
216
  @state = :declaration
132
217
  @declaration = nil
133
218
  :IDENTIFIER
@@ -151,9 +236,16 @@ module Ibex
151
236
 
152
237
  # @rbs (String value) -> bool
153
238
  def declaration_boundary?(value)
239
+ return false if %w[display type param printer].include?(value) && !extended_features?
240
+
154
241
  DECLARATIONS.key?(value) || %w[prechigh preclow].include?(value)
155
242
  end
156
243
 
244
+ # @rbs () -> bool
245
+ def extended_features?
246
+ @extended_mode || extended_pragma? || cst_pragma?
247
+ end
248
+
157
249
  # @rbs (Token token) -> external_token
158
250
  def precedence_identifier(token)
159
251
  value = string_value(token)
@@ -189,14 +281,80 @@ module Ibex
189
281
  # @rbs (Token token, Array[Token] remaining) -> external_token
190
282
  def classify_scalar(token, remaining)
191
283
  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
284
+ classified = classify_lexer_scalar(type) ||
285
+ classify_token_alias(token, type) || classify_include(type) || classify_single_symbol(type) ||
286
+ classify_metadata(type) || classify_printer(type) || classify_grammar_test(type) ||
287
+ classify_conversion(token, type, remaining)
196
288
 
289
+ classified || type
290
+ end
291
+
292
+ # @rbs (external_token type) -> external_token?
293
+ def classify_single_symbol(type)
294
+ return finish_single_symbol(type) if %i[expect_integer expect_rr_integer].include?(@state) && type == :INTEGER
295
+
296
+ first = continue_first_symbol(type)
297
+ return first if first
298
+
299
+ type if @state == :start_symbols && type == :LITERAL
300
+ end
301
+
302
+ # @rbs (external_token type) -> external_token?
303
+ def continue_first_symbol(type)
304
+ return unless type == :LITERAL
305
+ return continue_start_symbols(type) if @state == :start_first_symbol
306
+ return continue_recovery_symbols(type) if @state == :recovery_first_symbol
307
+
308
+ continue_on_error_reduce_symbols(type) if @state == :on_error_reduce_first_symbol
309
+ end
310
+
311
+ # @rbs (Token token, external_token type) -> external_token?
312
+ def classify_token_alias(token, type)
313
+ candidate = @token_alias_candidate
314
+ return unless extended_features? && @state == :token_symbols &&
315
+ type == :LITERAL && candidate
316
+ return unless candidate.location.line == token.location.line
317
+
318
+ @token_alias_candidate = nil
319
+ :TOKEN_ALIAS
320
+ end
321
+
322
+ # @rbs (external_token type) -> external_token?
323
+ def classify_metadata(type)
324
+ return unless type == :LITERAL
325
+ return begin_metadata_value(type) if %i[display_symbol type_symbol].include?(@state)
326
+ return finish_param_type(type) if @state == :param_type
327
+
328
+ finish_metadata_value(type) if %i[display_value type_value].include?(@state)
329
+ end
330
+
331
+ # @rbs (external_token type) -> external_token?
332
+ def classify_printer(type)
333
+ return begin_printer_action(type) if @state == :printer_symbol && type == :LITERAL
334
+ return unless @state == :printer_action && type == :ACTION
335
+
336
+ @state = :declaration
337
+ @declaration = nil
338
+ type
339
+ end
340
+
341
+ # @rbs (external_token type) -> external_token?
342
+ def classify_grammar_test(type)
343
+ return unless @state == :test_source && type == :LITERAL
344
+
345
+ @state = :declaration
346
+ @declaration = nil
197
347
  type
198
348
  end
199
349
 
350
+ # @rbs (Token token, external_token type, Array[Token] remaining) -> external_token?
351
+ def classify_conversion(token, type, remaining)
352
+ return unless type == :LITERAL
353
+ return begin_conversion(token, type, remaining) if @state == :convert_name
354
+
355
+ finish_conversion(type) if @state == :convert_expression
356
+ end
357
+
200
358
  # @rbs (external_token type) -> external_token
201
359
  def finish_single_symbol(type)
202
360
  @state = :declaration
@@ -204,6 +362,68 @@ module Ibex
204
362
  type
205
363
  end
206
364
 
365
+ # @rbs (external_token type) -> external_token
366
+ def continue_start_symbols(type)
367
+ @state = :start_symbols
368
+ type
369
+ end
370
+
371
+ # @rbs (external_token type) -> external_token
372
+ def continue_recovery_symbols(type)
373
+ @state = :recovery_symbols
374
+ type
375
+ end
376
+
377
+ # @rbs (external_token type) -> external_token
378
+ def continue_on_error_reduce_symbols(type)
379
+ @state = :on_error_reduce_symbols
380
+ type
381
+ end
382
+
383
+ # @rbs (external_token type) -> external_token
384
+ def begin_metadata_value(type)
385
+ @state = @state == :display_symbol ? :display_value : :type_value
386
+ type
387
+ end
388
+
389
+ # @rbs () -> external_token
390
+ def begin_param_type
391
+ @state = :param_type
392
+ :IDENTIFIER
393
+ end
394
+
395
+ # @rbs (external_token type) -> external_token
396
+ def begin_printer_action(type)
397
+ @state = :printer_action
398
+ type
399
+ end
400
+
401
+ # @rbs (Token token) -> external_token
402
+ def begin_recovery_colon(_token)
403
+ @state = :recovery_colon
404
+ :IDENTIFIER
405
+ end
406
+
407
+ # @rbs (Token token) -> external_token
408
+ def begin_test_source(_token)
409
+ @state = :test_source
410
+ :IDENTIFIER
411
+ end
412
+
413
+ # @rbs (external_token type) -> external_token
414
+ def finish_param_type(type)
415
+ @state = :declaration
416
+ @declaration = nil
417
+ type
418
+ end
419
+
420
+ # @rbs (external_token type) -> external_token
421
+ def finish_metadata_value(type)
422
+ @state = :declaration
423
+ @declaration = nil
424
+ type
425
+ end
426
+
207
427
  # @rbs (external_token type) -> external_token
208
428
  def finish_conversion(type)
209
429
  @state = :convert_name
@@ -214,6 +434,7 @@ module Ibex
214
434
  # @rbs (Token token) -> external_token
215
435
  def classify_punctuation(token)
216
436
  @state = :superclass_name if @state == :superclass_marker && token.type == :<
437
+ @state = :recovery_first_symbol if @state == :recovery_colon && token.type == :":"
217
438
  string_value(token)
218
439
  end
219
440
 
@@ -232,7 +453,7 @@ module Ibex
232
453
  def precedence_expectation(token)
233
454
  return @precedence_closer if token&.type == :eof
234
455
 
235
- "left or right or nonassoc" if @state == :precedence_association
456
+ "left or right or nonassoc or precedence" if @state == :precedence_association
236
457
  end
237
458
 
238
459
  # @rbs (Token token) -> String
@@ -243,6 +464,7 @@ module Ibex
243
464
  raise Ibex::Error, "#{token.location}: expected text token"
244
465
  end
245
466
  end
467
+ # rubocop:enable Metrics/ClassLength, Metrics/CyclomaticComplexity
246
468
  end
247
469
  end
248
470
  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