ibex 0.2.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 (437) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +95 -272
  3. data/docs/architecture.md +187 -35
  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 +3 -4
  12. data/docs/cst.md +24 -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 +179 -2
  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 +2 -1
  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 +54 -0
  51. data/docs/getting-started.md +80 -0
  52. data/docs/grammar-reference.md +184 -13
  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 +5 -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 +11 -0
  63. data/docs/release-readiness.md +126 -68
  64. data/docs/repair-semantics.md +123 -0
  65. data/docs/runtime-abi-evolution.md +307 -0
  66. data/docs/stability.md +144 -34
  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/lib/ibex/analysis/digraph.rb +128 -0
  75. data/lib/ibex/analysis.rb +1 -0
  76. data/lib/ibex/bison_import/importer.rb +516 -0
  77. data/lib/ibex/bison_import/tokenizer.rb +260 -0
  78. data/lib/ibex/bison_import.rb +200 -0
  79. data/lib/ibex/bounded_subprocess.rb +171 -0
  80. data/lib/ibex/cli/ambiguity.rb +14 -5
  81. data/lib/ibex/cli/analysis.rb +134 -0
  82. data/lib/ibex/cli/bison_import.rb +121 -0
  83. data/lib/ibex/cli/config.rb +128 -0
  84. data/lib/ibex/cli/diagnostics.rb +31 -11
  85. data/lib/ibex/cli/documentation.rb +11 -8
  86. data/lib/ibex/cli/equiv.rb +169 -0
  87. data/lib/ibex/cli/error_messages.rb +11 -4
  88. data/lib/ibex/cli/explain.rb +14 -5
  89. data/lib/ibex/cli/fix.rb +203 -0
  90. data/lib/ibex/cli/formatting.rb +11 -10
  91. data/lib/ibex/cli/fuzz.rb +200 -0
  92. data/lib/ibex/cli/fuzz_regressions.rb +145 -0
  93. data/lib/ibex/cli/generation_artifacts.rb +53 -2
  94. data/lib/ibex/cli/generation_error_messages.rb +1 -1
  95. data/lib/ibex/cli/grammar_tests.rb +32 -14
  96. data/lib/ibex/cli/ir_tools.rb +5 -61
  97. data/lib/ibex/cli/outputs.rb +60 -33
  98. data/lib/ibex/cli/reduce.rb +202 -0
  99. data/lib/ibex/cli/reduce_reporting.rb +71 -0
  100. data/lib/ibex/cli/samples.rb +49 -23
  101. data/lib/ibex/cli/verify.rb +116 -0
  102. data/lib/ibex/cli/watch.rb +6 -5
  103. data/lib/ibex/cli.rb +357 -56
  104. data/lib/ibex/codegen/action_locations.rb +1 -1
  105. data/lib/ibex/codegen/action_method_source.rb +5 -6
  106. data/lib/ibex/codegen/action_source.rb +3 -2
  107. data/lib/ibex/codegen/ambiguity.rb +5 -4
  108. data/lib/ibex/codegen/explain.rb +123 -55
  109. data/lib/ibex/codegen/generated_action_abi.rb +10 -5
  110. data/lib/ibex/codegen/rbs.rb +15 -7
  111. data/lib/ibex/codegen/report.rb +25 -13
  112. data/lib/ibex/codegen/ruby.rb +28 -64
  113. data/lib/ibex/codegen/ruby_actions.rb +9 -6
  114. data/lib/ibex/codegen/ruby_syntax.rb +15 -9
  115. data/lib/ibex/configuration/analysis_grammar.rb +35 -0
  116. data/lib/ibex/configuration/explanation.rb +421 -0
  117. data/lib/ibex/configuration/inspector.rb +232 -0
  118. data/lib/ibex/configuration.rb +580 -0
  119. data/lib/ibex/coverage/collector.rb +21 -11
  120. data/lib/ibex/coverage/event_stream.rb +13 -7
  121. data/lib/ibex/coverage/report.rb +26 -18
  122. data/lib/ibex/coverage/runtime_event_validator.rb +30 -21
  123. data/lib/ibex/delta_reducer.rb +99 -0
  124. data/lib/ibex/diff.rb +140 -0
  125. data/lib/ibex/equiv/machine.rb +135 -0
  126. data/lib/ibex/equiv.rb +373 -0
  127. data/lib/ibex/fix.rb +557 -0
  128. data/lib/ibex/frontend/ast.rb +22 -2
  129. data/lib/ibex/frontend/bootstrap_parser.rb +6 -13
  130. data/lib/ibex/frontend/diagnostic.rb +1 -1
  131. data/lib/ibex/frontend/formatter.rb +72 -26
  132. data/lib/ibex/frontend/generated_parser.rb +147 -117
  133. data/lib/ibex/frontend/generated_parser_base.rb +7 -3
  134. data/lib/ibex/frontend/generated_parser_includes.rb +1 -11
  135. data/lib/ibex/frontend/generation.rb +1 -1
  136. data/lib/ibex/frontend/parser/declarations.rb +17 -2
  137. data/lib/ibex/frontend/parser_configuration_support.rb +56 -0
  138. data/lib/ibex/frontend/regenerator.rb +1 -0
  139. data/lib/ibex/frontend/resolution.rb +2 -1
  140. data/lib/ibex/frontend/resolver.rb +1 -1
  141. data/lib/ibex/frontend/rule_documentation.rb +2 -1
  142. data/lib/ibex/frontend/source_cursor.rb +2 -2
  143. data/lib/ibex/frontend/source_span.rb +9 -1
  144. data/lib/ibex/frontend/token_adapter/declaration_state.rb +38 -6
  145. data/lib/ibex/frontend/token_adapter.rb +10 -0
  146. data/lib/ibex/frontend.rb +1 -0
  147. data/lib/ibex/fuzz.rb +219 -0
  148. data/lib/ibex/generation_input.rb +1 -1
  149. data/lib/ibex/generation_manifest.rb +36 -25
  150. data/lib/ibex/generation_transaction.rb +1 -1
  151. data/lib/ibex/generation_transaction_recovery.rb +4 -4
  152. data/lib/ibex/generation_transaction_validation.rb +2 -2
  153. data/lib/ibex/grammar_tests.rb +1 -1
  154. data/lib/ibex/ir/automaton_ir.rb +61 -19
  155. data/lib/ibex/ir/grammar_ir.rb +76 -45
  156. data/lib/ibex/ir/lexer_ir.rb +5 -5
  157. data/lib/ibex/ir/parser_contract.rb +135 -0
  158. data/lib/ibex/ir/serialize.rb +203 -76
  159. data/lib/ibex/ir/validator/automaton.rb +64 -34
  160. data/lib/ibex/ir/validator/base.rb +51 -33
  161. data/lib/ibex/ir/validator/grammar.rb +113 -83
  162. data/lib/ibex/ir/validator/lexer.rb +2 -2
  163. data/lib/ibex/ir/validator.rb +2 -1
  164. data/lib/ibex/ir.rb +16 -3
  165. data/lib/ibex/lalr/build_metrics.rb +50 -2
  166. data/lib/ibex/lalr/builder.rb +191 -56
  167. data/lib/ibex/lalr/conflict_search.rb +15 -4
  168. data/lib/ibex/lalr/counterexample.rb +19 -14
  169. data/lib/ibex/lalr/direct_lookaheads.rb +110 -57
  170. data/lib/ibex/lalr/goto_follows.rb +229 -0
  171. data/lib/ibex/lalr/ielr/annotator.rb +214 -0
  172. data/lib/ibex/lalr/ielr/bits.rb +28 -0
  173. data/lib/ibex/lalr/ielr/inadequacy.rb +47 -0
  174. data/lib/ibex/lalr/ielr/item_lookaheads.rb +78 -0
  175. data/lib/ibex/lalr/ielr/pipeline.rb +75 -0
  176. data/lib/ibex/lalr/ielr/split_stability.rb +78 -0
  177. data/lib/ibex/lalr/ielr/split_state.rb +20 -0
  178. data/lib/ibex/lalr/ielr/state_splitter.rb +258 -0
  179. data/lib/ibex/lalr/ielr_partition.rb +22 -8
  180. data/lib/ibex/lalr/inadequacy_report.rb +50 -0
  181. data/lib/ibex/lalr/lookahead_propagation.rb +111 -0
  182. data/lib/ibex/lalr/lr0_collection.rb +121 -0
  183. data/lib/ibex/lalr/unreachable_states.rb +80 -0
  184. data/lib/ibex/lalr.rb +52 -1
  185. data/lib/ibex/location.rb +3 -3
  186. data/lib/ibex/lsp/document_handlers.rb +9 -7
  187. data/lib/ibex/lsp/initialization_handlers.rb +9 -7
  188. data/lib/ibex/lsp/navigation_handlers.rb +25 -11
  189. data/lib/ibex/lsp/parser_configuration_assistance.rb +149 -0
  190. data/lib/ibex/lsp/position_codec.rb +6 -2
  191. data/lib/ibex/lsp/request_handlers.rb +3 -2
  192. data/lib/ibex/lsp/request_support.rb +14 -7
  193. data/lib/ibex/lsp/server.rb +13 -11
  194. data/lib/ibex/lsp/symbol_index.rb +13 -13
  195. data/lib/ibex/lsp/symbol_index_builder.rb +30 -20
  196. data/lib/ibex/lsp/symbol_occurrence.rb +8 -2
  197. data/lib/ibex/lsp/transport.rb +13 -3
  198. data/lib/ibex/lsp/workspace.rb +5 -4
  199. data/lib/ibex/lsp/workspace_analyzer.rb +1 -1
  200. data/lib/ibex/lsp.rb +1 -0
  201. data/lib/ibex/messages/en.yml +28 -0
  202. data/lib/ibex/messages/ja.yml +28 -0
  203. data/lib/ibex/messages.rb +68 -0
  204. data/lib/ibex/metrics.rb +175 -0
  205. data/lib/ibex/normalize/declarations.rb +2 -0
  206. data/lib/ibex/normalize/diagnostics.rb +63 -38
  207. data/lib/ibex/normalize/expander.rb +5 -4
  208. data/lib/ibex/normalize/expression.rb +8 -6
  209. data/lib/ibex/normalize/grammar_builder.rb +26 -0
  210. data/lib/ibex/normalize/inline_expansion.rb +100 -49
  211. data/lib/ibex/normalize/lexer.rb +3 -3
  212. data/lib/ibex/normalize/parameter_ebnf_lowering.rb +11 -10
  213. data/lib/ibex/normalize/parameter_lowering.rb +40 -23
  214. data/lib/ibex/normalize/parameters.rb +31 -4
  215. data/lib/ibex/normalize/parser_configuration.rb +70 -0
  216. data/lib/ibex/normalize.rb +10 -20
  217. data/lib/ibex/racc_migration/report.rb +6 -3
  218. data/lib/ibex/rake_task.rb +1 -1
  219. data/lib/ibex/samples.rb +43 -13
  220. data/lib/ibex/table_artifact/builder.rb +266 -0
  221. data/lib/ibex/table_artifact/cst_projection.rb +70 -0
  222. data/lib/ibex/table_artifact/document.rb +39 -0
  223. data/lib/ibex/table_artifact/executor.rb +187 -0
  224. data/lib/ibex/table_artifact/serializer.rb +57 -0
  225. data/lib/ibex/table_artifact/validator/metadata.rb +179 -0
  226. data/lib/ibex/table_artifact/validator/support.rb +86 -0
  227. data/lib/ibex/table_artifact/validator/tables.rb +238 -0
  228. data/lib/ibex/table_artifact/validator.rb +253 -0
  229. data/lib/ibex/table_artifact.rb +88 -0
  230. data/lib/ibex/table_simulation/result.rb +6 -2
  231. data/lib/ibex/table_simulation/step.rb +3 -1
  232. data/lib/ibex/tables.rb +14 -0
  233. data/lib/ibex/verifiable_generation_bundle.rb +86 -0
  234. data/lib/ibex/verification_report/builder.rb +159 -0
  235. data/lib/ibex/verification_report/canonical_ir.rb +123 -0
  236. data/lib/ibex/verification_report/logical_path.rb +68 -0
  237. data/lib/ibex/verification_report/validator.rb +329 -0
  238. data/lib/ibex/verification_report.rb +69 -0
  239. data/lib/ibex/verify/action_correspondence.rb +138 -0
  240. data/lib/ibex/verify/language_witness.rb +295 -0
  241. data/lib/ibex/verify/reference_collection.rb +190 -0
  242. data/lib/ibex/verify/result.rb +73 -0
  243. data/lib/ibex/verify/verifier.rb +598 -0
  244. data/lib/ibex/verify.rb +15 -0
  245. data/lib/ibex/version.rb +1 -1
  246. data/lib/ibex/watch/runner.rb +10 -1
  247. data/lib/ibex/watch/source_snapshot.rb +13 -8
  248. data/lib/ibex.rb +10 -0
  249. data/schema/{automaton-ir-v1.schema.json → automaton-ir-definitions.schema.json} +6 -6
  250. data/schema/{automaton-ir-v2.schema.json → automaton-ir.schema.json} +14 -7
  251. data/schema/bison-import-v1.schema.json +106 -0
  252. data/schema/conflict-explanation-review-v1.schema.json +196 -0
  253. data/schema/conflict-explanation-study-v1.schema.json +528 -0
  254. data/schema/construction-profile-v1.schema.json +779 -0
  255. data/schema/diff-v1.schema.json +41 -0
  256. data/schema/direct-ielr-decision-v1.schema.json +200 -0
  257. data/schema/equiv-v1.schema.json +64 -0
  258. data/schema/error-ux-review-v1.schema.json +609 -0
  259. data/schema/error-ux-round2-review-v1.schema.json +191 -0
  260. data/schema/error-ux-round2-v1.schema.json +519 -0
  261. data/schema/explain-v1.schema.json +63 -1
  262. data/schema/fix-v1.schema.json +64 -0
  263. data/schema/fix-v2.schema.json +66 -0
  264. data/schema/fix-v3.schema.json +101 -0
  265. data/schema/fuzz-regression-v1.schema.json +79 -0
  266. data/schema/fuzz-v1.schema.json +114 -0
  267. data/schema/{grammar-ir-v2.schema.json → grammar-ir-extensions.schema.json} +20 -65
  268. data/schema/{grammar-ir-v1.schema.json → grammar-ir-foundation.schema.json} +3 -3
  269. data/schema/grammar-ir.schema.json +271 -0
  270. data/schema/ielr-benchmark-v1.schema.json +85 -0
  271. data/schema/lexer-profile-v1.schema.json +491 -0
  272. data/schema/metrics-v1.schema.json +60 -0
  273. data/schema/reduce-v1.schema.json +22 -0
  274. data/schema/reduce-v2.schema.json +63 -0
  275. data/schema/table-artifact-v1.schema.json +377 -0
  276. data/schema/verification-report-v1.schema.json +222 -0
  277. data/schema/verify-v1.schema.json +42 -0
  278. data/sig/ibex/analysis/digraph.rbs +19 -0
  279. data/sig/ibex/bison_import/importer.rbs +140 -0
  280. data/sig/ibex/bison_import/tokenizer.rbs +91 -0
  281. data/sig/ibex/bison_import.rbs +95 -0
  282. data/sig/ibex/bounded_subprocess.rbs +76 -0
  283. data/sig/ibex/cli/ambiguity.rbs +6 -0
  284. data/sig/ibex/cli/analysis.rbs +43 -0
  285. data/sig/ibex/cli/bison_import.rbs +32 -0
  286. data/sig/ibex/cli/config.rbs +35 -0
  287. data/sig/ibex/cli/diagnostics.rbs +16 -3
  288. data/sig/ibex/cli/documentation.rbs +5 -1
  289. data/sig/ibex/cli/equiv.rbs +49 -0
  290. data/sig/ibex/cli/error_messages.rbs +6 -0
  291. data/sig/ibex/cli/explain.rbs +6 -0
  292. data/sig/ibex/cli/fix.rbs +53 -0
  293. data/sig/ibex/cli/formatting.rbs +5 -1
  294. data/sig/ibex/cli/fuzz.rbs +47 -0
  295. data/sig/ibex/cli/fuzz_regressions.rbs +40 -0
  296. data/sig/ibex/cli/generation_artifacts.rbs +21 -2
  297. data/sig/ibex/cli/generation_error_messages.rbs +2 -2
  298. data/sig/ibex/cli/grammar_tests.rbs +15 -3
  299. data/sig/ibex/cli/ir_tools.rbs +7 -19
  300. data/sig/ibex/cli/outputs.rbs +9 -3
  301. data/sig/ibex/cli/reduce.rbs +60 -0
  302. data/sig/ibex/cli/reduce_reporting.rbs +27 -0
  303. data/sig/ibex/cli/samples.rbs +8 -0
  304. data/sig/ibex/cli/verify.rbs +28 -0
  305. data/sig/ibex/cli/watch.rbs +2 -2
  306. data/sig/ibex/cli.rbs +79 -5
  307. data/sig/ibex/codegen/action_method_source.rbs +4 -4
  308. data/sig/ibex/codegen/explain.rbs +45 -25
  309. data/sig/ibex/codegen/generated_action_abi.rbs +14 -10
  310. data/sig/ibex/codegen/rbs.rbs +12 -10
  311. data/sig/ibex/codegen/report.rbs +12 -12
  312. data/sig/ibex/codegen/ruby.rbs +18 -15
  313. data/sig/ibex/codegen/ruby_actions.rbs +6 -6
  314. data/sig/ibex/codegen/ruby_syntax.rbs +10 -8
  315. data/sig/ibex/configuration/analysis_grammar.rbs +13 -0
  316. data/sig/ibex/configuration/explanation.rbs +195 -0
  317. data/sig/ibex/configuration/inspector.rbs +53 -0
  318. data/sig/ibex/configuration.rbs +242 -0
  319. data/sig/ibex/coverage/collector.rbs +16 -14
  320. data/sig/ibex/coverage/event_stream.rbs +12 -10
  321. data/sig/ibex/coverage/report.rbs +20 -18
  322. data/sig/ibex/coverage/runtime_event_validator.rbs +38 -36
  323. data/sig/ibex/delta_reducer.rbs +38 -0
  324. data/sig/ibex/diff.rbs +47 -0
  325. data/sig/ibex/equiv/machine.rbs +54 -0
  326. data/sig/ibex/equiv.rbs +129 -0
  327. data/sig/ibex/fix.rbs +138 -0
  328. data/sig/ibex/frontend/ast.rbs +33 -7
  329. data/sig/ibex/frontend/bootstrap_parser.rbs +2 -0
  330. data/sig/ibex/frontend/diagnostic.rbs +2 -2
  331. data/sig/ibex/frontend/formatter.rbs +38 -30
  332. data/sig/ibex/frontend/generated_parser.rbs +87 -77
  333. data/sig/ibex/frontend/generated_parser_base.rbs +4 -2
  334. data/sig/ibex/frontend/parser/declarations.rbs +3 -0
  335. data/sig/ibex/frontend/parser_configuration_support.rbs +27 -0
  336. data/sig/ibex/frontend/resolution.rbs +3 -2
  337. data/sig/ibex/frontend/source_cursor.rbs +2 -2
  338. data/sig/ibex/frontend/source_span.rbs +5 -2
  339. data/sig/ibex/frontend/token_adapter/declaration_state.rbs +13 -1
  340. data/sig/ibex/frontend/token_adapter.rbs +6 -0
  341. data/sig/ibex/fuzz.rbs +71 -0
  342. data/sig/ibex/generation_input.rbs +2 -2
  343. data/sig/ibex/generation_manifest.rbs +35 -32
  344. data/sig/ibex/generation_transaction_recovery.rbs +2 -2
  345. data/sig/ibex/generation_transaction_validation.rbs +2 -2
  346. data/sig/ibex/grammar_tests.rbs +2 -2
  347. data/sig/ibex/ir/automaton_ir.rbs +30 -11
  348. data/sig/ibex/ir/grammar_ir.rbs +41 -27
  349. data/sig/ibex/ir/lexer_ir.rbs +8 -8
  350. data/sig/ibex/ir/parser_contract.rbs +69 -0
  351. data/sig/ibex/ir/serialize.rbs +63 -28
  352. data/sig/ibex/ir/validator/automaton.rbs +47 -44
  353. data/sig/ibex/ir/validator/base.rbs +35 -31
  354. data/sig/ibex/ir/validator/grammar.rbs +78 -67
  355. data/sig/ibex/ir/validator/lexer.rbs +4 -4
  356. data/sig/ibex/ir.rbs +9 -3
  357. data/sig/ibex/lalr/build_metrics.rbs +42 -2
  358. data/sig/ibex/lalr/builder.rbs +75 -24
  359. data/sig/ibex/lalr/conflict_search.rbs +5 -2
  360. data/sig/ibex/lalr/counterexample.rbs +17 -14
  361. data/sig/ibex/lalr/direct_lookaheads.rbs +35 -28
  362. data/sig/ibex/lalr/goto_follows.rbs +89 -0
  363. data/sig/ibex/lalr/ielr/annotator.rbs +67 -0
  364. data/sig/ibex/lalr/ielr/bits.rbs +14 -0
  365. data/sig/ibex/lalr/ielr/inadequacy.rbs +24 -0
  366. data/sig/ibex/lalr/ielr/item_lookaheads.rbs +35 -0
  367. data/sig/ibex/lalr/ielr/pipeline.rbs +17 -0
  368. data/sig/ibex/lalr/ielr/split_stability.rbs +27 -0
  369. data/sig/ibex/lalr/ielr/split_state.rbs +14 -0
  370. data/sig/ibex/lalr/ielr/state_splitter.rbs +76 -0
  371. data/sig/ibex/lalr/ielr_partition.rbs +17 -5
  372. data/sig/ibex/lalr/inadequacy_report.rbs +21 -0
  373. data/sig/ibex/lalr/lookahead_propagation.rbs +38 -0
  374. data/sig/ibex/lalr/lr0_collection.rbs +50 -0
  375. data/sig/ibex/lalr/unreachable_states.rbs +25 -0
  376. data/sig/ibex/lalr.rbs +11 -1
  377. data/sig/ibex/location.rbs +6 -6
  378. data/sig/ibex/lsp/document_handlers.rbs +8 -8
  379. data/sig/ibex/lsp/initialization_handlers.rbs +12 -12
  380. data/sig/ibex/lsp/navigation_handlers.rbs +15 -12
  381. data/sig/ibex/lsp/parser_configuration_assistance.rbs +49 -0
  382. data/sig/ibex/lsp/position_codec.rbs +8 -4
  383. data/sig/ibex/lsp/request_handlers.rbs +4 -4
  384. data/sig/ibex/lsp/request_support.rbs +8 -8
  385. data/sig/ibex/lsp/server.rbs +16 -16
  386. data/sig/ibex/lsp/symbol_index.rbs +20 -21
  387. data/sig/ibex/lsp/symbol_index_builder.rbs +9 -8
  388. data/sig/ibex/lsp/symbol_occurrence.rbs +11 -5
  389. data/sig/ibex/lsp/transport.rbs +18 -6
  390. data/sig/ibex/lsp/workspace.rbs +3 -2
  391. data/sig/ibex/lsp/workspace_analyzer.rbs +1 -1
  392. data/sig/ibex/messages.rbs +26 -0
  393. data/sig/ibex/metrics.rbs +50 -0
  394. data/sig/ibex/normalize/diagnostics.rbs +4 -4
  395. data/sig/ibex/normalize/expander.rbs +2 -2
  396. data/sig/ibex/normalize/expression.rbs +10 -8
  397. data/sig/ibex/normalize/grammar_builder.rbs +11 -0
  398. data/sig/ibex/normalize/inline_expansion.rbs +59 -50
  399. data/sig/ibex/normalize/lexer.rbs +4 -4
  400. data/sig/ibex/normalize/parameter_ebnf_lowering.rbs +15 -14
  401. data/sig/ibex/normalize/parameter_lowering.rbs +18 -18
  402. data/sig/ibex/normalize/parameters.rbs +13 -8
  403. data/sig/ibex/normalize/parser_configuration.rbs +23 -0
  404. data/sig/ibex/normalize.rbs +11 -5
  405. data/sig/ibex/racc_migration/report.rbs +8 -6
  406. data/sig/ibex/rake_task.rbs +1 -1
  407. data/sig/ibex/samples.rbs +13 -4
  408. data/sig/ibex/table_artifact/builder.rbs +93 -0
  409. data/sig/ibex/table_artifact/cst_projection.rbs +20 -0
  410. data/sig/ibex/table_artifact/document.rbs +27 -0
  411. data/sig/ibex/table_artifact/executor.rbs +66 -0
  412. data/sig/ibex/table_artifact/serializer.rbs +25 -0
  413. data/sig/ibex/table_artifact/validator/metadata.rbs +52 -0
  414. data/sig/ibex/table_artifact/validator/support.rbs +46 -0
  415. data/sig/ibex/table_artifact/validator/tables.rbs +63 -0
  416. data/sig/ibex/table_artifact/validator.rbs +66 -0
  417. data/sig/ibex/table_artifact.rbs +32 -0
  418. data/sig/ibex/table_simulation/result.rbs +8 -4
  419. data/sig/ibex/table_simulation/step.rbs +4 -2
  420. data/sig/ibex/tables.rbs +10 -9
  421. data/sig/ibex/verifiable_generation_bundle.rbs +24 -0
  422. data/sig/ibex/verification_report/builder.rbs +53 -0
  423. data/sig/ibex/verification_report/canonical_ir.rbs +41 -0
  424. data/sig/ibex/verification_report/logical_path.rbs +34 -0
  425. data/sig/ibex/verification_report/validator.rbs +114 -0
  426. data/sig/ibex/verification_report.rbs +44 -0
  427. data/sig/ibex/verify/action_correspondence.rbs +50 -0
  428. data/sig/ibex/verify/language_witness.rbs +112 -0
  429. data/sig/ibex/verify/reference_collection.rbs +63 -0
  430. data/sig/ibex/verify/result.rbs +52 -0
  431. data/sig/ibex/verify/verifier.rbs +170 -0
  432. data/sig/ibex/verify.rbs +6 -0
  433. data/sig/ibex/watch/runner.rbs +12 -2
  434. data/sig/ibex/watch/source_snapshot.rbs +13 -9
  435. metadata +232 -12
  436. data/lib/ibex/ir/migration.rb +0 -120
  437. data/sig/ibex/ir/migration.rbs +0 -34
@@ -12,23 +12,25 @@ module Ibex
12
12
  # Array[String] lines,
13
13
  # IR::AutomatonState state,
14
14
  # IR::Grammar grammar,
15
- # Array[IR::counterexample] examples,
15
+ # Array[LALR::search_counterexample] examples,
16
16
  # Hash[Integer, String] labels
17
17
  # ) -> void
18
18
  # private def self.append_state: (
19
19
  # Array[String] lines,
20
20
  # IR::AutomatonState state,
21
21
  # IR::Grammar grammar,
22
- # Array[IR::counterexample] examples,
22
+ # Array[LALR::search_counterexample] examples,
23
23
  # Hash[Integer, String] labels
24
24
  # ) -> void
25
- # private def append_counterexample: (Array[String] lines, IR::counterexample example, IR::Grammar grammar,
25
+ # private def append_counterexample: (Array[String] lines, LALR::search_counterexample example,
26
+ # IR::Grammar grammar,
26
27
  # Hash[Integer, String] labels) -> void
27
- # private def self.append_counterexample: (Array[String] lines, IR::counterexample example, IR::Grammar grammar,
28
+ # private def self.append_counterexample: (Array[String] lines, LALR::search_counterexample example,
29
+ # IR::Grammar grammar,
28
30
  # Hash[Integer, String] labels) -> void
29
- # private def append_tree: (Array[String] lines, untyped tree, String indentation, IR::Grammar grammar,
31
+ # private def append_tree: (Array[String] lines, Object? tree, String indentation, IR::Grammar grammar,
30
32
  # Hash[Integer, String] labels) -> void
31
- # private def self.append_tree: (Array[String] lines, untyped tree, String indentation, IR::Grammar grammar,
33
+ # private def self.append_tree: (Array[String] lines, Object? tree, String indentation, IR::Grammar grammar,
32
34
  # Hash[Integer, String] labels) -> void
33
35
  # private def format_item: (IR::AutomatonItem item, IR::Grammar grammar, Hash[Integer, String] labels) -> String
34
36
  # private def self.format_item: (IR::AutomatonItem item, IR::Grammar grammar,
@@ -37,14 +39,14 @@ module Ibex
37
39
  # private def self.format_action: (IR::parser_action action) -> String
38
40
  # private def symbol_name: (Hash[Integer, String] labels, Integer id) -> String
39
41
  # private def self.symbol_name: (Hash[Integer, String] labels, Integer id) -> String
40
- # private def tree_label: (IR::Grammar grammar, Hash[Integer, String] labels, untyped value) -> untyped
41
- # private def self.tree_label: (IR::Grammar grammar, Hash[Integer, String] labels, untyped value) -> untyped
42
+ # private def tree_label: (IR::Grammar grammar, Hash[Integer, String] labels, Object? value) -> Object?
43
+ # private def self.tree_label: (IR::Grammar grammar, Hash[Integer, String] labels, Object? value) -> Object?
42
44
  # private def display_conflict: (IR::conflict conflict, IR::Grammar grammar,
43
- # Hash[Integer, String] labels) -> Hash[Symbol, untyped]
45
+ # Hash[Integer, String] labels) -> Hash[Symbol, Object?]
44
46
  # private def self.display_conflict: (IR::conflict conflict, IR::Grammar grammar,
45
- # Hash[Integer, String] labels) -> Hash[Symbol, untyped]
46
- # private def format_value: (untyped value) -> String
47
- # private def self.format_value: (untyped value) -> String
47
+ # Hash[Integer, String] labels) -> Hash[Symbol, Object?]
48
+ # private def format_value: (Object? value) -> String
49
+ # private def self.format_value: (Object? value) -> String
48
50
 
49
51
  # @rbs (IR::Automaton automaton, ?max_tokens: Integer, ?max_configurations: Integer) -> String
50
52
  def render(automaton, max_tokens: LALR::Counterexample::DEFAULT_MAX_TOKENS,
@@ -88,10 +90,20 @@ module Ibex
88
90
 
89
91
  # @rbs skip
90
92
  def append_counterexample(lines, example, grammar, labels)
91
- label = example[:unifying] ? "unifying counterexample" : "nonunifying witness"
93
+ label = if example[:unifying]
94
+ "unifying counterexample"
95
+ elsif example[:inconclusive]
96
+ "inconclusive reachability witness"
97
+ else
98
+ "nonunifying witness"
99
+ end
92
100
  sentence = example[:sentence].map { |name| tree_label(grammar, labels, name) }
93
101
  sentence = sentence.dup.insert(example[:lookahead_index], "•").join(" ")
94
102
  lines << " #{label}: #{sentence}"
103
+ if example[:inconclusive]
104
+ search = example.fetch(:search)
105
+ lines << " search exhausted after #{search.fetch(:explored)} configurations; no classification was made"
106
+ end
95
107
  example[:interpretations].each do |interpretation|
96
108
  lines << " #{interpretation[:kind]} derivation:"
97
109
  append_tree(lines, interpretation[:tree], " ", grammar, labels)
@@ -24,58 +24,6 @@ module Ibex
24
24
  include RubyAST
25
25
  include RubySyntax
26
26
 
27
- EMBEDDED_RUNTIME_SOURCES = %w[
28
- ../runtime/version.rb
29
- ../runtime/table_format.rb
30
- ../runtime/location_span.rb
31
- ../runtime/cst/kind.rb
32
- ../runtime/cst/annotation.rb
33
- ../runtime/cst/green/trivia.rb
34
- ../runtime/cst/green/token.rb
35
- ../runtime/cst/green/node.rb
36
- ../runtime/cst/green/cache.rb
37
- ../runtime/cst/green/builder.rb
38
- ../runtime/cst/source_text.rb
39
- ../runtime/cst/syntax_token.rb
40
- ../runtime/cst/syntax_node.rb
41
- ../runtime/cst/cursor.rb
42
- ../runtime/cst/typed_node.rb
43
- ../runtime/cst/parse_result.rb
44
- ../runtime/cst/editing.rb
45
- ../runtime/cst/text_edit.rb
46
- ../runtime/cst/rewriter.rb
47
- ../runtime/cst/editor.rb
48
- ../runtime/cst/diff.rb
49
- ../runtime/cst/serialized_tree.rb
50
- ../runtime/cst/validator.rb
51
- ../runtime/cst/serialize.rb
52
- ../runtime/cst/incremental/token_memo.rb
53
- ../runtime/cst/incremental/relexer.rb
54
- ../runtime/cst/incremental/parse_memo.rb
55
- ../runtime/cst/incremental/lexed_syntax.rb
56
- ../runtime/cst/incremental/blender.rb
57
- ../runtime/cst/incremental/session.rb
58
- ../runtime/cst.rb
59
- ../runtime/ast_data.rb
60
- ../runtime/resource_limits.rb
61
- ../runtime/event_sanitizer.rb
62
- ../runtime/event.rb
63
- ../runtime/observation.rb
64
- ../runtime/repair.rb
65
- ../runtime/repair_priority_queue.rb
66
- ../runtime/repair_search.rb
67
- ../runtime/parser_sync_recovery.rb
68
- ../runtime/parser.rb
69
- ../runtime/lexer_input.rb
70
- ../runtime/generated_lexer.rb
71
- ../runtime/jsonl_tracer.rb
72
- ../runtime/event_jsonl_tracer.rb
73
- ../tables/compact.rb
74
- ../tables/compact_actions.rb
75
- ../tables/compact_productions.rb
76
- ].freeze #: Array[String]
77
- private_constant :EMBEDDED_RUNTIME_SOURCES
78
-
79
27
  # @rbs @automaton: IR::Automaton
80
28
  # @rbs @grammar: IR::Grammar
81
29
  # @rbs @table_format: Symbol
@@ -100,6 +48,7 @@ module Ibex
100
48
  cst_trivia: :leading, runtime_require: "ibex/runtime", error_messages: {})
101
49
  @automaton = automaton
102
50
  @grammar = automaton.grammar
51
+ reject_foreign_actions
103
52
  @table_format = table.to_sym
104
53
  @embedded = embedded
105
54
  @line_convert = line_convert
@@ -146,22 +95,37 @@ module Ibex
146
95
 
147
96
  private
148
97
 
98
+ # @rbs () -> void
99
+ def reject_foreign_actions
100
+ production = @grammar.productions.find do |entry|
101
+ entry.action&.code&.include?(foreign_action_sentinel)
102
+ end
103
+ return unless production
104
+
105
+ location = production.action&.location
106
+ rendered = location ? "#{location[:file]}:#{location[:line]}:#{location[:column]}" : "(codegen):1:1"
107
+ raise Ibex::Error,
108
+ "#{rendered}: cannot generate Ruby from imported C semantic actions; use analysis commands only"
109
+ end
110
+
111
+ # Kept local so the generic generator does not load the optional Bison
112
+ # importer and its IR validation graph.
113
+ # @rbs () -> String
114
+ def foreign_action_sentinel
115
+ "__ibex_foreign_action_c__"
116
+ end
117
+
149
118
  # @rbs (Array[String] lines) -> void
150
119
  def append_runtime(lines)
151
120
  if @embedded
152
- EMBEDDED_RUNTIME_SOURCES.each { |path| lines << embedded_source(path) }
121
+ require "ibex/runtime/embedded_source"
122
+ lines << Runtime::EmbeddedSource.render
153
123
  elsif @runtime_require
154
124
  lines << "require #{@runtime_require.inspect}"
155
125
  end
156
126
  lines << ""
157
127
  end
158
128
 
159
- # @rbs (String relative_path) -> String
160
- def embedded_source(relative_path)
161
- path = File.expand_path(relative_path, File.dirname(__FILE__))
162
- File.read(path).lines.reject { |line| line.start_with?("# frozen_string_literal:") }.join.rstrip
163
- end
164
-
165
129
  # @rbs (Array[String] lines) -> void
166
130
  def append_tables(lines)
167
131
  table_set = Tables.build(@automaton, format: @table_format)
@@ -250,12 +214,12 @@ module Ibex
250
214
  @grammar.conversions.empty?
251
215
  end
252
216
 
253
- # @rbs () -> Hash[Symbol, untyped]
217
+ # @rbs () -> CSTMetadata::metadata
254
218
  def cst_metadata
255
219
  @cst_metadata ||= CSTMetadata.new(@grammar, trivia_policy: @cst_trivia).build
256
220
  end
257
221
 
258
- # @rbs (untyped value) -> String
222
+ # @rbs (Object? value) -> String
259
223
  def deep_frozen_literal(value)
260
224
  case value
261
225
  when Array
@@ -272,7 +236,7 @@ module Ibex
272
236
  end
273
237
  end
274
238
 
275
- # @rbs (untyped table) -> String
239
+ # @rbs (Object? table) -> String
276
240
  def table_literal(table)
277
241
  if table.is_a?(Tables::CompactActions)
278
242
  return "Ibex::Tables::CompactActions.packed(#{packed_integers_literal(table.offsets)}, " \
@@ -286,12 +250,12 @@ module Ibex
286
250
  "row_count: #{table.row_count}, dense_width: #{table.dense_width})"
287
251
  end
288
252
 
289
- # @rbs (Array[Integer?] values) -> String
253
+ # @rbs (Array[untyped] values) -> String
290
254
  def packed_integers_literal(values)
291
255
  Tables::PackedIntegers.encode(values).inspect
292
256
  end
293
257
 
294
- # @rbs (Array[Integer?] values) -> String
258
+ # @rbs (Array[untyped] values) -> String
295
259
  def packed_signed_integers_literal(values)
296
260
  Tables::PackedIntegers.encode_signed(values).inspect
297
261
  end
@@ -48,16 +48,19 @@ module Ibex
48
48
  append_composed_orchestrator(lines, production, plan)
49
49
  end
50
50
 
51
- # @rbs (Array[String] lines, IR::Production production, Hash[Symbol, untyped] step, Integer index) -> void
51
+ # @rbs (Array[String] lines, IR::Production production, IR::action_composition_step step, Integer index) -> void
52
52
  def append_composed_fragment_method(lines, production, step, index)
53
53
  source = action_method_source.composed_fragment_method_source(production, step, index)
54
54
  if @line_convert
55
55
  location = step.fetch(:loc)
56
56
  lines << " class_eval(#{source.dump}, #{location[:file].inspect}, #{location[:line]})"
57
- elsif action_method_source.column_sensitive?(step.fetch(:code))
58
- lines << source
59
57
  else
60
- source.lines.each { |line| lines << " #{line.rstrip}" }
58
+ code = step.fetch(:code) #: String
59
+ if action_method_source.column_sensitive?(code)
60
+ lines << source
61
+ else
62
+ source.lines.each { |line| lines << " #{line.rstrip}" }
63
+ end
61
64
  end
62
65
  lines << ""
63
66
  end
@@ -67,7 +70,7 @@ module Ibex
67
70
  action_method_source.composed_fragment_name(production, index)
68
71
  end
69
72
 
70
- # @rbs (Array[String] lines, IR::Production production, Hash[Symbol, untyped] plan) -> void
73
+ # @rbs (Array[String] lines, IR::Production production, IR::action_composition_plan plan) -> void
71
74
  def append_composed_orchestrator(lines, production, plan)
72
75
  lines << " private def _ibex_action_#{production.id}" \
73
76
  "(val, _values, _ibex_locations, _ibex_location_stack, _ibex_location, " \
@@ -80,7 +83,7 @@ module Ibex
80
83
  lines.push(" _ibex_composed_values.last", " end", "")
81
84
  end
82
85
 
83
- # @rbs (Array[String] lines, IR::Production production, Hash[Symbol, untyped] step, Integer index) -> void
86
+ # @rbs (Array[String] lines, IR::Production production, IR::action_composition_step step, Integer index) -> void
84
87
  def append_composed_step(lines, production, step, index)
85
88
  inputs = step.fetch(:inputs)
86
89
  lines << " _ibex_step_values = _ibex_composed_values.values_at(#{inputs.join(', ')})"
@@ -5,6 +5,9 @@ module Ibex
5
5
  module Codegen
6
6
  # Generates typed Red syntax views from @node metadata.
7
7
  module RubySyntax
8
+ # @rbs!
9
+ # type syntax_definition = Hash[Symbol, untyped]
10
+
8
11
  private
9
12
 
10
13
  # @rbs (Array[String] lines) -> void
@@ -18,11 +21,12 @@ module Ibex
18
21
  lines.push(" end", "")
19
22
  end
20
23
 
21
- # @rbs () -> Hash[String, Hash[Symbol, untyped]]
24
+ # @rbs () -> Hash[String, syntax_definition]
22
25
  def syntax_node_definitions
23
26
  # @type self: Ruby
24
- slots = cst_metadata.fetch(:slots)
25
- definitions = {} #: Hash[String, Hash[Symbol, untyped]]
27
+ metadata = cst_metadata #: CSTMetadata::metadata
28
+ slots = metadata.fetch(:slots)
29
+ definitions = {} #: Hash[String, syntax_definition]
26
30
  @grammar.productions.each do |production|
27
31
  node = production.node
28
32
  next unless node
@@ -36,7 +40,7 @@ module Ibex
36
40
  definitions
37
41
  end
38
42
 
39
- # @rbs (Hash[String, untyped] left, Hash[String, untyped] right) -> Hash[String, untyped]
43
+ # @rbs (Hash[String, CSTMetadata::field_slot] left, Hash[String, CSTMetadata::field_slot] right) -> Hash[String, CSTMetadata::field_slot]
40
44
  def merge_syntax_fields(left, right)
41
45
  left.to_h do |name, left_slot|
42
46
  right_slot = right.fetch(name)
@@ -48,7 +52,7 @@ module Ibex
48
52
  end.freeze
49
53
  end
50
54
 
51
- # @rbs (Array[String] lines, Hash[Symbol, untyped] definition) -> void
55
+ # @rbs (Array[String] lines, syntax_definition definition) -> void
52
56
  def append_syntax_node(lines, definition)
53
57
  name = definition.fetch(:name)
54
58
  fields = definition.fetch(:fields)
@@ -65,12 +69,13 @@ module Ibex
65
69
  lines.push(" end", "")
66
70
  end
67
71
 
68
- # @rbs (Array[String] lines, Hash[String, untyped] fields) -> void
72
+ # @rbs (Array[String] lines, Hash[String, CSTMetadata::field_slot] fields) -> void
69
73
  def append_repetition_accessors(lines, fields)
70
74
  repeated = fields.select { |_field, slot| slot.is_a?(Hash) && slot[:extraction] }
71
75
  repeated.each do |field, slot|
72
- index = slot.fetch(:index)
73
- separated = slot.fetch(:extraction) == :separated_list
76
+ typed_slot = slot #: Hash[Symbol, untyped]
77
+ index = typed_slot.fetch(:index) #: Integer
78
+ separated = typed_slot.fetch(:extraction) == :separated_list
74
79
  lines << " def each_#{field}_element = list_items(#{index}, separated: #{separated})"
75
80
  next unless separated
76
81
 
@@ -80,8 +85,9 @@ module Ibex
80
85
  return unless repeated.one?
81
86
 
82
87
  field, slot = repeated.first
88
+ typed_slot = slot #: Hash[Symbol, untyped]
83
89
  lines << " alias each_element each_#{field}_element"
84
- return unless slot.fetch(:extraction) == :separated_list
90
+ return unless typed_slot.fetch(:extraction) == :separated_list
85
91
 
86
92
  lines << " alias each_separator each_#{field}_separator"
87
93
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+ # rbs_inline: enabled
3
+
4
+ module Ibex
5
+ module Configuration
6
+ # Produces an immutable Grammar IR view suitable for an explicitly
7
+ # noncanonical analysis algorithm. The source-owned contract remains the
8
+ # authority; callers must report the override through Configuration::Value.
9
+ module AnalysisGrammar
10
+ module_function
11
+
12
+ # @rbs (IR::Grammar grammar, Symbol algorithm) -> IR::Grammar
13
+ def for_algorithm(grammar, algorithm)
14
+ contract = grammar.parser_contract
15
+ return grammar unless contract&.algorithm&.explicit
16
+ return grammar if contract.algorithm.value == algorithm
17
+
18
+ analysis_contract = IR::ParserContract.new(
19
+ algorithm: IR::ParserContract::Entry.new(:algorithm),
20
+ entries: contract.entries, cst_trivia: contract.cst_trivia
21
+ )
22
+ IR::Grammar.new(
23
+ class_name: grammar.class_name, superclass: grammar.superclass, start: grammar.start,
24
+ expect: grammar.expect, options: grammar.options, symbols: grammar.symbols,
25
+ productions: grammar.productions, user_code: grammar.user_code, conversions: grammar.conversions,
26
+ warnings: grammar.warnings, expect_rr: grammar.expect_rr, user_code_chunks: grammar.user_code_chunks,
27
+ source_provenance: grammar.source_provenance,
28
+ parser_parameters: grammar.parser_parameters, value_printers: grammar.value_printers,
29
+ grammar_tests: grammar.grammar_tests, recovery: grammar.recovery, lexer: grammar.lexer,
30
+ mode: grammar.mode, starts: grammar.starts, parser_contract: analysis_contract
31
+ )
32
+ end
33
+ end
34
+ end
35
+ end