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.
- checksums.yaml +4 -4
- data/README.md +89 -123
- data/docs/architecture.md +477 -31
- data/docs/bison-import.md +103 -0
- data/docs/comparison-policy.md +127 -0
- data/docs/configuration-model.md +59 -0
- data/docs/configuration-report.md +28 -0
- data/docs/conflict-explanation-reviews/v1/records/README.md +28 -0
- data/docs/conflict-explanation-study.md +62 -0
- data/docs/construction-profiling.md +157 -0
- data/docs/cst-migration.md +106 -0
- data/docs/cst.md +237 -0
- data/docs/decisions/0000-template.md +24 -0
- data/docs/decisions/0001-separate-ir-pipeline.md +34 -0
- data/docs/decisions/0002-opaque-user-code-boundary.md +32 -0
- data/docs/decisions/0003-self-hosted-grammar-frontend.md +32 -0
- data/docs/decisions/0004-shared-semantic-and-lossless-source-model.md +33 -0
- data/docs/decisions/0005-contained-grammar-composition.md +34 -0
- data/docs/decisions/0006-bounded-structural-grammar-lowering.md +32 -0
- data/docs/decisions/0007-shared-parser-construction-pipeline.md +33 -0
- data/docs/decisions/0008-versioned-runtime-package-boundary.md +36 -0
- data/docs/decisions/0009-isolated-parser-sessions.md +34 -0
- data/docs/decisions/0010-committed-runtime-observation.md +34 -0
- data/docs/decisions/0011-versioned-semantic-action-boundary.md +37 -0
- data/docs/decisions/0012-bounded-nonexecuting-analysis.md +37 -0
- data/docs/decisions/0013-transactional-generation-publication.md +37 -0
- data/docs/decisions/0014-versioned-generated-lexer.md +35 -0
- data/docs/decisions/0015-worker-isolated-browser-analysis.md +32 -0
- data/docs/decisions/0016-red-green-concrete-syntax.md +34 -0
- data/docs/decisions/0017-persistent-syntax-artifacts.md +35 -0
- data/docs/decisions/0018-conservative-incremental-syntax-reuse.md +38 -0
- data/docs/decisions/0019-runtime-syntax-session-boundary.md +51 -0
- data/docs/decisions/0020-grammar-ir-parser-contract.md +65 -0
- data/docs/decisions/0021-data-only-parser-table-sidecar.md +50 -0
- data/docs/decisions/0022-manifest-bound-verification-report.md +77 -0
- data/docs/decisions/0023-syntax-only-repair-results.md +48 -0
- data/docs/decisions/0024-direct-ielr-construction.md +42 -0
- data/docs/decisions/README.md +74 -0
- data/docs/declarative-configuration.md +262 -0
- data/docs/development.md +306 -0
- data/docs/direct-ielr-decision.md +120 -0
- data/docs/direct-multi-entry-decision.md +82 -0
- data/docs/editor-setup.md +26 -0
- data/docs/error-ux-review-rubric-v1.md +117 -0
- data/docs/error-ux-reviews/v1/records/README.md +22 -0
- data/docs/error-ux-round2-review-status-v1.json +27 -0
- data/docs/error-ux-round2-reviews/v1/records/README.md +30 -0
- data/docs/error-ux-round2-v1.json +1581 -0
- data/docs/error-ux-round2.md +111 -0
- data/docs/error-ux.md +114 -0
- data/docs/getting-started.md +80 -0
- data/docs/grammar-reference.md +629 -18
- data/docs/ielr-design.md +43 -0
- data/docs/ielr.md +92 -0
- data/docs/ja/bison-import.md +51 -0
- data/docs/ja/stable-api.md +53 -0
- data/docs/lexer-construction-profile.md +109 -0
- data/docs/lexer-migration.md +56 -0
- data/docs/maturity.md +128 -0
- data/docs/project-site-strategy.md +54 -0
- data/docs/racc-migration-evidence.md +45 -0
- data/docs/racc-migration.md +45 -6
- data/docs/release-readiness.md +221 -0
- data/docs/repair-semantics.md +123 -0
- data/docs/runtime-abi-evolution.md +307 -0
- data/docs/stability.md +234 -0
- data/docs/status.md +43 -0
- data/docs/syntax-sessions.md +183 -0
- data/docs/table-artifact.md +125 -0
- data/docs/test-interactions.md +219 -0
- data/docs/verification-report.md +137 -0
- data/docs/verifier-trust-boundary.md +199 -0
- data/docs/workloads.md +132 -0
- data/examples/README.md +60 -0
- data/examples/calculator.y +44 -0
- data/examples/csv.y +32 -0
- data/examples/ini.y +70 -0
- data/examples/json.y +48 -0
- data/examples/tiny_language.y +75 -0
- data/lib/ibex/analysis/digraph.rb +128 -0
- data/lib/ibex/analysis/sets.rb +5 -4
- data/lib/ibex/analysis.rb +1 -0
- data/lib/ibex/artifact_set.rb +63 -0
- data/lib/ibex/bison_import/importer.rb +516 -0
- data/lib/ibex/bison_import/tokenizer.rb +260 -0
- data/lib/ibex/bison_import.rb +200 -0
- data/lib/ibex/bounded_subprocess.rb +171 -0
- data/lib/ibex/cli/ambiguity.rb +75 -0
- data/lib/ibex/cli/analysis.rb +134 -0
- data/lib/ibex/cli/bison_import.rb +121 -0
- data/lib/ibex/cli/config.rb +128 -0
- data/lib/ibex/cli/counterexample_options.rb +6 -2
- data/lib/ibex/cli/coverage.rb +173 -0
- data/lib/ibex/cli/debug.rb +106 -0
- data/lib/ibex/cli/diagnostics.rb +136 -0
- data/lib/ibex/cli/documentation.rb +70 -0
- data/lib/ibex/cli/equiv.rb +169 -0
- data/lib/ibex/cli/error_messages.rb +184 -0
- data/lib/ibex/cli/explain.rb +85 -0
- data/lib/ibex/cli/fix.rb +203 -0
- data/lib/ibex/cli/formatting.rb +387 -0
- data/lib/ibex/cli/fuzz.rb +200 -0
- data/lib/ibex/cli/fuzz_regressions.rb +145 -0
- data/lib/ibex/cli/generation_artifacts.rb +189 -0
- data/lib/ibex/cli/generation_error_messages.rb +39 -0
- data/lib/ibex/cli/grammar_tests.rb +140 -0
- data/lib/ibex/cli/ir_tools.rb +128 -0
- data/lib/ibex/cli/lsp.rb +33 -0
- data/lib/ibex/cli/outputs.rb +133 -23
- data/lib/ibex/cli/racc_migration.rb +87 -0
- data/lib/ibex/cli/reduce.rb +202 -0
- data/lib/ibex/cli/reduce_reporting.rb +71 -0
- data/lib/ibex/cli/samples.rb +118 -0
- data/lib/ibex/cli/verify.rb +116 -0
- data/lib/ibex/cli/watch.rb +104 -0
- data/lib/ibex/cli.rb +825 -55
- data/lib/ibex/codegen/action_locations.rb +103 -0
- data/lib/ibex/codegen/action_method_source.rb +209 -0
- data/lib/ibex/codegen/action_source.rb +119 -0
- data/lib/ibex/codegen/ambiguity.rb +174 -0
- data/lib/ibex/codegen/cst_metadata.rb +171 -0
- data/lib/ibex/codegen/documentation.rb +170 -0
- data/lib/ibex/codegen/explain.rb +380 -0
- data/lib/ibex/codegen/generated_action_abi.rb +293 -0
- data/lib/ibex/codegen/html.rb +94 -10
- data/lib/ibex/codegen/mermaid.rb +43 -0
- data/lib/ibex/codegen/railroad.rb +197 -0
- data/lib/ibex/codegen/railroad_documentation.rb +59 -0
- data/lib/ibex/codegen/rbs.rb +331 -2
- data/lib/ibex/codegen/report.rb +67 -15
- data/lib/ibex/codegen/ruby.rb +305 -66
- data/lib/ibex/codegen/ruby_actions.rb +146 -0
- data/lib/ibex/codegen/ruby_ast.rb +121 -0
- data/lib/ibex/codegen/ruby_error_messages.rb +28 -0
- data/lib/ibex/codegen/ruby_lexer.rb +83 -0
- data/lib/ibex/codegen/ruby_syntax.rb +96 -0
- data/lib/ibex/codegen/ruby_table_metadata.rb +57 -0
- data/lib/ibex/codegen/ruby_value_printers.rb +56 -0
- data/lib/ibex/codegen/symbol_labels.rb +1 -1
- data/lib/ibex/configuration/analysis_grammar.rb +35 -0
- data/lib/ibex/configuration/explanation.rb +421 -0
- data/lib/ibex/configuration/inspector.rb +232 -0
- data/lib/ibex/configuration.rb +580 -0
- data/lib/ibex/coverage/collector.rb +198 -0
- data/lib/ibex/coverage/event_stream.rb +103 -0
- data/lib/ibex/coverage/report.rb +267 -0
- data/lib/ibex/coverage/runtime_event_validator.rb +169 -0
- data/lib/ibex/coverage.rb +13 -0
- data/lib/ibex/delta_reducer.rb +99 -0
- data/lib/ibex/diff.rb +140 -0
- data/lib/ibex/equiv/machine.rb +135 -0
- data/lib/ibex/equiv.rb +373 -0
- data/lib/ibex/error_messages/parser.rb +159 -0
- data/lib/ibex/error_messages/parser_v2.rb +198 -0
- data/lib/ibex/error_messages/renderer.rb +65 -0
- data/lib/ibex/error_messages/sentence_search.rb +196 -0
- data/lib/ibex/error_messages/update.rb +169 -0
- data/lib/ibex/error_messages.rb +165 -0
- data/lib/ibex/fix.rb +557 -0
- data/lib/ibex/frontend/ast.rb +166 -7
- data/lib/ibex/frontend/bootstrap_parser.rb +40 -4
- data/lib/ibex/frontend/diagnostic.rb +81 -0
- data/lib/ibex/frontend/diagnostic_recovery.rb +268 -0
- data/lib/ibex/frontend/dsl.rb +66 -7
- data/lib/ibex/frontend/formatter.rb +453 -0
- data/lib/ibex/frontend/generated_parser.rb +644 -190
- data/lib/ibex/frontend/generated_parser_base.rb +170 -32
- data/lib/ibex/frontend/generated_parser_includes.rb +51 -0
- data/lib/ibex/frontend/generated_parser_metadata.rb +61 -0
- data/lib/ibex/frontend/generated_parser_parameters.rb +60 -0
- data/lib/ibex/frontend/generation.rb +33 -0
- data/lib/ibex/frontend/lexer.rb +162 -10
- data/lib/ibex/frontend/lexer_recovery.rb +84 -0
- data/lib/ibex/frontend/parser/declarations.rb +262 -11
- data/lib/ibex/frontend/parser/parameters.rb +82 -0
- data/lib/ibex/frontend/parser/rules.rb +43 -6
- data/lib/ibex/frontend/parser.rb +182 -4
- data/lib/ibex/frontend/parser_configuration_support.rb +56 -0
- data/lib/ibex/frontend/regenerator.rb +27 -1
- data/lib/ibex/frontend/resolution.rb +70 -0
- data/lib/ibex/frontend/resolver.rb +217 -0
- data/lib/ibex/frontend/rule_documentation.rb +104 -0
- data/lib/ibex/frontend/source_cursor.rb +133 -9
- data/lib/ibex/frontend/source_document.rb +229 -0
- data/lib/ibex/frontend/source_loader.rb +150 -0
- data/lib/ibex/frontend/source_span.rb +89 -0
- data/lib/ibex/frontend/token_adapter/declaration_document_state.rb +47 -0
- data/lib/ibex/frontend/token_adapter/declaration_lexer_state.rb +83 -0
- data/lib/ibex/frontend/token_adapter/declaration_state.rb +244 -22
- data/lib/ibex/frontend/token_adapter/delimiter_tracker.rb +8 -2
- data/lib/ibex/frontend/token_adapter/rule_state.rb +60 -2
- data/lib/ibex/frontend/token_adapter.rb +18 -3
- data/lib/ibex/frontend.rb +14 -2
- data/lib/ibex/fuzz.rb +219 -0
- data/lib/ibex/generation_input.rb +57 -0
- data/lib/ibex/generation_manifest.rb +211 -0
- data/lib/ibex/generation_transaction.rb +261 -0
- data/lib/ibex/generation_transaction_recovery.rb +109 -0
- data/lib/ibex/generation_transaction_validation.rb +196 -0
- data/lib/ibex/grammar_tests.rb +206 -0
- data/lib/ibex/ir/automaton_ir.rb +86 -11
- data/lib/ibex/ir/grammar_ir.rb +170 -26
- data/lib/ibex/ir/lexer_ir.rb +76 -0
- data/lib/ibex/ir/parser_contract.rb +135 -0
- data/lib/ibex/ir/serialize.rb +268 -50
- data/lib/ibex/ir/validator/automaton.rb +375 -0
- data/lib/ibex/ir/validator/base.rb +147 -0
- data/lib/ibex/ir/validator/grammar.rb +634 -0
- data/lib/ibex/ir/validator/lexer.rb +113 -0
- data/lib/ibex/ir/validator.rb +63 -0
- data/lib/ibex/ir.rb +71 -5
- data/lib/ibex/lalr/build_metrics.rb +71 -0
- data/lib/ibex/lalr/builder.rb +514 -52
- data/lib/ibex/lalr/conflict.rb +1 -0
- data/lib/ibex/lalr/conflict_search.rb +26 -9
- data/lib/ibex/lalr/counterexample.rb +38 -18
- data/lib/ibex/lalr/direct_lookaheads.rb +289 -0
- data/lib/ibex/lalr/goto_follows.rb +229 -0
- data/lib/ibex/lalr/ielr/annotator.rb +214 -0
- data/lib/ibex/lalr/ielr/bits.rb +28 -0
- data/lib/ibex/lalr/ielr/inadequacy.rb +47 -0
- data/lib/ibex/lalr/ielr/item_lookaheads.rb +78 -0
- data/lib/ibex/lalr/ielr/pipeline.rb +75 -0
- data/lib/ibex/lalr/ielr/split_stability.rb +78 -0
- data/lib/ibex/lalr/ielr/split_state.rb +20 -0
- data/lib/ibex/lalr/ielr/state_splitter.rb +258 -0
- data/lib/ibex/lalr/ielr_partition.rb +166 -0
- data/lib/ibex/lalr/inadequacy_report.rb +50 -0
- data/lib/ibex/lalr/lookahead_propagation.rb +111 -0
- data/lib/ibex/lalr/lr0_collection.rb +121 -0
- data/lib/ibex/lalr/on_error_reductions.rb +74 -0
- data/lib/ibex/lalr/unreachable_states.rb +80 -0
- data/lib/ibex/lalr.rb +59 -1
- data/lib/ibex/location.rb +129 -0
- data/lib/ibex/lsp/document_handlers.rb +68 -0
- data/lib/ibex/lsp/document_store.rb +264 -0
- data/lib/ibex/lsp/document_store_diagnostics.rb +44 -0
- data/lib/ibex/lsp/document_store_validation.rb +61 -0
- data/lib/ibex/lsp/initialization_handlers.rb +80 -0
- data/lib/ibex/lsp/navigation_handlers.rb +70 -0
- data/lib/ibex/lsp/parser_configuration_assistance.rb +149 -0
- data/lib/ibex/lsp/position_codec.rb +113 -0
- data/lib/ibex/lsp/protocol_error.rb +33 -0
- data/lib/ibex/lsp/request_handlers.rb +46 -0
- data/lib/ibex/lsp/request_support.rb +94 -0
- data/lib/ibex/lsp/server.rb +148 -0
- data/lib/ibex/lsp/symbol_index.rb +241 -0
- data/lib/ibex/lsp/symbol_index_builder.rb +277 -0
- data/lib/ibex/lsp/symbol_index_precedence_references.rb +44 -0
- data/lib/ibex/lsp/symbol_index_source_queries.rb +61 -0
- data/lib/ibex/lsp/symbol_occurrence.rb +23 -0
- data/lib/ibex/lsp/transport.rb +128 -0
- data/lib/ibex/lsp/workspace.rb +128 -0
- data/lib/ibex/lsp/workspace_analyzer.rb +199 -0
- data/lib/ibex/lsp.rb +33 -0
- data/lib/ibex/messages/en.yml +28 -0
- data/lib/ibex/messages/ja.yml +28 -0
- data/lib/ibex/messages.rb +68 -0
- data/lib/ibex/metrics.rb +175 -0
- data/lib/ibex/normalize/declarations.rb +142 -7
- data/lib/ibex/normalize/diagnostics.rb +94 -24
- data/lib/ibex/normalize/expander.rb +64 -59
- data/lib/ibex/normalize/expression.rb +63 -40
- data/lib/ibex/normalize/grammar_builder.rb +26 -0
- data/lib/ibex/normalize/inline_expansion.rb +465 -0
- data/lib/ibex/normalize/inline_validation.rb +174 -0
- data/lib/ibex/normalize/lexer.rb +131 -0
- data/lib/ibex/normalize/named_references.rb +60 -0
- data/lib/ibex/normalize/nodes.rb +46 -0
- data/lib/ibex/normalize/parameter_ebnf_lowering.rb +70 -0
- data/lib/ibex/normalize/parameter_lowering.rb +143 -0
- data/lib/ibex/normalize/parameter_substitution.rb +125 -0
- data/lib/ibex/normalize/parameter_validation.rb +140 -0
- data/lib/ibex/normalize/parameters.rb +226 -0
- data/lib/ibex/normalize/parser_configuration.rb +70 -0
- data/lib/ibex/normalize/recovery_declarations.rb +84 -0
- data/lib/ibex/normalize.rb +172 -17
- data/lib/ibex/racc_migration/checker.rb +122 -0
- data/lib/ibex/racc_migration/harness.rb +177 -0
- data/lib/ibex/racc_migration/report.rb +97 -0
- data/lib/ibex/racc_migration.rb +12 -0
- data/lib/ibex/rake_task.rb +116 -0
- data/lib/ibex/samples.rb +216 -0
- data/lib/ibex/table_artifact/builder.rb +266 -0
- data/lib/ibex/table_artifact/cst_projection.rb +70 -0
- data/lib/ibex/table_artifact/document.rb +39 -0
- data/lib/ibex/table_artifact/executor.rb +187 -0
- data/lib/ibex/table_artifact/serializer.rb +57 -0
- data/lib/ibex/table_artifact/validator/metadata.rb +179 -0
- data/lib/ibex/table_artifact/validator/support.rb +86 -0
- data/lib/ibex/table_artifact/validator/tables.rb +238 -0
- data/lib/ibex/table_artifact/validator.rb +253 -0
- data/lib/ibex/table_artifact.rb +88 -0
- data/lib/ibex/table_simulation/result.rb +55 -0
- data/lib/ibex/table_simulation/simulator.rb +253 -0
- data/lib/ibex/table_simulation/step.rb +62 -0
- data/lib/ibex/table_simulation/text.rb +31 -0
- data/lib/ibex/table_simulation.rb +13 -0
- data/lib/ibex/tables.rb +22 -69
- data/lib/ibex/verifiable_generation_bundle.rb +86 -0
- data/lib/ibex/verification_report/builder.rb +159 -0
- data/lib/ibex/verification_report/canonical_ir.rb +123 -0
- data/lib/ibex/verification_report/logical_path.rb +68 -0
- data/lib/ibex/verification_report/validator.rb +329 -0
- data/lib/ibex/verification_report.rb +69 -0
- data/lib/ibex/verify/action_correspondence.rb +138 -0
- data/lib/ibex/verify/language_witness.rb +295 -0
- data/lib/ibex/verify/reference_collection.rb +190 -0
- data/lib/ibex/verify/result.rb +73 -0
- data/lib/ibex/verify/verifier.rb +598 -0
- data/lib/ibex/verify.rb +15 -0
- data/lib/ibex/version.rb +1 -1
- data/lib/ibex/watch/runner.rb +181 -0
- data/lib/ibex/watch/source_snapshot.rb +98 -0
- data/lib/ibex/watch.rb +11 -0
- data/lib/ibex.rb +35 -1
- data/schema/automaton-ir-definitions.schema.json +401 -0
- data/schema/automaton-ir.schema.json +65 -0
- data/schema/benchmark-v1.schema.json +212 -0
- data/schema/benchmark-v2.schema.json +61 -0
- data/schema/bison-import-v1.schema.json +106 -0
- data/schema/conflict-explanation-review-v1.schema.json +196 -0
- data/schema/conflict-explanation-study-v1.schema.json +528 -0
- data/schema/construction-profile-v1.schema.json +779 -0
- data/schema/cst-v1.json +170 -0
- data/schema/diff-v1.schema.json +41 -0
- data/schema/direct-ielr-decision-v1.schema.json +200 -0
- data/schema/equiv-v1.schema.json +64 -0
- data/schema/error-ux-review-v1.schema.json +609 -0
- data/schema/error-ux-round2-review-v1.schema.json +191 -0
- data/schema/error-ux-round2-v1.schema.json +519 -0
- data/schema/error-ux-v1.schema.json +258 -0
- data/schema/explain-v1.schema.json +495 -0
- data/schema/fix-v1.schema.json +64 -0
- data/schema/fix-v2.schema.json +66 -0
- data/schema/fix-v3.schema.json +101 -0
- data/schema/frontend-diagnostics-v1.schema.json +154 -0
- data/schema/fuzz-regression-v1.schema.json +79 -0
- data/schema/fuzz-v1.schema.json +114 -0
- data/schema/generation-manifest-v1.schema.json +115 -0
- data/schema/grammar-ir-extensions.schema.json +734 -0
- data/schema/grammar-ir-foundation.schema.json +426 -0
- data/schema/grammar-ir.schema.json +271 -0
- data/schema/ielr-benchmark-v1.schema.json +85 -0
- data/schema/lexer-ir-v1.schema.json +215 -0
- data/schema/lexer-profile-v1.schema.json +491 -0
- data/schema/metrics-v1.schema.json +60 -0
- data/schema/migration-check-v1.schema.json +60 -0
- data/schema/performance-comparison-v1.schema.json +395 -0
- data/schema/public-performance-comparison-v1.schema.json +506 -0
- data/schema/public-performance-profile-v1.schema.json +360 -0
- data/schema/reduce-v1.schema.json +22 -0
- data/schema/reduce-v2.schema.json +63 -0
- data/schema/runtime-coverage-v1.schema.json +86 -0
- data/schema/runtime-event-v1.schema.json +308 -0
- data/schema/table-artifact-v1.schema.json +377 -0
- data/schema/table-simulation-v1.schema.json +70 -0
- data/schema/verification-report-v1.schema.json +222 -0
- data/schema/verify-v1.schema.json +42 -0
- data/sig/ibex/analysis/digraph.rbs +19 -0
- data/sig/ibex/artifact_set.rbs +37 -0
- data/sig/ibex/bison_import/importer.rbs +140 -0
- data/sig/ibex/bison_import/tokenizer.rbs +91 -0
- data/sig/ibex/bison_import.rbs +95 -0
- data/sig/ibex/bounded_subprocess.rbs +76 -0
- data/sig/ibex/cli/ambiguity.rbs +28 -0
- data/sig/ibex/cli/analysis.rbs +43 -0
- data/sig/ibex/cli/bison_import.rbs +32 -0
- data/sig/ibex/cli/config.rbs +35 -0
- data/sig/ibex/cli/counterexample_options.rbs +2 -0
- data/sig/ibex/cli/coverage.rbs +53 -0
- data/sig/ibex/cli/debug.rbs +28 -0
- data/sig/ibex/cli/diagnostics.rbs +51 -0
- data/sig/ibex/cli/documentation.rbs +29 -0
- data/sig/ibex/cli/equiv.rbs +49 -0
- data/sig/ibex/cli/error_messages.rbs +63 -0
- data/sig/ibex/cli/explain.rbs +31 -0
- data/sig/ibex/cli/fix.rbs +53 -0
- data/sig/ibex/cli/formatting.rbs +107 -0
- data/sig/ibex/cli/fuzz.rbs +47 -0
- data/sig/ibex/cli/fuzz_regressions.rbs +40 -0
- data/sig/ibex/cli/generation_artifacts.rbs +69 -0
- data/sig/ibex/cli/generation_error_messages.rbs +19 -0
- data/sig/ibex/cli/grammar_tests.rbs +48 -0
- data/sig/ibex/cli/ir_tools.rbs +39 -0
- data/sig/ibex/cli/lsp.rbs +14 -0
- data/sig/ibex/cli/outputs.rbs +26 -3
- data/sig/ibex/cli/racc_migration.rbs +30 -0
- data/sig/ibex/cli/reduce.rbs +60 -0
- data/sig/ibex/cli/reduce_reporting.rbs +27 -0
- data/sig/ibex/cli/samples.rbs +38 -0
- data/sig/ibex/cli/verify.rbs +28 -0
- data/sig/ibex/cli/watch.rbs +43 -0
- data/sig/ibex/cli.rbs +182 -9
- data/sig/ibex/codegen/action_locations.rbs +45 -0
- data/sig/ibex/codegen/action_method_source.rbs +65 -0
- data/sig/ibex/codegen/action_source.rbs +50 -0
- data/sig/ibex/codegen/ambiguity.rbs +60 -0
- data/sig/ibex/codegen/cst_metadata.rbs +59 -0
- data/sig/ibex/codegen/documentation.rbs +50 -0
- data/sig/ibex/codegen/explain.rbs +105 -0
- data/sig/ibex/codegen/generated_action_abi.rbs +105 -0
- data/sig/ibex/codegen/html.rbs +18 -2
- data/sig/ibex/codegen/mermaid.rbs +16 -0
- data/sig/ibex/codegen/railroad.rbs +82 -0
- data/sig/ibex/codegen/railroad_documentation.rbs +31 -0
- data/sig/ibex/codegen/rbs.rbs +86 -4
- data/sig/ibex/codegen/report.rbs +16 -8
- data/sig/ibex/codegen/ruby.rbs +105 -28
- data/sig/ibex/codegen/ruby_actions.rbs +54 -0
- data/sig/ibex/codegen/ruby_ast.rbs +34 -0
- data/sig/ibex/codegen/ruby_error_messages.rbs +16 -0
- data/sig/ibex/codegen/ruby_lexer.rbs +25 -0
- data/sig/ibex/codegen/ruby_syntax.rbs +27 -0
- data/sig/ibex/codegen/ruby_table_metadata.rbs +26 -0
- data/sig/ibex/codegen/ruby_value_printers.rbs +28 -0
- data/sig/ibex/configuration/analysis_grammar.rbs +13 -0
- data/sig/ibex/configuration/explanation.rbs +195 -0
- data/sig/ibex/configuration/inspector.rbs +53 -0
- data/sig/ibex/configuration.rbs +242 -0
- data/sig/ibex/coverage/collector.rbs +78 -0
- data/sig/ibex/coverage/event_stream.rbs +44 -0
- data/sig/ibex/coverage/report.rbs +102 -0
- data/sig/ibex/coverage/runtime_event_validator.rbs +70 -0
- data/sig/ibex/coverage.rbs +7 -0
- data/sig/ibex/delta_reducer.rbs +38 -0
- data/sig/ibex/diff.rbs +47 -0
- data/sig/ibex/equiv/machine.rbs +54 -0
- data/sig/ibex/equiv.rbs +129 -0
- data/sig/ibex/error_messages/parser.rbs +58 -0
- data/sig/ibex/error_messages/parser_v2.rbs +67 -0
- data/sig/ibex/error_messages/renderer.rbs +23 -0
- data/sig/ibex/error_messages/sentence_search.rbs +80 -0
- data/sig/ibex/error_messages/update.rbs +43 -0
- data/sig/ibex/error_messages.rbs +85 -0
- data/sig/ibex/fix.rbs +138 -0
- data/sig/ibex/frontend/ast.rbs +237 -22
- data/sig/ibex/frontend/bootstrap_parser.rbs +13 -0
- data/sig/ibex/frontend/diagnostic.rbs +53 -0
- data/sig/ibex/frontend/diagnostic_recovery.rbs +98 -0
- data/sig/ibex/frontend/dsl.rbs +33 -4
- data/sig/ibex/frontend/formatter.rbs +143 -0
- data/sig/ibex/frontend/generated_parser.rbs +228 -68
- data/sig/ibex/frontend/generated_parser_base.rbs +65 -12
- data/sig/ibex/frontend/generated_parser_includes.rbs +23 -0
- data/sig/ibex/frontend/generated_parser_metadata.rbs +23 -0
- data/sig/ibex/frontend/generated_parser_parameters.rbs +24 -0
- data/sig/ibex/frontend/generation.rbs +6 -0
- data/sig/ibex/frontend/lexer.rbs +49 -2
- data/sig/ibex/frontend/lexer_recovery.rbs +25 -0
- data/sig/ibex/frontend/parser/declarations.rbs +57 -0
- data/sig/ibex/frontend/parser/parameters.rbs +28 -0
- data/sig/ibex/frontend/parser/rules.rbs +3 -0
- data/sig/ibex/frontend/parser.rbs +66 -0
- data/sig/ibex/frontend/parser_configuration_support.rbs +27 -0
- data/sig/ibex/frontend/regenerator.rbs +11 -0
- data/sig/ibex/frontend/resolution.rbs +34 -0
- data/sig/ibex/frontend/resolver.rbs +91 -0
- data/sig/ibex/frontend/rule_documentation.rbs +42 -0
- data/sig/ibex/frontend/source_cursor.rbs +38 -5
- data/sig/ibex/frontend/source_document.rbs +119 -0
- data/sig/ibex/frontend/source_loader.rbs +66 -0
- data/sig/ibex/frontend/source_span.rbs +56 -0
- data/sig/ibex/frontend/token_adapter/declaration_document_state.rbs +21 -0
- data/sig/ibex/frontend/token_adapter/declaration_lexer_state.rbs +27 -0
- data/sig/ibex/frontend/token_adapter/declaration_state.rbs +83 -3
- data/sig/ibex/frontend/token_adapter/rule_state.rbs +20 -0
- data/sig/ibex/frontend/token_adapter.rbs +11 -2
- data/sig/ibex/frontend.rbs +1 -1
- data/sig/ibex/fuzz.rbs +71 -0
- data/sig/ibex/generation_input.rbs +37 -0
- data/sig/ibex/generation_manifest.rbs +70 -0
- data/sig/ibex/generation_transaction.rbs +82 -0
- data/sig/ibex/generation_transaction_recovery.rbs +36 -0
- data/sig/ibex/generation_transaction_validation.rbs +65 -0
- data/sig/ibex/grammar_tests.rbs +93 -0
- data/sig/ibex/ir/automaton_ir.rbs +35 -10
- data/sig/ibex/ir/grammar_ir.rbs +96 -22
- data/sig/ibex/ir/lexer_ir.rbs +57 -0
- data/sig/ibex/ir/parser_contract.rbs +69 -0
- data/sig/ibex/ir/serialize.rbs +75 -23
- data/sig/ibex/ir/validator/automaton.rbs +112 -0
- data/sig/ibex/ir/validator/base.rbs +69 -0
- data/sig/ibex/ir/validator/grammar.rbs +195 -0
- data/sig/ibex/ir/validator/lexer.rbs +37 -0
- data/sig/ibex/ir/validator.rbs +16 -0
- data/sig/ibex/ir.rbs +45 -5
- data/sig/ibex/lalr/build_metrics.rbs +60 -0
- data/sig/ibex/lalr/builder.rbs +150 -19
- data/sig/ibex/lalr/conflict_search.rbs +12 -5
- data/sig/ibex/lalr/counterexample.rbs +20 -14
- data/sig/ibex/lalr/direct_lookaheads.rbs +93 -0
- data/sig/ibex/lalr/goto_follows.rbs +89 -0
- data/sig/ibex/lalr/ielr/annotator.rbs +67 -0
- data/sig/ibex/lalr/ielr/bits.rbs +14 -0
- data/sig/ibex/lalr/ielr/inadequacy.rbs +24 -0
- data/sig/ibex/lalr/ielr/item_lookaheads.rbs +35 -0
- data/sig/ibex/lalr/ielr/pipeline.rbs +17 -0
- data/sig/ibex/lalr/ielr/split_stability.rbs +27 -0
- data/sig/ibex/lalr/ielr/split_state.rbs +14 -0
- data/sig/ibex/lalr/ielr/state_splitter.rbs +76 -0
- data/sig/ibex/lalr/ielr_partition.rbs +71 -0
- data/sig/ibex/lalr/inadequacy_report.rbs +21 -0
- data/sig/ibex/lalr/lookahead_propagation.rbs +38 -0
- data/sig/ibex/lalr/lr0_collection.rbs +50 -0
- data/sig/ibex/lalr/on_error_reductions.rbs +22 -0
- data/sig/ibex/lalr/unreachable_states.rbs +25 -0
- data/sig/ibex/lalr.rbs +17 -1
- data/sig/ibex/location.rbs +67 -0
- data/sig/ibex/lsp/document_handlers.rbs +24 -0
- data/sig/ibex/lsp/document_store.rbs +94 -0
- data/sig/ibex/lsp/document_store_diagnostics.rbs +20 -0
- data/sig/ibex/lsp/document_store_validation.rbs +26 -0
- data/sig/ibex/lsp/initialization_handlers.rbs +30 -0
- data/sig/ibex/lsp/navigation_handlers.rbs +33 -0
- data/sig/ibex/lsp/parser_configuration_assistance.rbs +49 -0
- data/sig/ibex/lsp/position_codec.rbs +44 -0
- data/sig/ibex/lsp/protocol_error.rbs +32 -0
- data/sig/ibex/lsp/request_handlers.rbs +26 -0
- data/sig/ibex/lsp/request_support.rbs +40 -0
- data/sig/ibex/lsp/server.rbs +55 -0
- data/sig/ibex/lsp/symbol_index.rbs +77 -0
- data/sig/ibex/lsp/symbol_index_builder.rbs +88 -0
- data/sig/ibex/lsp/symbol_index_precedence_references.rbs +18 -0
- data/sig/ibex/lsp/symbol_index_source_queries.rbs +26 -0
- data/sig/ibex/lsp/symbol_occurrence.rbs +31 -0
- data/sig/ibex/lsp/transport.rbs +47 -0
- data/sig/ibex/lsp/workspace.rbs +42 -0
- data/sig/ibex/lsp/workspace_analyzer.rbs +69 -0
- data/sig/ibex/lsp.rbs +7 -0
- data/sig/ibex/messages.rbs +26 -0
- data/sig/ibex/metrics.rbs +50 -0
- data/sig/ibex/normalize/declarations.rbs +31 -0
- data/sig/ibex/normalize/diagnostics.rbs +13 -4
- data/sig/ibex/normalize/expander.rbs +22 -16
- data/sig/ibex/normalize/expression.rbs +11 -9
- data/sig/ibex/normalize/grammar_builder.rbs +11 -0
- data/sig/ibex/normalize/inline_expansion.rbs +129 -0
- data/sig/ibex/normalize/inline_validation.rbs +40 -0
- data/sig/ibex/normalize/lexer.rbs +37 -0
- data/sig/ibex/normalize/named_references.rbs +20 -0
- data/sig/ibex/normalize/nodes.rbs +14 -0
- data/sig/ibex/normalize/parameter_ebnf_lowering.rbs +33 -0
- data/sig/ibex/normalize/parameter_lowering.rbs +35 -0
- data/sig/ibex/normalize/parameter_substitution.rbs +42 -0
- data/sig/ibex/normalize/parameter_validation.rbs +44 -0
- data/sig/ibex/normalize/parameters.rbs +51 -0
- data/sig/ibex/normalize/parser_configuration.rbs +23 -0
- data/sig/ibex/normalize/recovery_declarations.rbs +24 -0
- data/sig/ibex/normalize.rbs +129 -18
- data/sig/ibex/racc_migration/checker.rbs +36 -0
- data/sig/ibex/racc_migration/harness.rbs +16 -0
- data/sig/ibex/racc_migration/report.rbs +55 -0
- data/sig/ibex/racc_migration.rbs +8 -0
- data/sig/ibex/rake_task.rbs +51 -0
- data/sig/ibex/samples.rbs +60 -0
- data/sig/ibex/table_artifact/builder.rbs +93 -0
- data/sig/ibex/table_artifact/cst_projection.rbs +20 -0
- data/sig/ibex/table_artifact/document.rbs +27 -0
- data/sig/ibex/table_artifact/executor.rbs +66 -0
- data/sig/ibex/table_artifact/serializer.rbs +25 -0
- data/sig/ibex/table_artifact/validator/metadata.rbs +52 -0
- data/sig/ibex/table_artifact/validator/support.rbs +46 -0
- data/sig/ibex/table_artifact/validator/tables.rbs +63 -0
- data/sig/ibex/table_artifact/validator.rbs +66 -0
- data/sig/ibex/table_artifact.rbs +32 -0
- data/sig/ibex/table_simulation/result.rbs +36 -0
- data/sig/ibex/table_simulation/simulator.rbs +98 -0
- data/sig/ibex/table_simulation/step.rbs +42 -0
- data/sig/ibex/table_simulation/text.rbs +14 -0
- data/sig/ibex/table_simulation.rbs +7 -0
- data/sig/ibex/tables.rbs +10 -35
- data/sig/ibex/verifiable_generation_bundle.rbs +24 -0
- data/sig/ibex/verification_report/builder.rbs +53 -0
- data/sig/ibex/verification_report/canonical_ir.rbs +41 -0
- data/sig/ibex/verification_report/logical_path.rbs +34 -0
- data/sig/ibex/verification_report/validator.rbs +114 -0
- data/sig/ibex/verification_report.rbs +44 -0
- data/sig/ibex/verify/action_correspondence.rbs +50 -0
- data/sig/ibex/verify/language_witness.rbs +112 -0
- data/sig/ibex/verify/reference_collection.rbs +63 -0
- data/sig/ibex/verify/result.rbs +52 -0
- data/sig/ibex/verify/verifier.rbs +170 -0
- data/sig/ibex/verify.rbs +6 -0
- data/sig/ibex/watch/runner.rbs +58 -0
- data/sig/ibex/watch/source_snapshot.rbs +46 -0
- data/sig/ibex/watch.rbs +7 -0
- data/sig/ibex.rbs +2 -0
- metadata +524 -19
- data/.rubocop.yml +0 -43
- data/CHANGELOG.md +0 -30
- data/Rakefile +0 -25
- data/Steepfile +0 -10
- data/docs/compat-notes.md +0 -37
- data/docs/lexer-coverage.md +0 -14
- data/docs/phase10-extensions.md +0 -27
- data/gemfiles/Gemfile +0 -7
- data/gemfiles/Gemfile.lock +0 -98
- data/lib/ibex/frontend/grammar.y +0 -156
- data/lib/ibex/runtime/parser.rb +0 -360
- data/lib/ibex/runtime.rb +0 -8
- data/sig/ibex/runtime/parser.rbs +0 -167
- data/sig/ibex/runtime.rbs +0 -6
data/docs/racc-migration.md
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Migrating from racc
|
|
3
|
+
description: Move a racc grammar to Ibex with explicit compatibility checks and runtime boundaries.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# Migrating from racc
|
|
2
7
|
|
|
3
8
|
Ibex targets grammar-file compatibility, generated parser public API compatibility, and the main racc CLI options. It does not
|
|
@@ -5,11 +10,14 @@ copy racc's internal table arrays, internal method names, native runtime, or gen
|
|
|
5
10
|
|
|
6
11
|
## Typical migration
|
|
7
12
|
|
|
8
|
-
1. Run `ibex -
|
|
9
|
-
2.
|
|
13
|
+
1. Run `ibex migrate-check grammar.y` and resolve any errors. Use `--format=json` for CI.
|
|
14
|
+
2. Generate a reviewable parity harness with `ibex migrate-harness -o migration_harness.rb grammar.y`, add explicit token
|
|
15
|
+
cases, and run it inside an isolation boundary appropriate for the grammar code.
|
|
16
|
+
3. Run `ibex -o parser.rb grammar.y` in place of `racc -o parser.rb grammar.y`.
|
|
17
|
+
4. Change the generated-file runtime dependency from deployment packaging only; application calls to `do_parse`, `yyparse`,
|
|
10
18
|
`next_token`, `on_error`, `token_to_str`, `yyerror`, `yyerrok`, and `yyaccept` remain the same.
|
|
11
|
-
|
|
12
|
-
|
|
19
|
+
5. Use `-E` if the generated parser must be a single file with no installed Ibex gem.
|
|
20
|
+
6. Keep the default `--mode=default` until intentionally adopting EBNF or names. Extended grammars can make that choice locally by
|
|
13
21
|
placing `pragma extended` immediately after their class header instead of requiring `--mode=extended` at each invocation.
|
|
14
22
|
|
|
15
23
|
## CLI mapping
|
|
@@ -23,6 +31,7 @@ copy racc's internal table arrays, internal method names, native runtime, or gen
|
|
|
23
31
|
| `-E`, `--embedded` | Embed the Pure Ruby runtime |
|
|
24
32
|
| `-F`, `--frozen` | Accepted; Ibex always emits frozen-string magic comments |
|
|
25
33
|
| `--rbs[=FILE]` | Ibex extension; emit a generated parser signature |
|
|
34
|
+
| `--action-source[=FILE]` | Ibex extension; emit a non-executable Steep shadow of semantic methods |
|
|
26
35
|
| `--warnings=all,error` | Ibex extension; display or promote structured grammar diagnostics |
|
|
27
36
|
| `--line-convert-all`, `-l` | Map header/inner/footer too, or disable all source mapping |
|
|
28
37
|
| `-a` | Generate methods for implicit actions |
|
|
@@ -34,6 +43,38 @@ copy racc's internal table arrays, internal method names, native runtime, or gen
|
|
|
34
43
|
Ibex defaults to `<input>.rb`; racc 1.8.1 was observed to default to `<input>.tab.rb`. Use `-o` for portable scripts.
|
|
35
44
|
By default, semantic actions and `inner` methods report grammar-file lines while `header` and `footer` retain generated-file
|
|
36
45
|
lines. `--line-convert-all` maps every user-code section; `-l` maps none. The mapping is retained through IR JSON resumption.
|
|
46
|
+
For static action checking, combine `--rbs --action-source`; configure the generated `.rbs` and `.actions.rb` in the
|
|
47
|
+
application's Steep target, and run Steep separately. The shadow is check-only input and must not replace or be required by the
|
|
48
|
+
runtime parser.
|
|
49
|
+
|
|
50
|
+
`migrate-check` never executes semantic actions or `header`/`inner`/`footer` code. `migrate-harness` also only writes source. The
|
|
51
|
+
generated harness is the explicit execution step: after reviewed cases are added, it invokes both generators and executes both
|
|
52
|
+
generated parsers in bounded child processes. This is not a sandbox; use a container or VM for untrusted grammar code. See
|
|
53
|
+
[ADR 0012](decisions/0012-bounded-nonexecuting-analysis.md).
|
|
54
|
+
|
|
55
|
+
## Compatibility baseline
|
|
56
|
+
|
|
57
|
+
The repository probes and their exact reproduction commands are recorded in
|
|
58
|
+
[`racc-migration-evidence.md`](racc-migration-evidence.md). That matrix is an
|
|
59
|
+
internal evidence index: it distinguishes self-authored black-box coverage
|
|
60
|
+
from the separately pinned public-gem migration suites and does not turn either
|
|
61
|
+
set into a claim of third-party adoption or performance parity.
|
|
62
|
+
|
|
63
|
+
The compatibility claims above were checked on 2026-07-22 against racc 1.8.1 using only its public documentation, `racc --help`,
|
|
64
|
+
and black-box execution. Ibex does not inspect racc implementation files or generated source. Self-authored probes compare
|
|
65
|
+
observable results for arithmetic precedence, empty rules, string tokens, `convert`, `no_result_var`, inline actions,
|
|
66
|
+
dangling-else `expect`, error recovery, source-line conversion, and a generated 500-production grammar.
|
|
67
|
+
|
|
68
|
+
Precedence-resolved conflicts remain visible in Automaton IR but are excluded from the CLI conflict count and `expect`. Error
|
|
69
|
+
recovery probes compare result values and the public `on_error` arguments. These tests skip when the `racc` executable is absent.
|
|
70
|
+
|
|
71
|
+
Application-defined parser initializers do not have to call `super`; the runtime completes its isolated session state on first
|
|
72
|
+
use while retaining application-owned instance variables. During parsing, the historical `@vstack` and `@racc_vstack` names
|
|
73
|
+
both refer to the live semantic-value stack for read compatibility. They are internal aliases: applications may inspect them
|
|
74
|
+
while tokenizing but must not mutate, replace, or retain them across parser sessions.
|
|
75
|
+
|
|
76
|
+
An unqualified `ParseError` in a parser method or semantic action resolves through `Runtime::Parser`, so application actions can
|
|
77
|
+
keep their existing explicit rejection path. Structured failures remain available as `Ibex::Runtime::ParseError`.
|
|
37
78
|
|
|
38
79
|
## Known differences
|
|
39
80
|
|
|
@@ -43,5 +84,3 @@ lines. `--line-convert-all` maps every user-code section; `-l` maps none. The ma
|
|
|
43
84
|
unknown lookahead through `on_error` first, then recovers if the callback returns. Declared invalid tokens match in the
|
|
44
85
|
black-box recovery probe.
|
|
45
86
|
- `require "racc/parser"` replacement and previously generated racc parser table compatibility are out of scope.
|
|
46
|
-
|
|
47
|
-
See [compatibility observations](compat-notes.md) for the tested version and probe set.
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Release readiness
|
|
3
|
+
description: Outcome-based release evidence, limitations, and the current publication decision.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# v1.0 readiness report
|
|
7
|
+
|
|
8
|
+
This is the outcome-based v1.0 decision required by the project design. It
|
|
9
|
+
records evidence current through 2026-08-08. Performance measurements used
|
|
10
|
+
Ruby 4.0.0 on `arm64-darwin24`. Passing the implementation checklist is not
|
|
11
|
+
sufficient for a stable release.
|
|
12
|
+
|
|
13
|
+
## Decision
|
|
14
|
+
|
|
15
|
+
**HOLD v1.0.** Compatibility behavior, scale construction, semantic-value
|
|
16
|
+
signatures, and the repository compatibility suite have evidence. The exact
|
|
17
|
+
formal public performance rerun is now recorded for the measured revision
|
|
18
|
+
below. The published ten-case error comparison has not received independent
|
|
19
|
+
third-party review. Its machine-readable
|
|
20
|
+
[`R001` status](error-ux-review-status-v1.json) is
|
|
21
|
+
`HOLD / awaiting_independent_review`; the linked status leads to the complete
|
|
22
|
+
rubric, closed record schema, immutable evidence identity, and imported-record
|
|
23
|
+
registry.
|
|
24
|
+
|
|
25
|
+
<!-- r001-review-status:start -->
|
|
26
|
+
R001: `HOLD` — [`awaiting_independent_review`](error-ux-review-status-v1.json).
|
|
27
|
+
<!-- r001-review-status:end -->
|
|
28
|
+
|
|
29
|
+
Feature development is not frozen. The open release gate blocks publication of
|
|
30
|
+
v1.0, not feature development. New work remains subject to the feature budgets,
|
|
31
|
+
maturity rules, compatibility checks, and exact-revision release gates
|
|
32
|
+
documented by the project. The current Grammar IR and Automaton IR contracts
|
|
33
|
+
remain closed and validated; before v1.0, incompatible changes are coordinated
|
|
34
|
+
with their writers, readers, schemas, fixtures, and downstream consumers.
|
|
35
|
+
|
|
36
|
+
The format-v6 batch Red/Green CST has been selected as part of the initial
|
|
37
|
+
Stable v1 API. Its syntax-only incremental layer remains Experimental. Other
|
|
38
|
+
Preview and Experimental features may continue to ship in prereleases without
|
|
39
|
+
promotion; before v1.0, those surfaces can change between prereleases when the
|
|
40
|
+
release notes, migration note, regressions, and maturity evidence are updated.
|
|
41
|
+
The release lock applies to Stable declarations and versioned persisted
|
|
42
|
+
contracts, not to every Preview implementation detail or evidence capture.
|
|
43
|
+
|
|
44
|
+
## KPI result
|
|
45
|
+
|
|
46
|
+
| KPI | Result | Evidence |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| Three public-gem migrations | Pass with documented adapters | Namae, BCDice, and Nokogiri behavior suites below |
|
|
49
|
+
| Hundreds-of-productions scale | Pass | 501 productions, 503 states, 125.008 ms average complete build |
|
|
50
|
+
| Ten-case error UX comparison | Partial | 10/10 snapshots and 8/10 useful repairs are public; independent review is missing |
|
|
51
|
+
| Public generator/runtime performance baseline | Pass at measured revision | Direct formal ten-run result artifact is published below; the historical projection remains retained separately |
|
|
52
|
+
| Semantic-value RBS and typed ratchet | Pass | Generated reduction signatures include declared RHS/LHS types; the 2026-08-08 evidence revision measured whole-library Steep at 88.4% typed |
|
|
53
|
+
| Compatibility suite unbeaten | Pass at the measured revision | Current black-box, self-host, IR, property, and runtime suites are green |
|
|
54
|
+
| Release basis | Pass without publication | Stable declaration diff is 0 across 48 locked files; both gems build byte-identically under two environments |
|
|
55
|
+
|
|
56
|
+
## Public-gem migration evidence
|
|
57
|
+
|
|
58
|
+
Only public grammar files, public commands, and observable test results were
|
|
59
|
+
used. Neither racc implementation files nor generated source were inspected.
|
|
60
|
+
Each repository was cloned at the recorded revision:
|
|
61
|
+
|
|
62
|
+
| Project | Revision and grammar | Static check | Behavior result |
|
|
63
|
+
|---|---|---|---|
|
|
64
|
+
| Namae | [`d33875a`](https://github.com/berkmancenter/namae/commit/d33875aaf1fc420a8dfe946a3b29cc3e19710061), `lib/namae/parser.y` | compatible | 151 RSpec examples, 85 Cucumber scenarios, 198 steps |
|
|
65
|
+
| BCDice | [`21b4a03`](https://github.com/bcdice/BCDice/commit/21b4a03789bf2080ad41aaf31299b609ee7bda86), `lib/bcdice/command/parser.y` | compatible; runtime-constant warning | 25 tests, 103 assertions |
|
|
66
|
+
| Nokogiri | [`04a4c29`](https://github.com/sparklemotion/nokogiri/commit/04a4c29c6a605ad40a78f4ce343ced0832a1805c), `lib/nokogiri/css/parser.y` | compatible; runtime-constant warning | 6 tests, 14 assertions |
|
|
67
|
+
|
|
68
|
+
Namae generated and ran as one embedded file. The other two grammars contain a
|
|
69
|
+
user header whose superclass is named `Racc::Parser`. Their PoCs preload this
|
|
70
|
+
explicit migration adapter before loading the generated parser:
|
|
71
|
+
|
|
72
|
+
```ruby
|
|
73
|
+
require "ibex/runtime"
|
|
74
|
+
|
|
75
|
+
module Racc
|
|
76
|
+
Parser = Ibex::Runtime::Parser
|
|
77
|
+
end
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
This is the adapter recommended by `ibex migrate-check`; it does not load or
|
|
81
|
+
execute the racc runtime. The PoCs uncovered and fixed three compatibility
|
|
82
|
+
gaps: an omitted `end` before a user-code section, an application initializer
|
|
83
|
+
that omits `super` plus historical value-stack reads, and an unqualified
|
|
84
|
+
`ParseError`.
|
|
85
|
+
|
|
86
|
+
## Formal Pure Ruby performance comparison
|
|
87
|
+
|
|
88
|
+
<!-- comparative-evidence:racc-public-performance-2026-07-31:start -->
|
|
89
|
+
At clean Ibex revision 984d4ae7a1c96db4c71e3077669842b7bbc3b4ea, the readiness
|
|
90
|
+
projection for three pinned workloads on Ruby 4.0.0, arm64-darwin24, with YJIT disabled
|
|
91
|
+
records slower cold generation and new-instance runtime than Racc 1.8.1's Ruby backend;
|
|
92
|
+
the direct formal result artifact is absent, so this is evidence-pending and non-publishable
|
|
93
|
+
as a comparative claim.
|
|
94
|
+
|
|
95
|
+
Evidence record ID: `racc-public-performance-2026-07-31`. Its complete scope,
|
|
96
|
+
evidence paths, missing artifact, and limitations are registered in
|
|
97
|
+
[`claims.yml`](claims.yml) under the [comparison policy](comparison-policy.md).
|
|
98
|
+
CPU model, kernel release, and processor count were not retained in this
|
|
99
|
+
readiness projection. Host CPU and host OS were also not recorded as separate
|
|
100
|
+
fields. The measurements below do not describe the current checkout.
|
|
101
|
+
|
|
102
|
+
The historical readiness projection says the measurement was collected on
|
|
103
|
+
2026-07-31 from clean revision
|
|
104
|
+
`984d4ae7a1c96db4c71e3077669842b7bbc3b4ea` with ten
|
|
105
|
+
alternating isolated runs per implementation, 50 warm-up workloads, 250
|
|
106
|
+
measured workloads, and 10,000 bootstrap samples. Each workload parses the
|
|
107
|
+
five fixed public inputs. Ruby 4.0.0 ran with YJIT disabled; Racc 1.8.1 was
|
|
108
|
+
forced to its Ruby backend and every worker verified the selected runtime.
|
|
109
|
+
Ratios below are Ibex divided by Racc; time cells include the bootstrap 95%
|
|
110
|
+
interval. The harness's `target_met` field marks absolute parity when the
|
|
111
|
+
interval's upper bound is no greater than 1.0. That field is diagnostic:
|
|
112
|
+
v1.0 requires publication of measurements and their conditions, while a
|
|
113
|
+
future performance gate may reject only a relative regression measured under
|
|
114
|
+
an identical environment and configuration.
|
|
115
|
+
|
|
116
|
+
| Project | Cold generation time | Reuse time | Reuse allocations | New-instance time | New-instance allocations | Generated bytes |
|
|
117
|
+
|---|---:|---:|---:|---:|---:|---:|
|
|
118
|
+
| Namae | 1.238x [1.184, 1.272] | 0.985x [0.966, 1.032] | 0.849x | 1.194x [1.157, 1.248] | 1.190x | 0.862x |
|
|
119
|
+
| BCDice command | 1.329x [1.278, 1.420] | 1.052x [1.008, 1.075] | 0.666x | 1.373x [1.326, 1.415] | 1.103x | 0.981x |
|
|
120
|
+
| Nokogiri CSS | 1.309x [1.277, 1.343] | 0.985x [0.963, 1.029] | 0.662x | 1.186x [1.149, 1.255] | 1.051x | 0.937x |
|
|
121
|
+
|
|
122
|
+
Result values and ordered result sequences are equivalent in every runtime
|
|
123
|
+
row. The measured parser-time medians in milliseconds per parse were
|
|
124
|
+
0.039443/0.040048 (Ibex/Racc) for Namae reuse,
|
|
125
|
+
0.020925/0.019897 for BCDice reuse, and
|
|
126
|
+
0.024892/0.025280 for Nokogiri reuse. The corresponding new-instance medians
|
|
127
|
+
were 0.048234/0.040413, 0.027523/0.020044, and 0.030420/0.025642.
|
|
128
|
+
|
|
129
|
+
The results deliberately retain the unfavorable rows: cold generation is
|
|
130
|
+
23.8–32.9% slower, and new-instance parsing is 18.6–37.3% slower. Reuse point
|
|
131
|
+
estimates range from 1.5% faster to 5.2% slower. Ibex allocates fewer objects
|
|
132
|
+
for every reuse workload, while new-instance allocation ratios remain
|
|
133
|
+
1.051–1.190x. Generated output is smaller for all three grammars. These values
|
|
134
|
+
are a release baseline, not portable scores or an assertion of parity.
|
|
135
|
+
<!-- comparative-evidence:racc-public-performance-2026-07-31:end -->
|
|
136
|
+
|
|
137
|
+
## Exact-revision formal rerun
|
|
138
|
+
|
|
139
|
+
<!-- comparative-claim:racc-public-performance-2026-08-08:start -->
|
|
140
|
+
At clean Ibex revision 26e94ce631bf5c075ecbca0205a34a8c231c31d9, on Ruby 4.0.0,
|
|
141
|
+
arm64-darwin24, with YJIT disabled, the direct formal comparison of the pinned
|
|
142
|
+
Namae, BCDice command, and Nokogiri CSS workloads against Racc 1.8.1 produced
|
|
143
|
+
equivalent result sequences; Ibex recorded slower cold generation and new-instance
|
|
144
|
+
parsing, fewer reuse allocations, and smaller generated output in every workload.
|
|
145
|
+
|
|
146
|
+
| Project | Cold generation ratio | Reuse time ratio | Reuse allocations ratio | New-instance time ratio | New-instance allocations ratio | Generated bytes ratio |
|
|
147
|
+
|---|---:|---:|---:|---:|---:|---:|
|
|
148
|
+
| Namae | 1.317830 | 0.996320 | 0.854462 | 1.209687 | 1.207559 | 0.861519 |
|
|
149
|
+
| BCDice command | 1.309690 | 1.010467 | 0.675012 | 1.331780 | 1.129299 | 0.981449 |
|
|
150
|
+
| Nokogiri CSS | 1.288118 | 0.994802 | 0.670484 | 1.193522 | 1.074838 | 0.936806 |
|
|
151
|
+
|
|
152
|
+
The complete formal result is [`2026-08-08-8c9cef999d09-ruby-4.0.0-arm64-darwin24.json`](../benchmark/results/public/2026-08-08-8c9cef999d09-ruby-4.0.0-arm64-darwin24.json). It records ten alternating isolated runs per implementation and scenario, 50 warm-up workloads, 250 measured workloads, five behavior probes, 10,000 bootstrap samples, exact public checkout revisions, and equivalent result and result-sequence digests.
|
|
153
|
+
<!-- comparative-claim:racc-public-performance-2026-08-08:end -->
|
|
154
|
+
|
|
155
|
+
## Scale evidence
|
|
156
|
+
|
|
157
|
+
Run:
|
|
158
|
+
|
|
159
|
+
```sh
|
|
160
|
+
benchmark/scale.rb --rules 500 --iterations 3
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
The reproducible synthetic chain shares its grammar shape with the 500-rule
|
|
164
|
+
black-box compatibility test. The measured report contains 501 productions,
|
|
165
|
+
503 direct-LALR construction states, 503 final states, no conflicts, and
|
|
166
|
+
41,332 bytes of compact generated Ruby. Three complete parse-to-codegen builds
|
|
167
|
+
averaged 125.008 ms with a 122.742–127.002 ms range. The Automaton IR digest
|
|
168
|
+
was `fe0e2f0c9bf16e7aa22a7ebcea40b229fedbb573f83af37596b76e0b989c3338`.
|
|
169
|
+
|
|
170
|
+
This synthetic result establishes the requested scale bound. The 139-production
|
|
171
|
+
representative grammar remains the realistic workload, so neither result is
|
|
172
|
+
presented as a substitute for an application-specific benchmark.
|
|
173
|
+
|
|
174
|
+
## Error UX and type evidence
|
|
175
|
+
|
|
176
|
+
[`error-ux.md`](error-ux.md) and its versioned JSON publish the same ten
|
|
177
|
+
malformed JSON inputs against the public racc callback. Eight selected repairs
|
|
178
|
+
were assessed useful. A maintainer assessment is not independent review; at
|
|
179
|
+
least one external reviewer must record a review of the cases and usefulness
|
|
180
|
+
labels before this KPI passes. Reviewers use the versioned
|
|
181
|
+
[`independent rubric`](error-ux-review-rubric-v1.md), generate a draft with the
|
|
182
|
+
exact checkout and environment identity, set all structured consent fields, and
|
|
183
|
+
publish the final permalink-free payload at a full-SHA blob URL. Maintainers
|
|
184
|
+
import the exact bytes and register publication provenance separately, without
|
|
185
|
+
rewriting. Ordinary CI validates the offline kit; the release gate performs
|
|
186
|
+
fail-closed blob checks and requires the source owner, GitHub API author,
|
|
187
|
+
publisher, and reviewer logins to agree. This establishes only GitHub namespace
|
|
188
|
+
control and account metadata, not cryptographic identity or a signature. The
|
|
189
|
+
gate remains intentionally failing while the public status is HOLD.
|
|
190
|
+
|
|
191
|
+
The 2026-07-31 evidence snapshot recorded 23,517 typed calls and 2,946
|
|
192
|
+
untyped calls out of 26,463, or 88.9% typed. Generated parser RBS refines
|
|
193
|
+
declared terminal, nonterminal, RHS tuple, and reduction result types. Untyped
|
|
194
|
+
values remain explicit at undeclared grammar symbols, decoded JSON, dynamic
|
|
195
|
+
table cells, and opaque application Ruby boundaries. The current repository
|
|
196
|
+
result is maintained in the generated type-statistics block in `README.md`.
|
|
197
|
+
|
|
198
|
+
## Release-basis evidence
|
|
199
|
+
|
|
200
|
+
`bundle exec rake release:reproducible` compares 47 normalized Stable RBS
|
|
201
|
+
declaration files with the v0.2.0 baseline. The current result has zero
|
|
202
|
+
differences; the installed-Gem embedded-source helper is an internal packaging
|
|
203
|
+
implementation and is outside that public lock. The task also builds both
|
|
204
|
+
gems twice under distinct locale, timezone, and frozen-string settings and
|
|
205
|
+
requires byte-identical artifacts. SHA-256 digests are emitted for the exact
|
|
206
|
+
candidate revision rather than recorded as if the current HOLD revision were
|
|
207
|
+
a release.
|
|
208
|
+
|
|
209
|
+
No release signing credential is stored in this repository. A signature or
|
|
210
|
+
provenance attestation must be supplied by a protected external release
|
|
211
|
+
environment after the outcome gates pass; an unsigned local test key would not
|
|
212
|
+
establish publisher identity.
|
|
213
|
+
|
|
214
|
+
## Actions required to release v1.0
|
|
215
|
+
|
|
216
|
+
1. Obtain and publish an independent review of the ten error cases using the
|
|
217
|
+
R001 rubric, then import the record byte-for-byte with its immutable
|
|
218
|
+
permalink and consent. Preserve disagreements separately from the normative
|
|
219
|
+
maintainer assessment.
|
|
220
|
+
2. Re-run every compatibility, IR, type, benchmark, and site gate on the exact
|
|
221
|
+
release revision.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Existing bounded repair semantics
|
|
2
|
+
|
|
3
|
+
Ibex bounded repair is an opt-in Experimental runtime facility. Assign an
|
|
4
|
+
immutable `Ibex::Runtime::RepairPolicy` before starting a parser session. With
|
|
5
|
+
no policy, parsing does not search or prefetch for repairs and existing error
|
|
6
|
+
recovery is unchanged.
|
|
7
|
+
|
|
8
|
+
## Search state and bounds
|
|
9
|
+
|
|
10
|
+
`RepairSearch` runs Dijkstra search over configurations containing:
|
|
11
|
+
|
|
12
|
+
- a copied LR state stack;
|
|
13
|
+
- the buffered-input index;
|
|
14
|
+
- consecutive successful shifts;
|
|
15
|
+
- accumulated edit cost and ordered edits;
|
|
16
|
+
- whether that configuration has reached the proof goal.
|
|
17
|
+
|
|
18
|
+
Insertion, deletion, and replacement are the only edits. The default costs are
|
|
19
|
+
1, 1, and 2, with maximum cost 3. Search also has independent defaults of 5,000
|
|
20
|
+
simulated configurations, 8 lookahead tokens, 3 proof shifts, and stack depth
|
|
21
|
+
256. Every policy number is positive and proof shifts cannot exceed lookahead.
|
|
22
|
+
|
|
23
|
+
The queue orders configurations lexicographically by:
|
|
24
|
+
|
|
25
|
+
1. total cost;
|
|
26
|
+
2. semantic-value risk;
|
|
27
|
+
3. ordered edit keys `(input position, delete|insert|replace rank, token id)`;
|
|
28
|
+
4. goal before non-goal;
|
|
29
|
+
5. more successful shifts;
|
|
30
|
+
6. earlier buffered-input index;
|
|
31
|
+
7. LR state stack.
|
|
32
|
+
|
|
33
|
+
Word-like token names add semantic-value risk; punctuation does not. This is a
|
|
34
|
+
deterministic tie-break, not a claim that punctuation edits are correct.
|
|
35
|
+
Candidate inserted/replacement token IDs are ordered and exclude EOF and the
|
|
36
|
+
reserved `error` token. A plan succeeds after the configured consecutive
|
|
37
|
+
shifts or accept.
|
|
38
|
+
|
|
39
|
+
Search simulates table actions and reductions on integer state stacks only. It
|
|
40
|
+
does not call semantic actions, `on_error`, `on_repair`, lexer actions, or
|
|
41
|
+
runtime observers. Reduction-stack cycles, excess stack depth, excess cost,
|
|
42
|
+
and excess configuration count stop a path. Pull parsing may read ahead to the
|
|
43
|
+
lookahead bound. An incomplete push prefix yields the internal `NEED_INPUT`
|
|
44
|
+
sentinel and waits for more input.
|
|
45
|
+
|
|
46
|
+
The compatibility `RepairSearch#search` projection still returns the legacy
|
|
47
|
+
`RepairPlan | NEED_INPUT | nil` shape. The additive `search_result` method
|
|
48
|
+
retains a frozen typed outcome (`:selected`, `:need_input`, `:exhausted`, or
|
|
49
|
+
`:not_found`) for syntax tooling, so bounded exhaustion is not confused with a
|
|
50
|
+
complete search that found no plan.
|
|
51
|
+
|
|
52
|
+
## Selection, hooks, and replay
|
|
53
|
+
|
|
54
|
+
On a reported syntax error, the runtime captures the error context and CST
|
|
55
|
+
error, publishes the runtime `error` event, and calls `on_error`. If search
|
|
56
|
+
selected a plan, `on_repair(plan)` is called next. If either hook raises, its
|
|
57
|
+
exception propagates before edited tokens are applied.
|
|
58
|
+
|
|
59
|
+
After both hooks return, the runtime rebuilds the buffered token prefix:
|
|
60
|
+
|
|
61
|
+
| Edit | Replay token value | Replay location | CST effect |
|
|
62
|
+
| --- | --- | --- | --- |
|
|
63
|
+
| insert | `nil` | location at the insertion point | missing token |
|
|
64
|
+
| delete | absent from replay | original source retained separately | skipped/error trivia |
|
|
65
|
+
| replace | original token value | original token location | error-marked replacement |
|
|
66
|
+
|
|
67
|
+
The rebuilt prefix then passes through ordinary shift/reduce/accept handling.
|
|
68
|
+
Committed semantic actions and observers therefore run normally; speculative
|
|
69
|
+
search never runs them. Replay emits normal parser events and does not invent a
|
|
70
|
+
`recover` event for the selected repair. The original syntax error remains a
|
|
71
|
+
diagnostic even if replay accepts.
|
|
72
|
+
|
|
73
|
+
Inserted `nil` and a replacement's retained value are compatibility mechanics,
|
|
74
|
+
not evidence of user intent. A syntactically accepted repair can still be
|
|
75
|
+
semantically unsafe.
|
|
76
|
+
|
|
77
|
+
## Syntax-only editor proposals
|
|
78
|
+
|
|
79
|
+
`SyntaxSession#repair` is a separate Experimental boundary for callers that
|
|
80
|
+
need byte edits rather than semantic replay. It runs the same bounded search
|
|
81
|
+
on a fresh private parser, captures absolute source ranges, resolves source
|
|
82
|
+
spelling only from caller-provided text or conservative punctuation literals,
|
|
83
|
+
and validates the applied bytes with a fresh syntax session. Production actions
|
|
84
|
+
and the application's `on_repair` callback do not run, and the result has no
|
|
85
|
+
semantic `value`. The originating session remains unchanged.
|
|
86
|
+
|
|
87
|
+
`SyntaxRepairResult` distinguishes `:accepted`, `:progress`, and `:rejected`
|
|
88
|
+
from bounded `:exhausted` and `:not_found` outcomes and selected-but-unavailable
|
|
89
|
+
cases such as missing token spelling or multiple repair segments. Accepted
|
|
90
|
+
results require a diagnostic-free fresh parse consuming all edited bytes. For
|
|
91
|
+
error results, `updated_source` keeps the exact bytes while the CST may expose
|
|
92
|
+
only the consumed prefix under the existing error CST contract. See [E002
|
|
93
|
+
syntax-only repair](investigations/E002-syntax-only-repair-result.md) and
|
|
94
|
+
[ADR 0023](decisions/0023-syntax-only-repair-results.md).
|
|
95
|
+
|
|
96
|
+
## CST and source ownership
|
|
97
|
+
|
|
98
|
+
CST parsing retains the original source bytes. Insertions are represented by
|
|
99
|
+
missing nodes, replacements carry an error flag, and deleted token bytes are
|
|
100
|
+
preserved as skipped-token trivia rather than silently disappearing. These
|
|
101
|
+
representations are part of the existing CST error-path contract, not a text
|
|
102
|
+
edit API. `RepairPlan#position` is a buffered token index, not a source-byte
|
|
103
|
+
offset.
|
|
104
|
+
|
|
105
|
+
## Executable coverage
|
|
106
|
+
|
|
107
|
+
<!-- repair-semantics:coverage:start -->
|
|
108
|
+
| Concept | Executable evidence |
|
|
109
|
+
| --- | --- |
|
|
110
|
+
| policy-and-default-off | `test/runtime/repair_test.rb` |
|
|
111
|
+
| dijkstra-priority-and-outcomes | `test/runtime/repair_characterization_test.rb` |
|
|
112
|
+
| typed-search-outcomes | `test/runtime/repair_characterization_test.rb` |
|
|
113
|
+
| values-locations-and-replay | `test/runtime/repair_test.rb` |
|
|
114
|
+
| hooks-actions-and-observers | `test/runtime/repair_test.rb` |
|
|
115
|
+
| pull-and-push-bounds | `test/runtime/repair_test.rb` |
|
|
116
|
+
| cst-representation | `test/codegen/cst_test.rb` |
|
|
117
|
+
| cst-source-fidelity | `test/runtime/cst_fidelity_property_test.rb` |
|
|
118
|
+
| syntax-only-repair-projection | `test/runtime/syntax_repair_test.rb` |
|
|
119
|
+
<!-- repair-semantics:coverage:end -->
|
|
120
|
+
|
|
121
|
+
The H003 [round-two evidence](error-ux-round2.md) records exact selected plans
|
|
122
|
+
and fresh reparses but keeps external usefulness judgments on HOLD. Neither
|
|
123
|
+
that evidence nor this characterization promotes bounded repair to Stable.
|