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
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Error UX evidence round 2
|
|
2
|
+
|
|
3
|
+
H003 expands repository-owned diagnostic and repair evidence beyond R001's ten
|
|
4
|
+
JSON cases. The machine-readable result is
|
|
5
|
+
[`error-ux-round2-v1.json`](error-ux-round2-v1.json), validated by
|
|
6
|
+
[`error-ux-round2-v1.schema.json`](../schema/error-ux-round2-v1.schema.json).
|
|
7
|
+
It does not replace or revise the R001 snapshot, rubric, review records, or
|
|
8
|
+
release gate.
|
|
9
|
+
|
|
10
|
+
## Status and authority
|
|
11
|
+
|
|
12
|
+
The deterministic repository capture is **complete**. The external subjective
|
|
13
|
+
gate is separately **HOLD**: there are no external review records, and every
|
|
14
|
+
case has `status: pending` with an empty label list. Repository observations
|
|
15
|
+
cannot be promoted into external `useful`, `misleading`, `unsafe`, or `unclear`
|
|
16
|
+
labels.
|
|
17
|
+
|
|
18
|
+
The immutable machine capture intentionally has no slot for later subjective
|
|
19
|
+
labels. H003's separate
|
|
20
|
+
[`review status registry`](error-ux-round2-review-status-v1.json) and
|
|
21
|
+
[`review schema`](../schema/error-ux-round2-review-v1.schema.json) provide that
|
|
22
|
+
pathway without rewriting the capture. The registry binds the exact capture
|
|
23
|
+
SHA-256 and required case inventory. It remains `HOLD` with `records: []`.
|
|
24
|
+
|
|
25
|
+
The fixed corpus covers these distinct dimensions:
|
|
26
|
+
|
|
27
|
+
| Case | Shape | Observation | Fresh reparse |
|
|
28
|
+
| --- | --- | --- | --- |
|
|
29
|
+
| `H003-DELIMITER-01` | nested delimiter-heavy calls | mismatched closer | accepted |
|
|
30
|
+
| `H003-STATEMENT-01` | assignment statement | missing semantic value | accepted |
|
|
31
|
+
| `H003-STATEFUL-01` | stateful string lexer | EOF in the string state | accepted |
|
|
32
|
+
| `H003-EOF-01` | delimiter EOF | missing closer | progress; the proposed edit over-closes |
|
|
33
|
+
| `H003-MULTI-01` | synchronized statements | two errors at distinct offsets, then continuation | accepted |
|
|
34
|
+
| `H003-UNKNOWN-01` | external token adapter | unknown token after a complete word | accepted |
|
|
35
|
+
| `H003-LEXER-01` | generated lexer | no matching lexer rule | accepted |
|
|
36
|
+
|
|
37
|
+
Indentation-sensitive input is explicitly `excluded-unimplemented`. Ibex has
|
|
38
|
+
no indentation-tokenization contract, so the corpus does not simulate one.
|
|
39
|
+
|
|
40
|
+
## Capture semantics
|
|
41
|
+
|
|
42
|
+
Each case binds the grammar and input digests, exact runtime expected tokens,
|
|
43
|
+
full diagnostic message, source line and caret, bounded repair result, a
|
|
44
|
+
repository-authored byte-range edit, the outcome of applying that edit and
|
|
45
|
+
parsing with a fresh parser, semantic-value risk, and external-review state.
|
|
46
|
+
The capture also binds the exact frontend, normalization, code generator,
|
|
47
|
+
runtime parser, generated lexer, repair implementation, and H003 generator
|
|
48
|
+
source bytes used to produce those observations.
|
|
49
|
+
|
|
50
|
+
Parser expected-token arrays come directly from the existing runtime API. A
|
|
51
|
+
generated-lexer failure occurs before a parser state exists, so its exact array
|
|
52
|
+
is empty with the closed reason
|
|
53
|
+
`lexer-failure-precedes-parser-state`; it is not presented as a parser
|
|
54
|
+
prediction. Runtime repairs remain distinct from proposed source edits.
|
|
55
|
+
Insertion can supply nil, replacement retains the original runtime value, and
|
|
56
|
+
deletion can discard intent. A successful fresh parse establishes syntax only,
|
|
57
|
+
not that an invented literal, deleted token, or replacement matches the user's
|
|
58
|
+
intended semantics.
|
|
59
|
+
|
|
60
|
+
The multi-error case overrides the normal error hook only to record the same
|
|
61
|
+
runtime token, expected-token, state, and location fields while allowing the
|
|
62
|
+
grammar's explicit `error ';'` synchronization path to continue. The committed
|
|
63
|
+
capture requires at least two diagnostics at strictly increasing byte offsets
|
|
64
|
+
and a non-nil result after recovery; it cannot be satisfied by duplicating one
|
|
65
|
+
error.
|
|
66
|
+
|
|
67
|
+
## Trust boundary
|
|
68
|
+
|
|
69
|
+
The capture compiles and executes generated lexer and parser action code.
|
|
70
|
+
Execution is allowlisted to the four repository-owned fixtures under
|
|
71
|
+
`test/fixtures/error_ux_round2/`. It does not download or execute external
|
|
72
|
+
grammars, reviewer payloads, or user-supplied code. These fixtures are trusted
|
|
73
|
+
test programs, not a sandbox claim.
|
|
74
|
+
|
|
75
|
+
The existing R001 normative snapshot is bound to its unchanged SHA-256. H003
|
|
76
|
+
generation fails if those bytes change. H003 uses its own corpus, schema,
|
|
77
|
+
evidence ID, generator, and quality gate so comparative R001 evidence and this
|
|
78
|
+
repository study cannot silently become duplicate authorities.
|
|
79
|
+
|
|
80
|
+
## Limits and kill conditions
|
|
81
|
+
|
|
82
|
+
This evidence has no external workloads or reviewers, observes one bounded
|
|
83
|
+
repair plan rather than every equal-cost plan, and does not infer intent from
|
|
84
|
+
acceptance. It must fail closed when fixture/corpus bytes drift, a required
|
|
85
|
+
dimension disappears, R001 changes, review state is overstated, synchronized
|
|
86
|
+
diagnostics collapse, or the committed fresh-reparse outcome changes.
|
|
87
|
+
|
|
88
|
+
The same quality gate validates the external registry fail-closed. `PASS`
|
|
89
|
+
requires at least two complete, independent, external records from
|
|
90
|
+
reviewers whose names remain distinct after Unicode NFKC normalization, full
|
|
91
|
+
case folding, trimming, and whitespace collapse. Every record must assess all seven cases with a
|
|
92
|
+
label, rationale, and semantic-value risk assessment. If reviewer labels
|
|
93
|
+
differ, every reviewer-pair disagreement must remain explicit rather than
|
|
94
|
+
being reduced to a majority conclusion. See the
|
|
95
|
+
[`records workflow`](error-ux-round2-reviews/v1/records/README.md).
|
|
96
|
+
|
|
97
|
+
Independence and identity remain human attestations: schema validation can
|
|
98
|
+
require the declarations and reject duplicate normalized names, but cannot
|
|
99
|
+
prove who authored a review. A record must never be added merely to clear the
|
|
100
|
+
gate. Evidence drift, incomplete case coverage, duplicate reviewer identity,
|
|
101
|
+
or missing disagreement entries kills `PASS`.
|
|
102
|
+
|
|
103
|
+
Regenerate only after reviewing intentional parser, lexer, diagnostic, or
|
|
104
|
+
repair changes:
|
|
105
|
+
|
|
106
|
+
```sh
|
|
107
|
+
bundle exec ruby tool/error_ux_round2.rb --write
|
|
108
|
+
bundle exec rake quality:error_ux_round2
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
The ordinary quality command never writes evidence.
|
data/docs/error-ux.md
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Error experience evidence
|
|
3
|
+
description: Bounded diagnostics, repair behavior, and the evidence boundary for parser errors.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# JSON error UX evidence
|
|
7
|
+
|
|
8
|
+
This report fixes the Phase 14 error-experience baseline against ten malformed
|
|
9
|
+
inputs for the gallery JSON grammar. It is generated from
|
|
10
|
+
[`json-errors-v1.json`](../test/fixtures/error_ux/json-errors-v1.json) by:
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
bundle exec ruby tool/error_ux_snapshot.rb
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Use `--write` only after reviewing a deliberate diagnostic, parser-table, racc,
|
|
17
|
+
or repair-policy change. CI regenerates the evidence and requires byte-for-byte
|
|
18
|
+
equality.
|
|
19
|
+
|
|
20
|
+
## Independent review gate
|
|
21
|
+
|
|
22
|
+
The fixed observations include a maintainer repair assessment. They do not
|
|
23
|
+
include an independent diagnostic or repair assessment.
|
|
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
|
+
Third-party reviewers use the versioned
|
|
30
|
+
[`rubric`](error-ux-review-rubric-v1.md) and closed
|
|
31
|
+
[`review-record schema`](../schema/error-ux-review-v1.schema.json). Run:
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
bundle exec rake quality:error_ux_review_kit
|
|
35
|
+
bundle exec rake quality:error_ux_review_status
|
|
36
|
+
bundle exec ruby tool/error_ux_review.rb template review.json
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The generated payload contains the reviewer identity, reviewed maintainer
|
|
40
|
+
roster, structured consent, labels, rationales, and disagreements, but no
|
|
41
|
+
permalink. Publication metadata is kept separately in the status registry so a
|
|
42
|
+
reviewer can commit the final payload without a self-referential SHA. The first
|
|
43
|
+
command verifies the immutable snapshot, corpus identities, schema, local
|
|
44
|
+
byte/digest bindings, reports, claims, and truthful status entirely offline
|
|
45
|
+
while allowing the expected HOLD in ordinary CI.
|
|
46
|
+
|
|
47
|
+
`bundle exec rake release:error_ux_review` is the separate promotion gate and
|
|
48
|
+
returns nonzero until a valid published external payload exists. When PASS is
|
|
49
|
+
claimed, it additionally fetches the full-SHA blob without redirects, compares
|
|
50
|
+
the exact imported bytes, and requires the source repository owner, GitHub
|
|
51
|
+
commit API author, status publisher login, and reviewer login to agree
|
|
52
|
+
case-insensitively. This verifies control of the named GitHub namespace and
|
|
53
|
+
GitHub account metadata, not a cryptographic identity or signature. Network or
|
|
54
|
+
account-metadata uncertainty fails closed. Neither path changes the normative
|
|
55
|
+
observation fixture.
|
|
56
|
+
|
|
57
|
+
## Comparison method
|
|
58
|
+
|
|
59
|
+
<!-- comparative-evidence:racc-error-ux-json-v1:start -->
|
|
60
|
+
At Ibex revision cc20c5eb799cc218ebea665df64261f10d030f75, on ten fixed malformed
|
|
61
|
+
JSON inputs with the Ruby, OS, CPU, kernel, processor-count, and YJIT environment unrecorded,
|
|
62
|
+
the committed result artifact records Ibex diagnostics,
|
|
63
|
+
Racc 1.8.1's public on_error callback values, and a maintainer assessment of ten bounded repairs;
|
|
64
|
+
independent subjective review is pending, so this is not a completed comparative UX claim.
|
|
65
|
+
|
|
66
|
+
Evidence record ID: `racc-error-ux-json-v1`. The observations and assessment
|
|
67
|
+
are registered in [`claims.yml`](claims.yml), including every unrecorded
|
|
68
|
+
environment field and the still-pending independent review.
|
|
69
|
+
|
|
70
|
+
Ibex uses [`examples/json.y`](../examples/json.y), including its generated
|
|
71
|
+
lexer locations. The migration from its previous handwritten lexer is guarded
|
|
72
|
+
by exact location and error-snapshot tests. The comparison uses the self-authored compatible grammar
|
|
73
|
+
[`json_racc.y`](../test/fixtures/error_ux/json_racc.y), racc 1.8.1, and only the
|
|
74
|
+
public `racc` executable and `on_error(token, value, value_stack)` callback.
|
|
75
|
+
Neither racc implementation files nor generated source are inspected. Both
|
|
76
|
+
parsers receive the same source strings and equivalent token streams.
|
|
77
|
+
|
|
78
|
+
The racc column records the neutral callback wrapper's token argument. It does
|
|
79
|
+
not claim that an application cannot build richer diagnostics around racc; it
|
|
80
|
+
shows what the compared parser runtime exposes at that boundary without an
|
|
81
|
+
additional state-to-message layer.
|
|
82
|
+
|
|
83
|
+
| Case | Invalid source | Ibex diagnostic evidence | racc callback | Selected repair | Useful |
|
|
84
|
+
|---|---|---|---|---|---|
|
|
85
|
+
| EUX-01 | `{"a":,}` | line 1, column 6; 7 expected values; caret | token 9 | delete `,`, insert `STRING` | yes |
|
|
86
|
+
| EUX-02 | `{"a" 1}` | line 1, column 6; expected `:`; caret | token 3 | insert `:` | yes |
|
|
87
|
+
| EUX-03 | `{"a":1,}` | line 1, column 8; expected `STRING`; caret | token 8 | insert a complete member | no |
|
|
88
|
+
| EUX-04 | `[1,]` | line 1, column 4; 7 expected values; caret | token 12 | insert `STRING` | no |
|
|
89
|
+
| EUX-05 | `[1 2]` | line 1, column 4; expected `,` or `]`; caret | token 3 | insert `,` | yes |
|
|
90
|
+
| EUX-06 | `{"a":[true false]}` | line 1, column 12; expected `,` or `]`; caret | token 5 | insert `,` | yes |
|
|
91
|
+
| EUX-07 | `{"a":null "b":2}` | line 1, column 11; expected `}` or `,`; caret | token 2 | insert `,` | yes |
|
|
92
|
+
| EUX-08 | `{]` | line 1, column 2; expected `STRING` or `}`; caret | token 12 | replace `]` with `}` | yes |
|
|
93
|
+
| EUX-09 | `[}` | line 1, column 2; 8 expected values/closer; caret | token 8 | replace `}` with `]` | yes |
|
|
94
|
+
| EUX-10 | `true false` | line 1, column 6; expected EOF; caret | token 5 | delete extra `FALSE` | yes |
|
|
95
|
+
|
|
96
|
+
The committed JSON is the normative snapshot and also retains exact messages,
|
|
97
|
+
LR states, expected-token arrays, token values, repair costs, configuration
|
|
98
|
+
counts, and edit positions. Its public structure is validated by
|
|
99
|
+
[`schema/error-ux-v1.schema.json`](../schema/error-ux-v1.schema.json).
|
|
100
|
+
|
|
101
|
+
## SP-4 decision
|
|
102
|
+
|
|
103
|
+
The bounded insertion/deletion/replacement search produced a completing plan
|
|
104
|
+
for all ten cases. Eight plans are reasonable representations of the likely
|
|
105
|
+
human edit; two trailing-comma cases invent a missing value/member where
|
|
106
|
+
deleting the comma would usually be preferable. The measured useful rate is
|
|
107
|
+
therefore **8/10 (80%)**, above the required majority.
|
|
108
|
+
|
|
109
|
+
SP-4 is **go** for the existing opt-in bounded single-plan repair described by
|
|
110
|
+
[ADR 0012](decisions/0012-bounded-nonexecuting-analysis.md). It remains
|
|
111
|
+
experimental: a selected edit can require a nil semantic value, and the search
|
|
112
|
+
does not enumerate every equal-cost CPCT+ repair. The stable default answer
|
|
113
|
+
remains exact expected tokens plus explicit yacc/synchronization recovery.
|
|
114
|
+
<!-- comparative-evidence:racc-error-ux-json-v1:end -->
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Getting started
|
|
3
|
+
description: Install Ibex, generate a first parser, and choose a grammar mode.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Getting started
|
|
7
|
+
|
|
8
|
+
Ibex turns a racc-compatible grammar into a Pure Ruby LR parser. This guide
|
|
9
|
+
gets from an installed gem to a working parser before explaining the optional
|
|
10
|
+
extended surface.
|
|
11
|
+
|
|
12
|
+
## Install the generator
|
|
13
|
+
|
|
14
|
+
```sh
|
|
15
|
+
gem install ibex
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
For an application that only runs generated parsers, install `ibex-runtime`
|
|
19
|
+
instead. A project can add either dependency with `bundle add ibex` or
|
|
20
|
+
`bundle add ibex-runtime`.
|
|
21
|
+
|
|
22
|
+
## Generate a calculator
|
|
23
|
+
|
|
24
|
+
Create `calculator.y` with a class, token declaration, rules, and a small
|
|
25
|
+
handwritten pull lexer:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
class Calculator
|
|
29
|
+
token NUM
|
|
30
|
+
preclow
|
|
31
|
+
left '+'
|
|
32
|
+
left '*'
|
|
33
|
+
prechigh
|
|
34
|
+
rule
|
|
35
|
+
expr : expr '+' expr { result = val[0] + val[2] }
|
|
36
|
+
| expr '*' expr { result = val[0] * val[2] }
|
|
37
|
+
| NUM { result = val[0] }
|
|
38
|
+
end
|
|
39
|
+
---- inner
|
|
40
|
+
def parse_tokens(tokens)
|
|
41
|
+
@tokens = tokens
|
|
42
|
+
do_parse
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def next_token
|
|
46
|
+
@tokens.shift
|
|
47
|
+
end
|
|
48
|
+
---- footer
|
|
49
|
+
if $PROGRAM_NAME == __FILE__
|
|
50
|
+
tokens = [[:NUM, 2], ['+', nil], [:NUM, 3], ['*', nil], [:NUM, 4]]
|
|
51
|
+
puts Calculator.new.parse_tokens(tokens)
|
|
52
|
+
end
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Generate and run it:
|
|
56
|
+
|
|
57
|
+
```sh
|
|
58
|
+
ibex -o calculator.rb calculator.y
|
|
59
|
+
ruby calculator.rb
|
|
60
|
+
# 14
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Run `ibex --check -o calculator.rb calculator.y` in CI. It compares the
|
|
64
|
+
reproducible output without rewriting the committed file.
|
|
65
|
+
|
|
66
|
+
## Choose a mode
|
|
67
|
+
|
|
68
|
+
The default mode is the conservative racc migration surface. Add
|
|
69
|
+
`pragma extended` immediately after the class header, or pass
|
|
70
|
+
`--mode=extended`, when the grammar needs EBNF groups, imports, generated
|
|
71
|
+
lexers, typed trees, or other opt-in features. The [grammar reference](grammar-reference.md)
|
|
72
|
+
lists the exact syntax and the [maturity audit](maturity.md) records support
|
|
73
|
+
level per API.
|
|
74
|
+
|
|
75
|
+
## Next steps
|
|
76
|
+
|
|
77
|
+
- [Migrate an existing racc grammar](racc-migration.md).
|
|
78
|
+
- [Configure grammar-owned and invocation-owned settings](configuration-model.md).
|
|
79
|
+
- [Inspect a grammar locally in the Playground](https://ydah.github.io/ibex/playground/).
|
|
80
|
+
- [Read the runtime and grammar reference](grammar-reference.md).
|