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
@@ -2,7 +2,8 @@
2
2
 
3
3
  module Ibex
4
4
  module IR
5
- SCHEMA_VERSION = 1
5
+ SCHEMA_VERSION = 2
6
+ SUPPORTED_SCHEMA_VERSIONS = [1, 2].freeze #: Array[Integer]
6
7
 
7
8
  # @rbs (untyped value) -> untyped
8
9
  def deep_freeze(value)
@@ -26,16 +27,23 @@ module Ibex
26
27
  attr_reader :reserved #: bool
27
28
  attr_reader :precedence #: precedence?
28
29
  attr_reader :location #: location?
30
+ attr_reader :display_name #: String?
31
+ attr_reader :semantic_type #: String?
32
+ attr_reader :documentation #: String?
29
33
 
30
34
  # @rbs (id: Integer, name: String, kind: Symbol, ?reserved: bool, ?precedence: precedence?,
31
- # ?location: location?) -> void
32
- def initialize(id:, name:, kind:, reserved: false, precedence: nil, location: nil)
35
+ # ?location: location?, ?display_name: String?, ?semantic_type: String?, ?documentation: String?) -> void
36
+ def initialize(id:, name:, kind:, reserved: false, precedence: nil, location: nil, display_name: nil,
37
+ semantic_type: nil, documentation: nil)
33
38
  @id = id
34
39
  @name = name.freeze
35
40
  @kind = kind.to_sym
36
41
  @reserved = reserved
37
42
  @precedence = IR.deep_freeze(precedence)
38
43
  @location = IR.deep_freeze(location)
44
+ @display_name = display_name&.freeze
45
+ @semantic_type = semantic_type&.freeze
46
+ @documentation = documentation&.freeze
39
47
  freeze
40
48
  end
41
49
 
@@ -44,9 +52,14 @@ module Ibex
44
52
  # @rbs () -> bool
45
53
  def nonterminal? = @kind == :nonterminal
46
54
 
47
- # @rbs () -> Hash[Symbol, untyped]
48
- def to_h
49
- { id: @id, name: @name, kind: @kind, reserved: @reserved, prec: @precedence, loc: @location }
55
+ # @rbs (?schema_version: Integer) -> Hash[Symbol, untyped]
56
+ def to_h(schema_version: SCHEMA_VERSION)
57
+ value = { id: @id, name: @name, kind: @kind, reserved: @reserved,
58
+ prec: @precedence, loc: @location } #: Hash[Symbol, untyped]
59
+ value[:display_name] = @display_name if @display_name
60
+ value[:semantic_type] = @semantic_type if @semantic_type
61
+ value[:doc] = @documentation if schema_version >= 2
62
+ value
50
63
  end
51
64
  end
52
65
 
@@ -56,19 +69,25 @@ module Ibex
56
69
  attr_reader :location #: location
57
70
  attr_reader :named_refs #: Array[named_ref]
58
71
  attr_reader :context_length #: Integer
72
+ attr_reader :composition #: action_composition?
59
73
 
60
- # @rbs (code: String, location: location, ?named_refs: Array[named_ref], ?context_length: Integer) -> void
61
- def initialize(code:, location:, named_refs: [], context_length: 0)
74
+ # @rbs (code: String, location: location, ?named_refs: Array[named_ref], ?context_length: Integer,
75
+ # ?composition: action_composition?) -> void
76
+ def initialize(code:, location:, named_refs: [], context_length: 0, composition: nil)
62
77
  @code = code.freeze
63
78
  @location = IR.deep_freeze(location)
64
79
  @named_refs = IR.deep_freeze(named_refs)
65
80
  @context_length = context_length
81
+ @composition = IR.deep_freeze(composition)
66
82
  freeze
67
83
  end
68
84
 
69
- # @rbs () -> Hash[Symbol, untyped]
70
- def to_h
71
- { code: @code, loc: @location, named_refs: @named_refs, context_length: @context_length }
85
+ # @rbs (?schema_version: Integer) -> Hash[Symbol, untyped]
86
+ def to_h(schema_version: SCHEMA_VERSION)
87
+ value = { code: @code, loc: @location, named_refs: @named_refs,
88
+ context_length: @context_length } #: Hash[Symbol, untyped]
89
+ value[:composition] = @composition if schema_version >= 2
90
+ value
72
91
  end
73
92
  end
74
93
 
@@ -80,23 +99,37 @@ module Ibex
80
99
  attr_reader :action #: Action?
81
100
  attr_reader :precedence_override #: Integer?
82
101
  attr_reader :origin #: Hash[Symbol, untyped]
102
+ attr_reader :documentation #: String?
103
+ attr_reader :expansion #: production_expansion?
104
+ attr_reader :node #: node_annotation?
83
105
 
84
106
  # @rbs (id: Integer, lhs: Integer, rhs: Array[Integer], action: Action?, precedence_override: Integer?,
85
- # origin: Hash[Symbol, untyped]) -> void
86
- def initialize(id:, lhs:, rhs:, action:, precedence_override:, origin:)
107
+ # origin: Hash[Symbol, untyped], ?documentation: String?, ?expansion: production_expansion?,
108
+ # ?node: node_annotation?) -> void
109
+ def initialize(id:, lhs:, rhs:, action:, precedence_override:, origin:, documentation: nil, expansion: nil,
110
+ node: nil)
87
111
  @id = id
88
112
  @lhs = lhs
89
113
  @rhs = rhs.freeze
90
114
  @action = action
91
115
  @precedence_override = precedence_override
92
116
  @origin = IR.deep_freeze(origin)
117
+ @documentation = documentation&.freeze
118
+ @expansion = IR.deep_freeze(expansion)
119
+ @node = IR.deep_freeze(node)
93
120
  freeze
94
121
  end
95
122
 
96
- # @rbs () -> Hash[Symbol, untyped]
97
- def to_h
98
- { id: @id, lhs: @lhs, rhs: @rhs, action: @action&.to_h, prec_override: @precedence_override,
99
- origin: @origin }
123
+ # @rbs (?schema_version: Integer) -> Hash[Symbol, untyped]
124
+ def to_h(schema_version: SCHEMA_VERSION)
125
+ value = { id: @id, lhs: @lhs, rhs: @rhs, action: @action&.to_h(schema_version: schema_version),
126
+ prec_override: @precedence_override, origin: @origin } #: Hash[Symbol, untyped]
127
+ if schema_version >= 2
128
+ value[:doc] = @documentation
129
+ value[:expansion] = @expansion
130
+ value[:node] = @node if @node
131
+ end
132
+ value
100
133
  end
101
134
  end
102
135
 
@@ -123,7 +156,15 @@ module Ibex
123
156
  attr_reader :class_name #: String
124
157
  attr_reader :superclass #: String?
125
158
  attr_reader :start #: String
159
+ attr_reader :starts #: Array[String]
160
+ attr_reader :mode #: grammar_mode
126
161
  attr_reader :expect #: Integer
162
+ attr_reader :expect_rr #: Integer?
163
+ attr_reader :parser_parameters #: Array[parser_parameter]
164
+ attr_reader :value_printers #: Array[value_printer]
165
+ attr_reader :grammar_tests #: Array[grammar_test]
166
+ attr_reader :lexer #: Lexer?
167
+ attr_reader :recovery #: recovery_policy
127
168
  attr_reader :options #: grammar_options
128
169
  attr_reader :symbols #: Array[GrammarSymbol]
129
170
  attr_reader :productions #: Array[Production]
@@ -132,17 +173,39 @@ module Ibex
132
173
  attr_reader :conversions #: Hash[String, String]
133
174
  attr_reader :warnings #: Array[grammar_warning]
134
175
  attr_reader :schema_version #: Integer
176
+ attr_reader :source_provenance #: source_provenance?
177
+ attr_reader :migration #: migration_metadata?
135
178
 
136
- # @rbs (class_name: String, superclass: String?, start: String, expect: Integer, options: grammar_options,
179
+ # @rbs (class_name: String, superclass: String?, start: String, expect: Integer, ?expect_rr: Integer?,
180
+ # options: grammar_options,
137
181
  # symbols: Array[GrammarSymbol], productions: Array[Production], user_code: Hash[String, String],
138
182
  # conversions: Hash[String, String], warnings: Array[grammar_warning], ?user_code_chunks: user_code_chunks?,
139
- # ?schema_version: Integer) -> void
183
+ # ?schema_version: Integer, ?source_provenance: source_provenance?,
184
+ # ?migration: migration_metadata?, ?parser_parameters: Array[parser_parameter],
185
+ # ?value_printers: Array[value_printer], ?grammar_tests: Array[grammar_test],
186
+ # ?recovery: recovery_policy?, ?lexer: Lexer?,
187
+ # ?mode: grammar_mode, ?starts: Array[String]?) -> void
188
+ # rubocop:disable Metrics/AbcSize, Metrics/ParameterLists
189
+ # Immutable versioned IR is constructed from explicit public fields.
140
190
  def initialize(class_name:, superclass:, start:, expect:, options:, symbols:, productions:, user_code:,
141
- conversions:, warnings:, user_code_chunks: nil, schema_version: SCHEMA_VERSION)
191
+ conversions:, warnings:, user_code_chunks: nil, schema_version: SCHEMA_VERSION,
192
+ source_provenance: nil, migration: nil, expect_rr: nil, parser_parameters: [], value_printers: [],
193
+ grammar_tests: [], recovery: nil, lexer: nil, mode: :default, starts: nil)
194
+ validate_mode(mode)
195
+ normalized_starts = validate_starts(start, starts, mode)
196
+
142
197
  @class_name = class_name.freeze
143
198
  @superclass = superclass&.freeze
144
199
  @start = start.freeze
200
+ @starts = normalized_starts.map(&:freeze).freeze
201
+ @mode = mode
145
202
  @expect = expect
203
+ @expect_rr = expect_rr
204
+ @parser_parameters = IR.deep_freeze(parser_parameters)
205
+ @value_printers = IR.deep_freeze(value_printers)
206
+ @grammar_tests = IR.deep_freeze(grammar_tests)
207
+ @lexer = lexer
208
+ @recovery = IR.deep_freeze(recovery || { sync_tokens: [], on_error_reduce: [] })
146
209
  @options = IR.deep_freeze(options)
147
210
  @symbols = symbols.freeze
148
211
  @productions = productions.freeze
@@ -152,10 +215,13 @@ module Ibex
152
215
  @conversions = IR.deep_freeze(conversions)
153
216
  @warnings = IR.deep_freeze(warnings)
154
217
  @schema_version = schema_version
218
+ @source_provenance = IR.deep_freeze(source_provenance)
219
+ @migration = IR.deep_freeze(migration)
155
220
  @symbols_by_name = @symbols.to_h { |symbol| [symbol.name, symbol] }.freeze
156
221
  @symbols_by_id = @symbols.to_h { |symbol| [symbol.id, symbol] }.freeze
157
222
  freeze
158
223
  end
224
+ # rubocop:enable Metrics/AbcSize, Metrics/ParameterLists
159
225
 
160
226
  # @rbs (String name) -> GrammarSymbol?
161
227
  def symbol(name) = @symbols_by_name[name]
@@ -169,16 +235,63 @@ module Ibex
169
235
  # @rbs () -> Hash[Symbol, untyped]
170
236
  def to_h
171
237
  value = { ibex_ir: "grammar", schema_version: @schema_version, class_name: @class_name, superclass: @superclass,
172
- start: @start, expect: @expect, options: @options, symbols: @symbols.map(&:to_h),
173
- productions: @productions.map(&:to_h), user_code: @user_code, conversions: @conversions,
238
+ start: @start, expect: @expect, options: @options,
239
+ symbols: @symbols.map { |symbol| symbol.to_h(schema_version: @schema_version) },
240
+ productions: @productions.map { |production| production.to_h(schema_version: @schema_version) },
241
+ user_code: @user_code, conversions: @conversions,
174
242
  warnings: @warnings } #: Hash[Symbol, untyped]
175
- value[:user_code_chunks] = @user_code_chunks.transform_values { |chunks| chunks.map(&:to_h) } \
176
- unless @user_code_chunks.empty?
243
+ append_optional_metadata(value)
177
244
  value
178
245
  end
179
246
 
180
247
  private
181
248
 
249
+ # @rbs (grammar_mode mode) -> void
250
+ def validate_mode(mode)
251
+ raise ArgumentError, "mode must be :default or :extended" unless %i[default extended].include?(mode)
252
+ end
253
+
254
+ # @rbs (String start, Array[String]? starts, grammar_mode mode) -> Array[String]
255
+ def validate_starts(start, starts, mode)
256
+ values = starts || [start]
257
+ raise ArgumentError, "starts must contain the primary start symbol" if values.empty?
258
+ raise ArgumentError, "start must be the first entry in starts" unless values.first == start
259
+ raise ArgumentError, "starts must be unique" unless values.uniq.length == values.length
260
+ raise ArgumentError, "multiple start symbols require extended mode" if values.length > 1 && mode != :extended
261
+
262
+ values
263
+ end
264
+
265
+ # @rbs (Hash[Symbol, untyped] value) -> void
266
+ def append_optional_metadata(value)
267
+ append_parser_metadata(value)
268
+ append_recovery_metadata(value)
269
+ value[:user_code_chunks] = @user_code_chunks.transform_values { |chunks| chunks.map(&:to_h) } \
270
+ unless @user_code_chunks.empty?
271
+ return unless @schema_version >= 2
272
+
273
+ value[:source_provenance] = @source_provenance
274
+ value[:migration] = @migration
275
+ end
276
+
277
+ # @rbs (Hash[Symbol, untyped] value) -> void
278
+ def append_parser_metadata(value)
279
+ value[:expect_rr] = @expect_rr unless @expect_rr.nil?
280
+ value[:mode] = @mode if @mode == :extended
281
+ value[:starts] = @starts if @starts.length > 1
282
+ value[:params] = @parser_parameters unless @parser_parameters.empty?
283
+ value[:printers] = @value_printers unless @value_printers.empty?
284
+ value[:tests] = @grammar_tests unless @grammar_tests.empty? || @schema_version < 2
285
+ value[:lexer] = @lexer.to_h if @lexer && @schema_version >= 2
286
+ end
287
+
288
+ # @rbs (Hash[Symbol, untyped] value) -> void
289
+ def append_recovery_metadata(value)
290
+ return if @recovery[:sync_tokens].empty? && @recovery[:on_error_reduce].empty?
291
+
292
+ value[:recovery] = @recovery
293
+ end
294
+
182
295
  # @rbs () -> void
183
296
  def validate_user_code_chunks
184
297
  @user_code_chunks.each do |name, chunks|
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibex
4
+ module IR
5
+ LEXER_SCHEMA_VERSION = 1
6
+ SUPPORTED_LEXER_SCHEMA_VERSIONS = [LEXER_SCHEMA_VERSION].freeze #: Array[Integer]
7
+
8
+ # One normalized, state-scoped lexer rule.
9
+ class LexerRule
10
+ attr_reader :id #: Integer
11
+ attr_reader :state #: String
12
+ attr_reader :kind #: Symbol
13
+ attr_reader :token #: String?
14
+ attr_reader :pattern #: String
15
+ attr_reader :pattern_kind #: Symbol
16
+ attr_reader :options #: String
17
+ attr_reader :action #: String?
18
+ attr_reader :location #: location
19
+
20
+ # @rbs (id: Integer, state: String, kind: Symbol, token: String?, pattern: String, pattern_kind: Symbol,
21
+ # options: String, action: String?, location: location) -> void
22
+ def initialize(id:, state:, kind:, token:, pattern:, pattern_kind:, options:, action:, location:)
23
+ @id = id
24
+ @state = state.freeze
25
+ @kind = kind
26
+ @token = token&.freeze
27
+ @pattern = pattern.freeze
28
+ @pattern_kind = pattern_kind
29
+ @options = options.freeze
30
+ @action = action&.freeze
31
+ @location = IR.deep_freeze(location)
32
+ freeze
33
+ end
34
+
35
+ # @rbs () -> Hash[Symbol, untyped]
36
+ def to_h
37
+ {
38
+ id: @id, state: @state, kind: @kind, token: @token, pattern: @pattern,
39
+ pattern_kind: @pattern_kind, options: @options, action: @action, loc: @location
40
+ }
41
+ end
42
+ end
43
+
44
+ # Independently versioned lexer contract embedded by Grammar IR v2.
45
+ class Lexer
46
+ attr_reader :states #: Array[String]
47
+ attr_reader :rules #: Array[LexerRule]
48
+ attr_reader :warnings #: Array[Hash[Symbol, untyped]]
49
+ attr_reader :schema_version #: Integer
50
+ attr_reader :source_provenance #: source_provenance?
51
+
52
+ # @rbs (states: Array[String], rules: Array[LexerRule], warnings: Array[Hash[Symbol, untyped]],
53
+ # ?schema_version: Integer, ?source_provenance: source_provenance?) -> void
54
+ def initialize(states:, rules:, warnings:, schema_version: LEXER_SCHEMA_VERSION, source_provenance: nil)
55
+ raise ArgumentError, "lexer states must start with INITIAL" unless states.first == "INITIAL"
56
+ raise ArgumentError, "lexer states must be unique" unless states.uniq.length == states.length
57
+
58
+ @states = states.map(&:freeze).freeze
59
+ @rules = rules.freeze
60
+ @warnings = IR.deep_freeze(warnings)
61
+ @schema_version = schema_version
62
+ @source_provenance = IR.deep_freeze(source_provenance)
63
+ freeze
64
+ end
65
+
66
+ # @rbs () -> Hash[Symbol, untyped]
67
+ def to_h
68
+ {
69
+ ibex_ir: "lexer", schema_version: @schema_version, initial_state: "INITIAL",
70
+ states: @states, rules: @rules.map(&:to_h), warnings: @warnings,
71
+ source_provenance: @source_provenance
72
+ }
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ibex
4
+ module IR
5
+ # Meaning-preserving upgrades between published IR schema versions.
6
+ module Migration
7
+ UNAVAILABLE_V1_METADATA = %w[
8
+ source_provenance
9
+ symbol_docs
10
+ production_docs
11
+ production_expansion
12
+ action_composition
13
+ grammar_tests
14
+ lexer
15
+ cst
16
+ ast_nodes
17
+ ].freeze #: Array[String]
18
+
19
+ # @rbs (Grammar | Automaton value, ?to: Integer) -> (Grammar | Automaton)
20
+ def to_version(value, to: SCHEMA_VERSION)
21
+ return value if value.schema_version == to
22
+ return to_v2(value) if value.schema_version == 1 && to == 2
23
+
24
+ raise Ibex::Error,
25
+ "(ir):1:1: cannot migrate schema_version #{value.schema_version} to #{to}; only 1 to 2 is supported"
26
+ end
27
+ module_function :to_version
28
+
29
+ # @rbs (Grammar | Automaton value) -> (Grammar | Automaton)
30
+ def to_v2(value)
31
+ return value if value.schema_version == 2
32
+ unless value.schema_version == 1
33
+ raise Ibex::Error, "(ir):1:1: cannot migrate unsupported schema_version #{value.schema_version}"
34
+ end
35
+
36
+ return migrate_grammar(value) if value.is_a?(Grammar)
37
+ return migrate_automaton(value) if value.is_a?(Automaton)
38
+
39
+ raise Ibex::Error, "(ir):1:1: cannot migrate unsupported IR object #{value.class}"
40
+ end
41
+ module_function :to_v2
42
+
43
+ # @rbs (Grammar grammar) -> Grammar
44
+ def migrate_grammar(grammar)
45
+ symbols = migrate_symbols(grammar)
46
+ productions = migrate_productions(grammar)
47
+ build_migrated_grammar(grammar, symbols, productions)
48
+ end
49
+ module_function :migrate_grammar
50
+
51
+ # @rbs (Grammar grammar) -> Array[GrammarSymbol]
52
+ def migrate_symbols(grammar)
53
+ grammar.symbols.map do |symbol|
54
+ GrammarSymbol.new(
55
+ id: symbol.id, name: symbol.name, kind: symbol.kind, reserved: symbol.reserved,
56
+ precedence: symbol.precedence, location: symbol.location, display_name: symbol.display_name,
57
+ semantic_type: symbol.semantic_type
58
+ )
59
+ end
60
+ end
61
+ module_function :migrate_symbols
62
+
63
+ # @rbs (Grammar grammar) -> Array[Production]
64
+ def migrate_productions(grammar)
65
+ grammar.productions.map do |production|
66
+ Production.new(
67
+ id: production.id, lhs: production.lhs, rhs: production.rhs,
68
+ action: migrate_action(production.action), precedence_override: production.precedence_override,
69
+ origin: production.origin
70
+ )
71
+ end
72
+ end
73
+ module_function :migrate_productions
74
+
75
+ # @rbs (Grammar grammar, Array[GrammarSymbol] symbols, Array[Production] productions) -> Grammar
76
+ def build_migrated_grammar(grammar, symbols, productions)
77
+ Grammar.new(
78
+ class_name: grammar.class_name, superclass: grammar.superclass, start: grammar.start,
79
+ mode: grammar.mode, starts: grammar.starts,
80
+ expect: grammar.expect, expect_rr: grammar.expect_rr, options: grammar.options,
81
+ parser_parameters: grammar.parser_parameters,
82
+ value_printers: grammar.value_printers,
83
+ grammar_tests: grammar.grammar_tests,
84
+ recovery: grammar.recovery,
85
+ symbols: symbols, productions: productions,
86
+ user_code: grammar.user_code, user_code_chunks: grammar.user_code_chunks,
87
+ conversions: grammar.conversions, warnings: grammar.warnings, schema_version: 2,
88
+ migration: { from_schema_version: 1, unavailable: UNAVAILABLE_V1_METADATA }
89
+ )
90
+ end
91
+ module_function :build_migrated_grammar
92
+
93
+ # @rbs (Action? action) -> Action?
94
+ def migrate_action(action)
95
+ return nil unless action
96
+
97
+ Action.new(
98
+ code: action.code, location: action.location, named_refs: action.named_refs,
99
+ context_length: action.context_length
100
+ )
101
+ end
102
+ module_function :migrate_action
103
+
104
+ # @rbs (Automaton automaton) -> Automaton
105
+ def migrate_automaton(automaton)
106
+ Automaton.new(
107
+ grammar: migrate_grammar(automaton.grammar), states: automaton.states,
108
+ conflict_summary: automaton.conflict_summary, algorithm: automaton.algorithm, schema_version: 2,
109
+ entry_states: automaton.entry_states
110
+ )
111
+ end
112
+ module_function :migrate_automaton
113
+
114
+ class << self
115
+ private :migrate_grammar, :migrate_symbols, :migrate_productions, :build_migrated_grammar,
116
+ :migrate_action, :migrate_automaton
117
+ end
118
+ end
119
+ end
120
+ end