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,89 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ibex
|
|
4
|
+
module Frontend
|
|
5
|
+
# Normalizes grammar source without changing its bytes.
|
|
6
|
+
module SourceEncoding
|
|
7
|
+
# @rbs (String source, String file) -> String
|
|
8
|
+
def self.validated_utf8(source, file)
|
|
9
|
+
validated = source.dup.force_encoding(Encoding::UTF_8)
|
|
10
|
+
raise Ibex::Error, "#{file}: input must be valid UTF-8" unless validated.valid_encoding?
|
|
11
|
+
|
|
12
|
+
validated.freeze
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# @rbs (String file) -> String
|
|
16
|
+
def self.validated_file(file)
|
|
17
|
+
validated = file.dup.force_encoding(Encoding::UTF_8)
|
|
18
|
+
raise Ibex::Error, "#{file}: file path must be valid UTF-8" unless validated.valid_encoding?
|
|
19
|
+
|
|
20
|
+
validated.freeze
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# An immutable position in grammar source.
|
|
25
|
+
class SourcePosition
|
|
26
|
+
attr_reader :byte_offset #: Integer
|
|
27
|
+
attr_reader :line #: Integer
|
|
28
|
+
attr_reader :column #: Integer
|
|
29
|
+
|
|
30
|
+
# @rbs (byte_offset: Integer, line: Integer, column: Integer) -> void
|
|
31
|
+
def initialize(byte_offset:, line:, column:)
|
|
32
|
+
raise ArgumentError, "byte_offset must be non-negative" if byte_offset.negative?
|
|
33
|
+
raise ArgumentError, "line and column must be positive" unless line.positive? && column.positive?
|
|
34
|
+
|
|
35
|
+
@byte_offset = byte_offset
|
|
36
|
+
@line = line
|
|
37
|
+
@column = column
|
|
38
|
+
freeze
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @rbs () -> Hash[Symbol, Integer]
|
|
42
|
+
def to_h
|
|
43
|
+
{ byte_offset: byte_offset, line: line, column: column }
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# An immutable half-open byte span in one grammar source.
|
|
48
|
+
class SourceSpan
|
|
49
|
+
attr_reader :file #: String
|
|
50
|
+
attr_reader :start #: SourcePosition
|
|
51
|
+
attr_reader :finish #: SourcePosition
|
|
52
|
+
|
|
53
|
+
# @rbs (file: String, start: SourcePosition, finish: SourcePosition) -> void
|
|
54
|
+
def initialize(file:, start:, finish:)
|
|
55
|
+
raise ArgumentError, "span end precedes its start" if finish.byte_offset < start.byte_offset
|
|
56
|
+
|
|
57
|
+
@file = file.dup.freeze
|
|
58
|
+
@start = start
|
|
59
|
+
@finish = finish
|
|
60
|
+
freeze
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# @rbs () -> Integer
|
|
64
|
+
def start_byte
|
|
65
|
+
start.byte_offset
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# @rbs () -> Integer
|
|
69
|
+
def end_byte
|
|
70
|
+
finish.byte_offset
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# @rbs () -> Integer
|
|
74
|
+
def length
|
|
75
|
+
end_byte - start_byte
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# @rbs () -> bool
|
|
79
|
+
def empty?
|
|
80
|
+
length.zero?
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# @rbs () -> Hash[Symbol, Object?]
|
|
84
|
+
def to_h
|
|
85
|
+
{ file: file, start: start.to_h, end: finish.to_h }
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ibex
|
|
4
|
+
module Frontend
|
|
5
|
+
class TokenAdapter
|
|
6
|
+
# Root/fragment header and include-path transitions for declaration classification.
|
|
7
|
+
module DeclarationDocumentState
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# @rbs (Token token) -> external_token
|
|
11
|
+
def class_keyword(token)
|
|
12
|
+
# @type self: DeclarationState
|
|
13
|
+
value = string_value(token)
|
|
14
|
+
if value == "fragment"
|
|
15
|
+
raise Ibex::Error, "#{token.location}: fragments require extended mode" unless @extended_mode
|
|
16
|
+
|
|
17
|
+
@fragment = true
|
|
18
|
+
@state = :declaration
|
|
19
|
+
return :FRAGMENT
|
|
20
|
+
end
|
|
21
|
+
return :IDENTIFIER unless value == "class"
|
|
22
|
+
|
|
23
|
+
@state = :class_name
|
|
24
|
+
:CLASS
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @rbs (external_token type) -> external_token?
|
|
28
|
+
def classify_include(type)
|
|
29
|
+
# @type self: DeclarationState
|
|
30
|
+
return unless @state == :include_path && type == :LITERAL
|
|
31
|
+
|
|
32
|
+
@state = :declaration
|
|
33
|
+
@declaration = nil
|
|
34
|
+
type
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @rbs (Token token, String value) -> void
|
|
38
|
+
def reject_fragment_pragma(token, value)
|
|
39
|
+
# @type self: DeclarationState
|
|
40
|
+
return unless @fragment && value == "pragma"
|
|
41
|
+
|
|
42
|
+
raise Ibex::Error, "#{token.location}: pragma declarations are not allowed in fragments"
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ibex
|
|
4
|
+
module Frontend
|
|
5
|
+
class TokenAdapter
|
|
6
|
+
# Context transitions for the extended root-only lexer declaration.
|
|
7
|
+
module DeclarationLexerState
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# @rbs () -> bool
|
|
11
|
+
def lexer_declaration_state?
|
|
12
|
+
@declaration == :lexer
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# @rbs (Token token) -> external_token
|
|
16
|
+
def classify_lexer_identifier(token)
|
|
17
|
+
# @type self: DeclarationState
|
|
18
|
+
case @state
|
|
19
|
+
when :lexer_entries, :lexer_action_or_entry then begin_lexer_entry(token)
|
|
20
|
+
when :lexer_state_name
|
|
21
|
+
@state = :lexer_state_do
|
|
22
|
+
:IDENTIFIER
|
|
23
|
+
when :lexer_state_do
|
|
24
|
+
value = string_value(token)
|
|
25
|
+
raise Ibex::Error, "#{token.location}: expected do, got #{value}" unless value == "do"
|
|
26
|
+
|
|
27
|
+
@lexer_state_depth = (@lexer_state_depth || 0) + 1
|
|
28
|
+
@state = :lexer_entries
|
|
29
|
+
:DO
|
|
30
|
+
else
|
|
31
|
+
:IDENTIFIER
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @rbs (Token token) -> external_token
|
|
36
|
+
def begin_lexer_entry(token)
|
|
37
|
+
# @type self: DeclarationState
|
|
38
|
+
value = string_value(token)
|
|
39
|
+
case value
|
|
40
|
+
when "end" then finish_lexer_scope
|
|
41
|
+
when "state"
|
|
42
|
+
@state = :lexer_state_name
|
|
43
|
+
:STATE
|
|
44
|
+
when "skip"
|
|
45
|
+
@state = :lexer_pattern
|
|
46
|
+
:SKIP
|
|
47
|
+
when "on"
|
|
48
|
+
@state = :lexer_pattern
|
|
49
|
+
:ON
|
|
50
|
+
else
|
|
51
|
+
@state = :lexer_pattern
|
|
52
|
+
:IDENTIFIER
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# @rbs () -> external_token
|
|
57
|
+
def finish_lexer_scope
|
|
58
|
+
depth = @lexer_state_depth || 0
|
|
59
|
+
if depth.positive?
|
|
60
|
+
@lexer_state_depth = depth - 1
|
|
61
|
+
@state = :lexer_entries
|
|
62
|
+
else
|
|
63
|
+
@state = :declaration
|
|
64
|
+
@declaration = nil
|
|
65
|
+
end
|
|
66
|
+
:END
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# @rbs (external_token type) -> external_token?
|
|
70
|
+
def classify_lexer_scalar(type)
|
|
71
|
+
if @state == :lexer_pattern && %i[REGEXP LITERAL].include?(type)
|
|
72
|
+
@state = :lexer_action_or_entry
|
|
73
|
+
return type
|
|
74
|
+
end
|
|
75
|
+
return unless @state == :lexer_action_or_entry && type == :ACTION
|
|
76
|
+
|
|
77
|
+
@state = :lexer_entries
|
|
78
|
+
type
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -1,25 +1,57 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative "declaration_lexer_state"
|
|
4
|
+
|
|
3
5
|
module Ibex
|
|
4
6
|
module Frontend
|
|
5
7
|
class TokenAdapter
|
|
6
8
|
# Classifies tokens through the class header and declaration section.
|
|
9
|
+
# rubocop:disable Metrics/ClassLength, Metrics/CyclomaticComplexity
|
|
10
|
+
# One state machine owns declaration-boundary classification.
|
|
7
11
|
class DeclarationState
|
|
12
|
+
include DeclarationDocumentState
|
|
13
|
+
include DeclarationLexerState
|
|
14
|
+
|
|
8
15
|
DECLARATIONS = {
|
|
16
|
+
"include" => %i[INCLUDE include_path],
|
|
17
|
+
"import" => %i[IMPORT include_path],
|
|
9
18
|
"token" => %i[TOKEN token_symbols], "options" => %i[OPTIONS options_identifiers],
|
|
10
|
-
"expect" => %i[EXPECT expect_integer], "start" => %i[START
|
|
19
|
+
"expect" => %i[EXPECT expect_integer], "start" => %i[START start_first_symbol],
|
|
20
|
+
"expect_rr" => %i[EXPECT_RR expect_rr_integer],
|
|
21
|
+
"recover" => %i[RECOVER recover_kind],
|
|
22
|
+
"on_error_reduce" => %i[ON_ERROR_REDUCE on_error_reduce_first_symbol],
|
|
23
|
+
"test" => %i[TEST test_expectation],
|
|
24
|
+
"lexer" => %i[LEXER lexer_entries],
|
|
11
25
|
"convert" => %i[CONVERT convert_name], "pragma" => %i[PRAGMA pragma_value],
|
|
26
|
+
"display" => %i[DISPLAY display_symbol], "type" => %i[TYPE type_symbol],
|
|
27
|
+
"param" => %i[PARAM param_name],
|
|
28
|
+
"printer" => %i[PRINTER printer_symbol],
|
|
29
|
+
"parser" => %i[PARSER parser_key],
|
|
12
30
|
"rule" => %i[RULE rules]
|
|
13
31
|
}.freeze #: Hash[String, [external_token, Symbol]]
|
|
14
32
|
ASSOCIATIONS = {
|
|
15
|
-
"left" => :LEFT, "right" => :RIGHT, "nonassoc" => :NONASSOC
|
|
33
|
+
"left" => :LEFT, "right" => :RIGHT, "nonassoc" => :NONASSOC, "precedence" => :PRECEDENCE
|
|
16
34
|
}.freeze #: Hash[String, external_token]
|
|
17
35
|
SCALAR_TYPES = {
|
|
18
|
-
literal: :LITERAL, integer: :INTEGER, action: :ACTION, user_code: :USER_CODE
|
|
36
|
+
literal: :LITERAL, regexp: :REGEXP, integer: :INTEGER, action: :ACTION, user_code: :USER_CODE
|
|
19
37
|
}.freeze #: Hash[Symbol, external_token]
|
|
20
38
|
EXPECTATIONS = {
|
|
21
39
|
class_keyword: "class", class_name: "identifier", superclass_name: "identifier",
|
|
22
|
-
expect_integer: "integer",
|
|
40
|
+
expect_integer: "integer", expect_rr_integer: "integer",
|
|
41
|
+
start_first_symbol: "a grammar symbol", start_symbols: "a grammar symbol",
|
|
42
|
+
include_path: "a double-quoted relative path",
|
|
43
|
+
display_symbol: "a grammar symbol", type_symbol: "a grammar symbol",
|
|
44
|
+
display_value: "a quoted string", type_value: "a quoted string",
|
|
45
|
+
param_name: "an identifier", param_type: "a quoted type or declaration",
|
|
46
|
+
printer_symbol: "a grammar symbol", printer_action: "an action",
|
|
47
|
+
recover_kind: "sync", recovery_colon: ":", recovery_first_symbol: "a grammar symbol",
|
|
48
|
+
recovery_symbols: "a grammar symbol", on_error_reduce_first_symbol: "a grammar symbol",
|
|
49
|
+
on_error_reduce_symbols: "a grammar symbol", test_expectation: "accept or reject",
|
|
50
|
+
test_source: "a double-quoted string",
|
|
51
|
+
lexer_entries: "a lexer rule, state, or end", lexer_state_name: "a state name",
|
|
52
|
+
lexer_state_do: "do", lexer_pattern: "a regular expression or quoted literal",
|
|
53
|
+
lexer_action_or_entry: "an action, lexer rule, state, or end",
|
|
54
|
+
parser_key: "a parser setting or end", parser_value: "a parser setting value"
|
|
23
55
|
}.freeze #: Hash[Symbol, String]
|
|
24
56
|
|
|
25
57
|
attr_reader :conversion_name #: Token?
|
|
@@ -27,8 +59,15 @@ module Ibex
|
|
|
27
59
|
attr_reader :precedence_closer #: String?
|
|
28
60
|
attr_reader :state #: Symbol
|
|
29
61
|
|
|
30
|
-
# @rbs
|
|
31
|
-
|
|
62
|
+
# @rbs @extended_mode: bool
|
|
63
|
+
# @rbs @fragment: bool?
|
|
64
|
+
# @rbs @pragmas: Hash[String, Location]
|
|
65
|
+
# @rbs @pragma_location: Location?
|
|
66
|
+
|
|
67
|
+
# @rbs (?extended: bool) -> void
|
|
68
|
+
def initialize(extended: false)
|
|
69
|
+
@extended_mode = extended
|
|
70
|
+
@pragmas = {} #: Hash[String, Location]
|
|
32
71
|
@state = :class_keyword
|
|
33
72
|
end
|
|
34
73
|
|
|
@@ -47,7 +86,22 @@ module Ibex
|
|
|
47
86
|
|
|
48
87
|
# @rbs () -> bool
|
|
49
88
|
def extended_pragma?
|
|
50
|
-
@
|
|
89
|
+
@pragmas.key?("extended")
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# @rbs () -> bool
|
|
93
|
+
def cst_pragma?
|
|
94
|
+
@pragmas.key?("cst")
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# @rbs () -> Location?
|
|
98
|
+
def extended_pragma_location
|
|
99
|
+
@pragmas["extended"]
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# @rbs () -> Location?
|
|
103
|
+
def cst_pragma_location
|
|
104
|
+
@pragmas["cst"]
|
|
51
105
|
end
|
|
52
106
|
|
|
53
107
|
# @rbs (Token? token) -> String?
|
|
@@ -70,25 +124,50 @@ module Ibex
|
|
|
70
124
|
|
|
71
125
|
# @rbs (Token token, Array[Token] remaining) -> external_token
|
|
72
126
|
def classify_identifier(token, remaining)
|
|
127
|
+
return classify_lexer_identifier(token) if lexer_declaration_state?
|
|
128
|
+
|
|
73
129
|
case @state
|
|
74
130
|
when :class_keyword then class_keyword(token)
|
|
75
131
|
when :class_name, :superclass_name then constant_name(remaining)
|
|
76
|
-
when :declaration then begin_declaration(token)
|
|
77
|
-
when :token_symbols
|
|
132
|
+
when :declaration, :param_type then begin_declaration(token)
|
|
133
|
+
when :token_symbols
|
|
134
|
+
@token_alias_candidate = token
|
|
135
|
+
declaration_symbol(token)
|
|
136
|
+
when :options_identifiers, :start_symbols, :recovery_symbols, :on_error_reduce_symbols
|
|
137
|
+
declaration_symbol(token)
|
|
78
138
|
when :precedence_association, :precedence_symbols then precedence_identifier(token)
|
|
79
|
-
when :
|
|
139
|
+
when :start_first_symbol then continue_start_symbols(:IDENTIFIER)
|
|
140
|
+
when :display_symbol, :type_symbol then begin_metadata_value(:IDENTIFIER)
|
|
141
|
+
when :param_name then begin_param_type
|
|
142
|
+
when :printer_symbol then begin_printer_action(:IDENTIFIER)
|
|
143
|
+
when :recover_kind then begin_recovery_colon(token)
|
|
144
|
+
when :recovery_first_symbol then continue_recovery_symbols(:IDENTIFIER)
|
|
145
|
+
when :on_error_reduce_first_symbol then continue_on_error_reduce_symbols(:IDENTIFIER)
|
|
146
|
+
when :test_expectation then begin_test_source(token)
|
|
80
147
|
when :pragma_value then finish_pragma(token)
|
|
81
148
|
when :convert_name then begin_conversion(token, :IDENTIFIER, remaining)
|
|
149
|
+
when :parser_key then begin_parser_setting(token)
|
|
150
|
+
when :parser_value then finish_parser_setting
|
|
82
151
|
else :IDENTIFIER
|
|
83
152
|
end
|
|
84
153
|
end
|
|
85
154
|
|
|
86
155
|
# @rbs (Token token) -> external_token
|
|
87
|
-
def
|
|
88
|
-
|
|
156
|
+
def begin_parser_setting(token)
|
|
157
|
+
if string_value(token) == "end"
|
|
158
|
+
@state = :declaration
|
|
159
|
+
@declaration = nil
|
|
160
|
+
return :END
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
@state = :parser_value
|
|
164
|
+
:IDENTIFIER
|
|
165
|
+
end
|
|
89
166
|
|
|
90
|
-
|
|
91
|
-
|
|
167
|
+
# @rbs () -> external_token
|
|
168
|
+
def finish_parser_setting
|
|
169
|
+
@state = :parser_key
|
|
170
|
+
:IDENTIFIER
|
|
92
171
|
end
|
|
93
172
|
|
|
94
173
|
# @rbs (Array[Token] remaining) -> external_token
|
|
@@ -111,11 +190,13 @@ module Ibex
|
|
|
111
190
|
value = string_value(token)
|
|
112
191
|
return begin_precedence(token) if %w[prechigh preclow].include?(value)
|
|
113
192
|
|
|
114
|
-
|
|
193
|
+
reject_fragment_pragma(token, value)
|
|
115
194
|
|
|
116
195
|
terminal, next_state = DECLARATIONS[value]
|
|
117
196
|
return :IDENTIFIER unless terminal
|
|
118
197
|
|
|
198
|
+
@pragma_location = token.location if terminal == :PRAGMA
|
|
199
|
+
@token_alias_candidate = nil
|
|
119
200
|
@state = next_state
|
|
120
201
|
@declaration = value.to_sym unless terminal == :RULE
|
|
121
202
|
@declaration = nil if terminal == :RULE
|
|
@@ -125,9 +206,13 @@ module Ibex
|
|
|
125
206
|
# @rbs (Token token) -> external_token
|
|
126
207
|
def finish_pragma(token)
|
|
127
208
|
value = string_value(token)
|
|
128
|
-
raise Ibex::Error, "#{token.location}: unknown pragma #{value}" unless value
|
|
209
|
+
raise Ibex::Error, "#{token.location}: unknown pragma #{value}" unless %w[extended cst].include?(value)
|
|
210
|
+
|
|
211
|
+
location = @pragma_location || token.location
|
|
212
|
+
raise Ibex::Error, "#{location}: duplicate pragma #{value}" if @pragmas[value]
|
|
129
213
|
|
|
130
|
-
@
|
|
214
|
+
@pragmas[value] = location
|
|
215
|
+
@pragma_location = nil
|
|
131
216
|
@state = :declaration
|
|
132
217
|
@declaration = nil
|
|
133
218
|
:IDENTIFIER
|
|
@@ -151,9 +236,16 @@ module Ibex
|
|
|
151
236
|
|
|
152
237
|
# @rbs (String value) -> bool
|
|
153
238
|
def declaration_boundary?(value)
|
|
239
|
+
return false if %w[display type param printer].include?(value) && !extended_features?
|
|
240
|
+
|
|
154
241
|
DECLARATIONS.key?(value) || %w[prechigh preclow].include?(value)
|
|
155
242
|
end
|
|
156
243
|
|
|
244
|
+
# @rbs () -> bool
|
|
245
|
+
def extended_features?
|
|
246
|
+
@extended_mode || extended_pragma? || cst_pragma?
|
|
247
|
+
end
|
|
248
|
+
|
|
157
249
|
# @rbs (Token token) -> external_token
|
|
158
250
|
def precedence_identifier(token)
|
|
159
251
|
value = string_value(token)
|
|
@@ -189,14 +281,80 @@ module Ibex
|
|
|
189
281
|
# @rbs (Token token, Array[Token] remaining) -> external_token
|
|
190
282
|
def classify_scalar(token, remaining)
|
|
191
283
|
type = SCALAR_TYPES.fetch(token.type)
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
284
|
+
classified = classify_lexer_scalar(type) ||
|
|
285
|
+
classify_token_alias(token, type) || classify_include(type) || classify_single_symbol(type) ||
|
|
286
|
+
classify_metadata(type) || classify_printer(type) || classify_grammar_test(type) ||
|
|
287
|
+
classify_conversion(token, type, remaining)
|
|
196
288
|
|
|
289
|
+
classified || type
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
# @rbs (external_token type) -> external_token?
|
|
293
|
+
def classify_single_symbol(type)
|
|
294
|
+
return finish_single_symbol(type) if %i[expect_integer expect_rr_integer].include?(@state) && type == :INTEGER
|
|
295
|
+
|
|
296
|
+
first = continue_first_symbol(type)
|
|
297
|
+
return first if first
|
|
298
|
+
|
|
299
|
+
type if @state == :start_symbols && type == :LITERAL
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
# @rbs (external_token type) -> external_token?
|
|
303
|
+
def continue_first_symbol(type)
|
|
304
|
+
return unless type == :LITERAL
|
|
305
|
+
return continue_start_symbols(type) if @state == :start_first_symbol
|
|
306
|
+
return continue_recovery_symbols(type) if @state == :recovery_first_symbol
|
|
307
|
+
|
|
308
|
+
continue_on_error_reduce_symbols(type) if @state == :on_error_reduce_first_symbol
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
# @rbs (Token token, external_token type) -> external_token?
|
|
312
|
+
def classify_token_alias(token, type)
|
|
313
|
+
candidate = @token_alias_candidate
|
|
314
|
+
return unless extended_features? && @state == :token_symbols &&
|
|
315
|
+
type == :LITERAL && candidate
|
|
316
|
+
return unless candidate.location.line == token.location.line
|
|
317
|
+
|
|
318
|
+
@token_alias_candidate = nil
|
|
319
|
+
:TOKEN_ALIAS
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
# @rbs (external_token type) -> external_token?
|
|
323
|
+
def classify_metadata(type)
|
|
324
|
+
return unless type == :LITERAL
|
|
325
|
+
return begin_metadata_value(type) if %i[display_symbol type_symbol].include?(@state)
|
|
326
|
+
return finish_param_type(type) if @state == :param_type
|
|
327
|
+
|
|
328
|
+
finish_metadata_value(type) if %i[display_value type_value].include?(@state)
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
# @rbs (external_token type) -> external_token?
|
|
332
|
+
def classify_printer(type)
|
|
333
|
+
return begin_printer_action(type) if @state == :printer_symbol && type == :LITERAL
|
|
334
|
+
return unless @state == :printer_action && type == :ACTION
|
|
335
|
+
|
|
336
|
+
@state = :declaration
|
|
337
|
+
@declaration = nil
|
|
338
|
+
type
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
# @rbs (external_token type) -> external_token?
|
|
342
|
+
def classify_grammar_test(type)
|
|
343
|
+
return unless @state == :test_source && type == :LITERAL
|
|
344
|
+
|
|
345
|
+
@state = :declaration
|
|
346
|
+
@declaration = nil
|
|
197
347
|
type
|
|
198
348
|
end
|
|
199
349
|
|
|
350
|
+
# @rbs (Token token, external_token type, Array[Token] remaining) -> external_token?
|
|
351
|
+
def classify_conversion(token, type, remaining)
|
|
352
|
+
return unless type == :LITERAL
|
|
353
|
+
return begin_conversion(token, type, remaining) if @state == :convert_name
|
|
354
|
+
|
|
355
|
+
finish_conversion(type) if @state == :convert_expression
|
|
356
|
+
end
|
|
357
|
+
|
|
200
358
|
# @rbs (external_token type) -> external_token
|
|
201
359
|
def finish_single_symbol(type)
|
|
202
360
|
@state = :declaration
|
|
@@ -204,6 +362,68 @@ module Ibex
|
|
|
204
362
|
type
|
|
205
363
|
end
|
|
206
364
|
|
|
365
|
+
# @rbs (external_token type) -> external_token
|
|
366
|
+
def continue_start_symbols(type)
|
|
367
|
+
@state = :start_symbols
|
|
368
|
+
type
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
# @rbs (external_token type) -> external_token
|
|
372
|
+
def continue_recovery_symbols(type)
|
|
373
|
+
@state = :recovery_symbols
|
|
374
|
+
type
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
# @rbs (external_token type) -> external_token
|
|
378
|
+
def continue_on_error_reduce_symbols(type)
|
|
379
|
+
@state = :on_error_reduce_symbols
|
|
380
|
+
type
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
# @rbs (external_token type) -> external_token
|
|
384
|
+
def begin_metadata_value(type)
|
|
385
|
+
@state = @state == :display_symbol ? :display_value : :type_value
|
|
386
|
+
type
|
|
387
|
+
end
|
|
388
|
+
|
|
389
|
+
# @rbs () -> external_token
|
|
390
|
+
def begin_param_type
|
|
391
|
+
@state = :param_type
|
|
392
|
+
:IDENTIFIER
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
# @rbs (external_token type) -> external_token
|
|
396
|
+
def begin_printer_action(type)
|
|
397
|
+
@state = :printer_action
|
|
398
|
+
type
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
# @rbs (Token token) -> external_token
|
|
402
|
+
def begin_recovery_colon(_token)
|
|
403
|
+
@state = :recovery_colon
|
|
404
|
+
:IDENTIFIER
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
# @rbs (Token token) -> external_token
|
|
408
|
+
def begin_test_source(_token)
|
|
409
|
+
@state = :test_source
|
|
410
|
+
:IDENTIFIER
|
|
411
|
+
end
|
|
412
|
+
|
|
413
|
+
# @rbs (external_token type) -> external_token
|
|
414
|
+
def finish_param_type(type)
|
|
415
|
+
@state = :declaration
|
|
416
|
+
@declaration = nil
|
|
417
|
+
type
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
# @rbs (external_token type) -> external_token
|
|
421
|
+
def finish_metadata_value(type)
|
|
422
|
+
@state = :declaration
|
|
423
|
+
@declaration = nil
|
|
424
|
+
type
|
|
425
|
+
end
|
|
426
|
+
|
|
207
427
|
# @rbs (external_token type) -> external_token
|
|
208
428
|
def finish_conversion(type)
|
|
209
429
|
@state = :convert_name
|
|
@@ -214,6 +434,7 @@ module Ibex
|
|
|
214
434
|
# @rbs (Token token) -> external_token
|
|
215
435
|
def classify_punctuation(token)
|
|
216
436
|
@state = :superclass_name if @state == :superclass_marker && token.type == :<
|
|
437
|
+
@state = :recovery_first_symbol if @state == :recovery_colon && token.type == :":"
|
|
217
438
|
string_value(token)
|
|
218
439
|
end
|
|
219
440
|
|
|
@@ -232,7 +453,7 @@ module Ibex
|
|
|
232
453
|
def precedence_expectation(token)
|
|
233
454
|
return @precedence_closer if token&.type == :eof
|
|
234
455
|
|
|
235
|
-
"left or right or nonassoc" if @state == :precedence_association
|
|
456
|
+
"left or right or nonassoc or precedence" if @state == :precedence_association
|
|
236
457
|
end
|
|
237
458
|
|
|
238
459
|
# @rbs (Token token) -> String
|
|
@@ -243,6 +464,7 @@ module Ibex
|
|
|
243
464
|
raise Ibex::Error, "#{token.location}: expected text token"
|
|
244
465
|
end
|
|
245
466
|
end
|
|
467
|
+
# rubocop:enable Metrics/ClassLength, Metrics/CyclomaticComplexity
|
|
246
468
|
end
|
|
247
469
|
end
|
|
248
470
|
end
|
|
@@ -23,8 +23,14 @@ module Ibex
|
|
|
23
23
|
# @rbs (Token token, external_token external, external_token? previous_external) -> void
|
|
24
24
|
def observe(token, external, previous_external)
|
|
25
25
|
if external == "("
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
kind = if %i[SEPARATED_LIST SEPARATED_NONEMPTY_LIST].include?(previous_external)
|
|
27
|
+
:separated
|
|
28
|
+
elsif %i[LHS PARAMETERIZED_REFERENCE].include?(previous_external)
|
|
29
|
+
:parameter
|
|
30
|
+
else
|
|
31
|
+
:group
|
|
32
|
+
end #: delimiter_kind
|
|
33
|
+
@stack << [kind, token] #: [delimiter_kind, Token]
|
|
28
34
|
elsif external == ")"
|
|
29
35
|
@stack.pop
|
|
30
36
|
end
|