ibex 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +247 -104
- data/docs/architecture.md +322 -28
- data/docs/cst-migration.md +107 -0
- data/docs/cst.md +213 -0
- data/docs/development.md +129 -0
- data/docs/editor-setup.md +25 -0
- data/docs/error-ux.md +60 -0
- data/docs/grammar-reference.md +458 -18
- data/docs/lexer-migration.md +51 -0
- data/docs/racc-migration.md +34 -6
- data/docs/release-readiness.md +163 -0
- data/docs/stability.md +124 -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/sets.rb +5 -4
- data/lib/ibex/artifact_set.rb +63 -0
- data/lib/ibex/cli/ambiguity.rb +66 -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 +116 -0
- data/lib/ibex/cli/documentation.rb +67 -0
- data/lib/ibex/cli/error_messages.rb +177 -0
- data/lib/ibex/cli/explain.rb +76 -0
- data/lib/ibex/cli/formatting.rb +386 -0
- data/lib/ibex/cli/generation_artifacts.rb +138 -0
- data/lib/ibex/cli/generation_error_messages.rb +39 -0
- data/lib/ibex/cli/grammar_tests.rb +122 -0
- data/lib/ibex/cli/ir_tools.rb +184 -0
- data/lib/ibex/cli/lsp.rb +33 -0
- data/lib/ibex/cli/outputs.rb +91 -8
- data/lib/ibex/cli/racc_migration.rb +87 -0
- data/lib/ibex/cli/samples.rb +92 -0
- data/lib/ibex/cli/watch.rb +103 -0
- data/lib/ibex/cli.rb +506 -37
- data/lib/ibex/codegen/action_locations.rb +103 -0
- data/lib/ibex/codegen/action_method_source.rb +210 -0
- data/lib/ibex/codegen/action_source.rb +118 -0
- data/lib/ibex/codegen/ambiguity.rb +173 -0
- data/lib/ibex/codegen/cst_metadata.rb +171 -0
- data/lib/ibex/codegen/documentation.rb +170 -0
- data/lib/ibex/codegen/explain.rb +312 -0
- data/lib/ibex/codegen/generated_action_abi.rb +288 -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 +323 -2
- data/lib/ibex/codegen/report.rb +46 -6
- data/lib/ibex/codegen/ruby.rb +334 -59
- data/lib/ibex/codegen/ruby_actions.rb +143 -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 +90 -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/coverage/collector.rb +188 -0
- data/lib/ibex/coverage/event_stream.rb +97 -0
- data/lib/ibex/coverage/report.rb +259 -0
- data/lib/ibex/coverage/runtime_event_validator.rb +160 -0
- data/lib/ibex/coverage.rb +13 -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/frontend/ast.rb +145 -6
- data/lib/ibex/frontend/bootstrap_parser.rb +47 -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 +407 -0
- data/lib/ibex/frontend/generated_parser.rb +614 -190
- data/lib/ibex/frontend/generated_parser_base.rb +164 -30
- data/lib/ibex/frontend/generated_parser_includes.rb +61 -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 +247 -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/regenerator.rb +26 -1
- data/lib/ibex/frontend/resolution.rb +69 -0
- data/lib/ibex/frontend/resolver.rb +217 -0
- data/lib/ibex/frontend/rule_documentation.rb +103 -0
- data/lib/ibex/frontend/source_cursor.rb +132 -8
- 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 +81 -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 +216 -26
- 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 +8 -3
- data/lib/ibex/frontend.rb +13 -2
- data/lib/ibex/generation_input.rb +57 -0
- data/lib/ibex/generation_manifest.rb +200 -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 +38 -5
- data/lib/ibex/ir/grammar_ir.rb +137 -24
- data/lib/ibex/ir/lexer_ir.rb +76 -0
- data/lib/ibex/ir/migration.rb +120 -0
- data/lib/ibex/ir/serialize.rb +110 -19
- data/lib/ibex/ir/validator/automaton.rb +345 -0
- data/lib/ibex/ir/validator/base.rb +129 -0
- data/lib/ibex/ir/validator/grammar.rb +604 -0
- data/lib/ibex/ir/validator/lexer.rb +113 -0
- data/lib/ibex/ir/validator.rb +62 -0
- data/lib/ibex/ir.rb +57 -4
- data/lib/ibex/lalr/build_metrics.rb +23 -0
- data/lib/ibex/lalr/builder.rb +379 -52
- data/lib/ibex/lalr/conflict.rb +1 -0
- data/lib/ibex/lalr/conflict_search.rb +11 -5
- data/lib/ibex/lalr/counterexample.rb +20 -5
- data/lib/ibex/lalr/direct_lookaheads.rb +236 -0
- data/lib/ibex/lalr/ielr_partition.rb +152 -0
- data/lib/ibex/lalr/on_error_reductions.rb +74 -0
- data/lib/ibex/lalr.rb +7 -0
- data/lib/ibex/location.rb +129 -0
- data/lib/ibex/lsp/document_handlers.rb +66 -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 +78 -0
- data/lib/ibex/lsp/navigation_handlers.rb +56 -0
- data/lib/ibex/lsp/position_codec.rb +109 -0
- data/lib/ibex/lsp/protocol_error.rb +33 -0
- data/lib/ibex/lsp/request_handlers.rb +45 -0
- data/lib/ibex/lsp/request_support.rb +87 -0
- data/lib/ibex/lsp/server.rb +146 -0
- data/lib/ibex/lsp/symbol_index.rb +241 -0
- data/lib/ibex/lsp/symbol_index_builder.rb +267 -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 +17 -0
- data/lib/ibex/lsp/transport.rb +118 -0
- data/lib/ibex/lsp/workspace.rb +127 -0
- data/lib/ibex/lsp/workspace_analyzer.rb +199 -0
- data/lib/ibex/lsp.rb +32 -0
- data/lib/ibex/normalize/declarations.rb +140 -7
- data/lib/ibex/normalize/diagnostics.rb +50 -5
- data/lib/ibex/normalize/expander.rb +59 -55
- data/lib/ibex/normalize/expression.rb +60 -39
- data/lib/ibex/normalize/inline_expansion.rb +414 -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 +69 -0
- data/lib/ibex/normalize/parameter_lowering.rb +126 -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 +199 -0
- data/lib/ibex/normalize/recovery_declarations.rb +84 -0
- data/lib/ibex/normalize.rb +179 -14
- 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 +94 -0
- data/lib/ibex/racc_migration.rb +12 -0
- data/lib/ibex/rake_task.rb +116 -0
- data/lib/ibex/samples.rb +186 -0
- data/lib/ibex/table_simulation/result.rb +51 -0
- data/lib/ibex/table_simulation/simulator.rb +253 -0
- data/lib/ibex/table_simulation/step.rb +60 -0
- data/lib/ibex/table_simulation/text.rb +31 -0
- data/lib/ibex/table_simulation.rb +13 -0
- data/lib/ibex/tables.rb +9 -70
- data/lib/ibex/version.rb +1 -1
- data/lib/ibex/watch/runner.rb +172 -0
- data/lib/ibex/watch/source_snapshot.rb +93 -0
- data/lib/ibex/watch.rb +11 -0
- data/lib/ibex.rb +25 -1
- data/schema/automaton-ir-v1.schema.json +401 -0
- data/schema/automaton-ir-v2.schema.json +58 -0
- data/schema/benchmark-v1.schema.json +212 -0
- data/schema/benchmark-v2.schema.json +61 -0
- data/schema/cst-v1.json +170 -0
- data/schema/error-ux-v1.schema.json +258 -0
- data/schema/explain-v1.schema.json +433 -0
- data/schema/frontend-diagnostics-v1.schema.json +154 -0
- data/schema/generation-manifest-v1.schema.json +115 -0
- data/schema/grammar-ir-v1.schema.json +426 -0
- data/schema/grammar-ir-v2.schema.json +779 -0
- data/schema/lexer-ir-v1.schema.json +215 -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/runtime-coverage-v1.schema.json +86 -0
- data/schema/runtime-event-v1.schema.json +308 -0
- data/schema/table-simulation-v1.schema.json +70 -0
- data/sig/ibex/artifact_set.rbs +37 -0
- data/sig/ibex/cli/ambiguity.rbs +22 -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 +38 -0
- data/sig/ibex/cli/documentation.rbs +25 -0
- data/sig/ibex/cli/error_messages.rbs +57 -0
- data/sig/ibex/cli/explain.rbs +25 -0
- data/sig/ibex/cli/formatting.rbs +103 -0
- data/sig/ibex/cli/generation_artifacts.rbs +50 -0
- data/sig/ibex/cli/generation_error_messages.rbs +19 -0
- data/sig/ibex/cli/grammar_tests.rbs +36 -0
- data/sig/ibex/cli/ir_tools.rbs +51 -0
- data/sig/ibex/cli/lsp.rbs +14 -0
- data/sig/ibex/cli/outputs.rbs +17 -0
- data/sig/ibex/cli/racc_migration.rbs +30 -0
- data/sig/ibex/cli/samples.rbs +30 -0
- data/sig/ibex/cli/watch.rbs +43 -0
- data/sig/ibex/cli.rbs +104 -5
- 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 +85 -0
- data/sig/ibex/codegen/generated_action_abi.rbs +101 -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 +84 -4
- data/sig/ibex/codegen/report.rbs +8 -0
- data/sig/ibex/codegen/ruby.rbs +97 -23
- 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 +25 -0
- data/sig/ibex/codegen/ruby_table_metadata.rbs +26 -0
- data/sig/ibex/codegen/ruby_value_printers.rbs +28 -0
- data/sig/ibex/coverage/collector.rbs +76 -0
- data/sig/ibex/coverage/event_stream.rbs +42 -0
- data/sig/ibex/coverage/report.rbs +100 -0
- data/sig/ibex/coverage/runtime_event_validator.rbs +68 -0
- data/sig/ibex/coverage.rbs +7 -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/frontend/ast.rbs +208 -19
- data/sig/ibex/frontend/bootstrap_parser.rbs +11 -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 +135 -0
- data/sig/ibex/frontend/generated_parser.rbs +218 -68
- data/sig/ibex/frontend/generated_parser_base.rbs +61 -10
- 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 +54 -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/regenerator.rbs +11 -0
- data/sig/ibex/frontend/resolution.rbs +33 -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 +36 -3
- 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 +53 -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 +73 -5
- data/sig/ibex/frontend/token_adapter/rule_state.rbs +20 -0
- data/sig/ibex/frontend/token_adapter.rbs +5 -2
- data/sig/ibex/frontend.rbs +1 -1
- data/sig/ibex/generation_input.rbs +37 -0
- data/sig/ibex/generation_manifest.rbs +67 -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 +8 -2
- data/sig/ibex/ir/grammar_ir.rbs +75 -15
- data/sig/ibex/ir/lexer_ir.rbs +57 -0
- data/sig/ibex/ir/migration.rbs +34 -0
- data/sig/ibex/ir/serialize.rbs +23 -6
- data/sig/ibex/ir/validator/automaton.rbs +109 -0
- data/sig/ibex/ir/validator/base.rbs +65 -0
- data/sig/ibex/ir/validator/grammar.rbs +184 -0
- data/sig/ibex/ir/validator/lexer.rbs +37 -0
- data/sig/ibex/ir/validator.rbs +16 -0
- data/sig/ibex/ir.rbs +38 -4
- data/sig/ibex/lalr/build_metrics.rbs +20 -0
- data/sig/ibex/lalr/builder.rbs +95 -15
- data/sig/ibex/lalr/conflict_search.rbs +7 -3
- data/sig/ibex/lalr/counterexample.rbs +5 -2
- data/sig/ibex/lalr/direct_lookaheads.rbs +86 -0
- data/sig/ibex/lalr/ielr_partition.rbs +59 -0
- data/sig/ibex/lalr/on_error_reductions.rbs +22 -0
- data/sig/ibex/lalr.rbs +6 -0
- 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 +30 -0
- data/sig/ibex/lsp/position_codec.rbs +40 -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 +78 -0
- data/sig/ibex/lsp/symbol_index_builder.rbs +87 -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 +25 -0
- data/sig/ibex/lsp/transport.rbs +35 -0
- data/sig/ibex/lsp/workspace.rbs +41 -0
- data/sig/ibex/lsp/workspace_analyzer.rbs +69 -0
- data/sig/ibex/lsp.rbs +7 -0
- data/sig/ibex/normalize/declarations.rbs +31 -0
- data/sig/ibex/normalize/diagnostics.rbs +9 -0
- data/sig/ibex/normalize/expander.rbs +20 -14
- data/sig/ibex/normalize/expression.rbs +10 -10
- data/sig/ibex/normalize/inline_expansion.rbs +120 -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 +32 -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 +46 -0
- data/sig/ibex/normalize/recovery_declarations.rbs +24 -0
- data/sig/ibex/normalize.rbs +123 -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 +53 -0
- data/sig/ibex/racc_migration.rbs +8 -0
- data/sig/ibex/rake_task.rbs +51 -0
- data/sig/ibex/samples.rbs +51 -0
- data/sig/ibex/table_simulation/result.rbs +32 -0
- data/sig/ibex/table_simulation/simulator.rbs +98 -0
- data/sig/ibex/table_simulation/step.rbs +40 -0
- data/sig/ibex/table_simulation/text.rbs +14 -0
- data/sig/ibex/table_simulation.rbs +7 -0
- data/sig/ibex/tables.rbs +0 -26
- data/sig/ibex/watch/runner.rbs +48 -0
- data/sig/ibex/watch/source_snapshot.rbs +42 -0
- data/sig/ibex/watch.rbs +7 -0
- data/sig/ibex.rbs +2 -0
- metadata +301 -16
- 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,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,55 @@
|
|
|
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],
|
|
12
29
|
"rule" => %i[RULE rules]
|
|
13
30
|
}.freeze #: Hash[String, [external_token, Symbol]]
|
|
14
31
|
ASSOCIATIONS = {
|
|
15
|
-
"left" => :LEFT, "right" => :RIGHT, "nonassoc" => :NONASSOC
|
|
32
|
+
"left" => :LEFT, "right" => :RIGHT, "nonassoc" => :NONASSOC, "precedence" => :PRECEDENCE
|
|
16
33
|
}.freeze #: Hash[String, external_token]
|
|
17
34
|
SCALAR_TYPES = {
|
|
18
|
-
literal: :LITERAL, integer: :INTEGER, action: :ACTION, user_code: :USER_CODE
|
|
35
|
+
literal: :LITERAL, regexp: :REGEXP, integer: :INTEGER, action: :ACTION, user_code: :USER_CODE
|
|
19
36
|
}.freeze #: Hash[Symbol, external_token]
|
|
20
37
|
EXPECTATIONS = {
|
|
21
38
|
class_keyword: "class", class_name: "identifier", superclass_name: "identifier",
|
|
22
|
-
expect_integer: "integer",
|
|
39
|
+
expect_integer: "integer", expect_rr_integer: "integer",
|
|
40
|
+
start_first_symbol: "a grammar symbol", start_symbols: "a grammar symbol",
|
|
41
|
+
include_path: "a double-quoted relative path",
|
|
42
|
+
display_symbol: "a grammar symbol", type_symbol: "a grammar symbol",
|
|
43
|
+
display_value: "a quoted string", type_value: "a quoted string",
|
|
44
|
+
param_name: "an identifier", param_type: "a quoted type or declaration",
|
|
45
|
+
printer_symbol: "a grammar symbol", printer_action: "an action",
|
|
46
|
+
recover_kind: "sync", recovery_colon: ":", recovery_first_symbol: "a grammar symbol",
|
|
47
|
+
recovery_symbols: "a grammar symbol", on_error_reduce_first_symbol: "a grammar symbol",
|
|
48
|
+
on_error_reduce_symbols: "a grammar symbol", test_expectation: "accept or reject",
|
|
49
|
+
test_source: "a double-quoted string",
|
|
50
|
+
lexer_entries: "a lexer rule, state, or end", lexer_state_name: "a state name",
|
|
51
|
+
lexer_state_do: "do", lexer_pattern: "a regular expression or quoted literal",
|
|
52
|
+
lexer_action_or_entry: "an action, lexer rule, state, or end"
|
|
23
53
|
}.freeze #: Hash[Symbol, String]
|
|
24
54
|
|
|
25
55
|
attr_reader :conversion_name #: Token?
|
|
@@ -27,8 +57,15 @@ module Ibex
|
|
|
27
57
|
attr_reader :precedence_closer #: String?
|
|
28
58
|
attr_reader :state #: Symbol
|
|
29
59
|
|
|
30
|
-
# @rbs
|
|
31
|
-
|
|
60
|
+
# @rbs @extended_mode: bool
|
|
61
|
+
# @rbs @fragment: bool?
|
|
62
|
+
# @rbs @pragmas: Hash[String, bool]
|
|
63
|
+
# @rbs @pragma_location: Location?
|
|
64
|
+
|
|
65
|
+
# @rbs (?extended: bool) -> void
|
|
66
|
+
def initialize(extended: false)
|
|
67
|
+
@extended_mode = extended
|
|
68
|
+
@pragmas = {} #: Hash[String, bool]
|
|
32
69
|
@state = :class_keyword
|
|
33
70
|
end
|
|
34
71
|
|
|
@@ -47,7 +84,12 @@ module Ibex
|
|
|
47
84
|
|
|
48
85
|
# @rbs () -> bool
|
|
49
86
|
def extended_pragma?
|
|
50
|
-
@
|
|
87
|
+
@pragmas["extended"] == true
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# @rbs () -> bool
|
|
91
|
+
def cst_pragma?
|
|
92
|
+
@pragmas["cst"] == true
|
|
51
93
|
end
|
|
52
94
|
|
|
53
95
|
# @rbs (Token? token) -> String?
|
|
@@ -70,27 +112,32 @@ module Ibex
|
|
|
70
112
|
|
|
71
113
|
# @rbs (Token token, Array[Token] remaining) -> external_token
|
|
72
114
|
def classify_identifier(token, remaining)
|
|
115
|
+
return classify_lexer_identifier(token) if lexer_declaration_state?
|
|
116
|
+
|
|
73
117
|
case @state
|
|
74
118
|
when :class_keyword then class_keyword(token)
|
|
75
119
|
when :class_name, :superclass_name then constant_name(remaining)
|
|
76
|
-
when :declaration then begin_declaration(token)
|
|
77
|
-
when :token_symbols
|
|
120
|
+
when :declaration, :param_type then begin_declaration(token)
|
|
121
|
+
when :token_symbols
|
|
122
|
+
@token_alias_candidate = token
|
|
123
|
+
declaration_symbol(token)
|
|
124
|
+
when :options_identifiers, :start_symbols, :recovery_symbols, :on_error_reduce_symbols
|
|
125
|
+
declaration_symbol(token)
|
|
78
126
|
when :precedence_association, :precedence_symbols then precedence_identifier(token)
|
|
79
|
-
when :
|
|
127
|
+
when :start_first_symbol then continue_start_symbols(:IDENTIFIER)
|
|
128
|
+
when :display_symbol, :type_symbol then begin_metadata_value(:IDENTIFIER)
|
|
129
|
+
when :param_name then begin_param_type
|
|
130
|
+
when :printer_symbol then begin_printer_action(:IDENTIFIER)
|
|
131
|
+
when :recover_kind then begin_recovery_colon(token)
|
|
132
|
+
when :recovery_first_symbol then continue_recovery_symbols(:IDENTIFIER)
|
|
133
|
+
when :on_error_reduce_first_symbol then continue_on_error_reduce_symbols(:IDENTIFIER)
|
|
134
|
+
when :test_expectation then begin_test_source(token)
|
|
80
135
|
when :pragma_value then finish_pragma(token)
|
|
81
136
|
when :convert_name then begin_conversion(token, :IDENTIFIER, remaining)
|
|
82
137
|
else :IDENTIFIER
|
|
83
138
|
end
|
|
84
139
|
end
|
|
85
140
|
|
|
86
|
-
# @rbs (Token token) -> external_token
|
|
87
|
-
def class_keyword(token)
|
|
88
|
-
return :IDENTIFIER unless string_value(token) == "class"
|
|
89
|
-
|
|
90
|
-
@state = :class_name
|
|
91
|
-
:CLASS
|
|
92
|
-
end
|
|
93
|
-
|
|
94
141
|
# @rbs (Array[Token] remaining) -> external_token
|
|
95
142
|
def constant_name(remaining)
|
|
96
143
|
following = remaining.first
|
|
@@ -111,11 +158,13 @@ module Ibex
|
|
|
111
158
|
value = string_value(token)
|
|
112
159
|
return begin_precedence(token) if %w[prechigh preclow].include?(value)
|
|
113
160
|
|
|
114
|
-
|
|
161
|
+
reject_fragment_pragma(token, value)
|
|
115
162
|
|
|
116
163
|
terminal, next_state = DECLARATIONS[value]
|
|
117
164
|
return :IDENTIFIER unless terminal
|
|
118
165
|
|
|
166
|
+
@pragma_location = token.location if terminal == :PRAGMA
|
|
167
|
+
@token_alias_candidate = nil
|
|
119
168
|
@state = next_state
|
|
120
169
|
@declaration = value.to_sym unless terminal == :RULE
|
|
121
170
|
@declaration = nil if terminal == :RULE
|
|
@@ -125,9 +174,13 @@ module Ibex
|
|
|
125
174
|
# @rbs (Token token) -> external_token
|
|
126
175
|
def finish_pragma(token)
|
|
127
176
|
value = string_value(token)
|
|
128
|
-
raise Ibex::Error, "#{token.location}: unknown pragma #{value}" unless value
|
|
177
|
+
raise Ibex::Error, "#{token.location}: unknown pragma #{value}" unless %w[extended cst].include?(value)
|
|
129
178
|
|
|
130
|
-
|
|
179
|
+
location = @pragma_location || token.location
|
|
180
|
+
raise Ibex::Error, "#{location}: duplicate pragma #{value}" if @pragmas[value]
|
|
181
|
+
|
|
182
|
+
@pragmas[value] = true
|
|
183
|
+
@pragma_location = nil
|
|
131
184
|
@state = :declaration
|
|
132
185
|
@declaration = nil
|
|
133
186
|
:IDENTIFIER
|
|
@@ -151,9 +204,16 @@ module Ibex
|
|
|
151
204
|
|
|
152
205
|
# @rbs (String value) -> bool
|
|
153
206
|
def declaration_boundary?(value)
|
|
207
|
+
return false if %w[display type param printer].include?(value) && !extended_features?
|
|
208
|
+
|
|
154
209
|
DECLARATIONS.key?(value) || %w[prechigh preclow].include?(value)
|
|
155
210
|
end
|
|
156
211
|
|
|
212
|
+
# @rbs () -> bool
|
|
213
|
+
def extended_features?
|
|
214
|
+
@extended_mode || extended_pragma? || cst_pragma?
|
|
215
|
+
end
|
|
216
|
+
|
|
157
217
|
# @rbs (Token token) -> external_token
|
|
158
218
|
def precedence_identifier(token)
|
|
159
219
|
value = string_value(token)
|
|
@@ -189,14 +249,80 @@ module Ibex
|
|
|
189
249
|
# @rbs (Token token, Array[Token] remaining) -> external_token
|
|
190
250
|
def classify_scalar(token, remaining)
|
|
191
251
|
type = SCALAR_TYPES.fetch(token.type)
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
252
|
+
classified = classify_lexer_scalar(type) ||
|
|
253
|
+
classify_token_alias(token, type) || classify_include(type) || classify_single_symbol(type) ||
|
|
254
|
+
classify_metadata(type) || classify_printer(type) || classify_grammar_test(type) ||
|
|
255
|
+
classify_conversion(token, type, remaining)
|
|
256
|
+
|
|
257
|
+
classified || type
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
# @rbs (external_token type) -> external_token?
|
|
261
|
+
def classify_single_symbol(type)
|
|
262
|
+
return finish_single_symbol(type) if %i[expect_integer expect_rr_integer].include?(@state) && type == :INTEGER
|
|
263
|
+
|
|
264
|
+
first = continue_first_symbol(type)
|
|
265
|
+
return first if first
|
|
266
|
+
|
|
267
|
+
type if @state == :start_symbols && type == :LITERAL
|
|
268
|
+
end
|
|
196
269
|
|
|
270
|
+
# @rbs (external_token type) -> external_token?
|
|
271
|
+
def continue_first_symbol(type)
|
|
272
|
+
return unless type == :LITERAL
|
|
273
|
+
return continue_start_symbols(type) if @state == :start_first_symbol
|
|
274
|
+
return continue_recovery_symbols(type) if @state == :recovery_first_symbol
|
|
275
|
+
|
|
276
|
+
continue_on_error_reduce_symbols(type) if @state == :on_error_reduce_first_symbol
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
# @rbs (Token token, external_token type) -> external_token?
|
|
280
|
+
def classify_token_alias(token, type)
|
|
281
|
+
candidate = @token_alias_candidate
|
|
282
|
+
return unless extended_features? && @state == :token_symbols &&
|
|
283
|
+
type == :LITERAL && candidate
|
|
284
|
+
return unless candidate.location.line == token.location.line
|
|
285
|
+
|
|
286
|
+
@token_alias_candidate = nil
|
|
287
|
+
:TOKEN_ALIAS
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
# @rbs (external_token type) -> external_token?
|
|
291
|
+
def classify_metadata(type)
|
|
292
|
+
return unless type == :LITERAL
|
|
293
|
+
return begin_metadata_value(type) if %i[display_symbol type_symbol].include?(@state)
|
|
294
|
+
return finish_param_type(type) if @state == :param_type
|
|
295
|
+
|
|
296
|
+
finish_metadata_value(type) if %i[display_value type_value].include?(@state)
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
# @rbs (external_token type) -> external_token?
|
|
300
|
+
def classify_printer(type)
|
|
301
|
+
return begin_printer_action(type) if @state == :printer_symbol && type == :LITERAL
|
|
302
|
+
return unless @state == :printer_action && type == :ACTION
|
|
303
|
+
|
|
304
|
+
@state = :declaration
|
|
305
|
+
@declaration = nil
|
|
306
|
+
type
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
# @rbs (external_token type) -> external_token?
|
|
310
|
+
def classify_grammar_test(type)
|
|
311
|
+
return unless @state == :test_source && type == :LITERAL
|
|
312
|
+
|
|
313
|
+
@state = :declaration
|
|
314
|
+
@declaration = nil
|
|
197
315
|
type
|
|
198
316
|
end
|
|
199
317
|
|
|
318
|
+
# @rbs (Token token, external_token type, Array[Token] remaining) -> external_token?
|
|
319
|
+
def classify_conversion(token, type, remaining)
|
|
320
|
+
return unless type == :LITERAL
|
|
321
|
+
return begin_conversion(token, type, remaining) if @state == :convert_name
|
|
322
|
+
|
|
323
|
+
finish_conversion(type) if @state == :convert_expression
|
|
324
|
+
end
|
|
325
|
+
|
|
200
326
|
# @rbs (external_token type) -> external_token
|
|
201
327
|
def finish_single_symbol(type)
|
|
202
328
|
@state = :declaration
|
|
@@ -204,6 +330,68 @@ module Ibex
|
|
|
204
330
|
type
|
|
205
331
|
end
|
|
206
332
|
|
|
333
|
+
# @rbs (external_token type) -> external_token
|
|
334
|
+
def continue_start_symbols(type)
|
|
335
|
+
@state = :start_symbols
|
|
336
|
+
type
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
# @rbs (external_token type) -> external_token
|
|
340
|
+
def continue_recovery_symbols(type)
|
|
341
|
+
@state = :recovery_symbols
|
|
342
|
+
type
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
# @rbs (external_token type) -> external_token
|
|
346
|
+
def continue_on_error_reduce_symbols(type)
|
|
347
|
+
@state = :on_error_reduce_symbols
|
|
348
|
+
type
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
# @rbs (external_token type) -> external_token
|
|
352
|
+
def begin_metadata_value(type)
|
|
353
|
+
@state = @state == :display_symbol ? :display_value : :type_value
|
|
354
|
+
type
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
# @rbs () -> external_token
|
|
358
|
+
def begin_param_type
|
|
359
|
+
@state = :param_type
|
|
360
|
+
:IDENTIFIER
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
# @rbs (external_token type) -> external_token
|
|
364
|
+
def begin_printer_action(type)
|
|
365
|
+
@state = :printer_action
|
|
366
|
+
type
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
# @rbs (Token token) -> external_token
|
|
370
|
+
def begin_recovery_colon(_token)
|
|
371
|
+
@state = :recovery_colon
|
|
372
|
+
:IDENTIFIER
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
# @rbs (Token token) -> external_token
|
|
376
|
+
def begin_test_source(_token)
|
|
377
|
+
@state = :test_source
|
|
378
|
+
:IDENTIFIER
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
# @rbs (external_token type) -> external_token
|
|
382
|
+
def finish_param_type(type)
|
|
383
|
+
@state = :declaration
|
|
384
|
+
@declaration = nil
|
|
385
|
+
type
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
# @rbs (external_token type) -> external_token
|
|
389
|
+
def finish_metadata_value(type)
|
|
390
|
+
@state = :declaration
|
|
391
|
+
@declaration = nil
|
|
392
|
+
type
|
|
393
|
+
end
|
|
394
|
+
|
|
207
395
|
# @rbs (external_token type) -> external_token
|
|
208
396
|
def finish_conversion(type)
|
|
209
397
|
@state = :convert_name
|
|
@@ -214,6 +402,7 @@ module Ibex
|
|
|
214
402
|
# @rbs (Token token) -> external_token
|
|
215
403
|
def classify_punctuation(token)
|
|
216
404
|
@state = :superclass_name if @state == :superclass_marker && token.type == :<
|
|
405
|
+
@state = :recovery_first_symbol if @state == :recovery_colon && token.type == :":"
|
|
217
406
|
string_value(token)
|
|
218
407
|
end
|
|
219
408
|
|
|
@@ -232,7 +421,7 @@ module Ibex
|
|
|
232
421
|
def precedence_expectation(token)
|
|
233
422
|
return @precedence_closer if token&.type == :eof
|
|
234
423
|
|
|
235
|
-
"left or right or nonassoc" if @state == :precedence_association
|
|
424
|
+
"left or right or nonassoc or precedence" if @state == :precedence_association
|
|
236
425
|
end
|
|
237
426
|
|
|
238
427
|
# @rbs (Token token) -> String
|
|
@@ -243,6 +432,7 @@ module Ibex
|
|
|
243
432
|
raise Ibex::Error, "#{token.location}: expected text token"
|
|
244
433
|
end
|
|
245
434
|
end
|
|
435
|
+
# rubocop:enable Metrics/ClassLength, Metrics/CyclomaticComplexity
|
|
246
436
|
end
|
|
247
437
|
end
|
|
248
438
|
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
|
|
@@ -15,6 +15,7 @@ module Ibex
|
|
|
15
15
|
# @rbs @delimiters: DelimiterTracker
|
|
16
16
|
# @rbs @lhs_column: Integer?
|
|
17
17
|
# @rbs @rule_seen: bool?
|
|
18
|
+
# @rbs @node_annotation: bool?
|
|
18
19
|
|
|
19
20
|
# @rbs () -> void
|
|
20
21
|
def initialize
|
|
@@ -28,12 +29,20 @@ module Ibex
|
|
|
28
29
|
def classify(token, remaining, last_external:, previous_external:)
|
|
29
30
|
external = if token.type == :identifier
|
|
30
31
|
classify_identifier(token, remaining, last_external, previous_external)
|
|
32
|
+
elsif token.type == :node
|
|
33
|
+
@node_annotation = true
|
|
34
|
+
:NODE
|
|
35
|
+
elsif token.type == :inline
|
|
36
|
+
classify_inline
|
|
37
|
+
elsif token.type == :empty
|
|
38
|
+
:EMPTY
|
|
31
39
|
elsif SCALAR_TYPES.key?(token.type)
|
|
32
40
|
SCALAR_TYPES.fetch(token.type)
|
|
33
41
|
else
|
|
34
42
|
classify_punctuation(token)
|
|
35
43
|
end
|
|
36
44
|
@delimiters.observe(token, external, last_external)
|
|
45
|
+
@node_annotation = false if token.type == :")" && @node_annotation
|
|
37
46
|
external
|
|
38
47
|
end
|
|
39
48
|
|
|
@@ -60,21 +69,35 @@ module Ibex
|
|
|
60
69
|
|
|
61
70
|
private
|
|
62
71
|
|
|
72
|
+
# @rbs () -> external_token
|
|
73
|
+
def classify_inline
|
|
74
|
+
reset_rule_boundary if @state == :rule_rhs && @delimiters.empty?
|
|
75
|
+
:INLINE
|
|
76
|
+
end
|
|
77
|
+
|
|
63
78
|
# @rbs (Token token, Array[Token] remaining, external_token? last_external,
|
|
64
79
|
# external_token? previous_external) -> external_token
|
|
65
80
|
def classify_identifier(token, remaining, last_external, previous_external)
|
|
81
|
+
return :IDENTIFIER if @node_annotation
|
|
66
82
|
return rule_lhs(token) if @state == :rules_lhs
|
|
67
83
|
return :IDENTIFIER unless @state == :rule_rhs
|
|
68
84
|
return :IDENTIFIER if named_reference_name?(last_external, previous_external)
|
|
69
85
|
|
|
86
|
+
classify_rhs_identifier(token, remaining)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# @rbs (Token token, Array[Token] remaining) -> external_token
|
|
90
|
+
def classify_rhs_identifier(token, remaining)
|
|
70
91
|
value = string_value(token)
|
|
71
|
-
return :IDENTIFIER if value == "end" && @delimiters.open_kind
|
|
92
|
+
return :IDENTIFIER if value == "end" && @delimiters.open_kind
|
|
72
93
|
return finish_rules if value == "end"
|
|
73
94
|
|
|
74
95
|
following = remaining.first
|
|
75
96
|
return :IDENTIFIER unless following
|
|
76
|
-
return start_rule(token) if rule_boundary?(token, following)
|
|
97
|
+
return start_rule(token) if rule_boundary?(token, following) ||
|
|
98
|
+
parameterized_rule_boundary?(token, remaining)
|
|
77
99
|
return separated_terminal(token) if separated_list_call?(token, following)
|
|
100
|
+
return :PARAMETERIZED_REFERENCE if parameterized_call?(token, following)
|
|
78
101
|
|
|
79
102
|
:IDENTIFIER
|
|
80
103
|
end
|
|
@@ -105,6 +128,26 @@ module Ibex
|
|
|
105
128
|
@delimiters.empty? && following.type == :":" && token.location.column <= lhs_column
|
|
106
129
|
end
|
|
107
130
|
|
|
131
|
+
# @rbs (Token token, Array[Token] remaining) -> bool
|
|
132
|
+
def parameterized_rule_boundary?(token, remaining)
|
|
133
|
+
lhs_column = @lhs_column
|
|
134
|
+
opening = remaining.first
|
|
135
|
+
return false unless lhs_column && @delimiters.empty? && token.location.column <= lhs_column
|
|
136
|
+
return false unless opening&.type == :"(" && adjacent?(token, opening)
|
|
137
|
+
|
|
138
|
+
parameter_definition_tail?(remaining.drop(1))
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# @rbs (Array[Token] tail) -> bool
|
|
142
|
+
def parameter_definition_tail?(tail)
|
|
143
|
+
closing = tail.index { |entry| entry.type == :")" }
|
|
144
|
+
return false unless closing && tail[closing + 1]&.type == :":"
|
|
145
|
+
|
|
146
|
+
formals = tail.take(closing)
|
|
147
|
+
!formals.empty? && formals.length.odd? &&
|
|
148
|
+
formals.each_with_index.all? { |entry, index| entry.type == (index.even? ? :identifier : :",") }
|
|
149
|
+
end
|
|
150
|
+
|
|
108
151
|
# @rbs (Token token) -> external_token
|
|
109
152
|
def start_rule(token)
|
|
110
153
|
@rule_seen = true
|
|
@@ -129,6 +172,21 @@ module Ibex
|
|
|
129
172
|
string_value(token) == "separated_list" ? :SEPARATED_LIST : :SEPARATED_NONEMPTY_LIST
|
|
130
173
|
end
|
|
131
174
|
|
|
175
|
+
# @rbs (Token token, Token following) -> bool
|
|
176
|
+
def parameterized_call?(token, following)
|
|
177
|
+
following.type == :"(" && adjacent?(token, following)
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# @rbs (Token left, Token right) -> bool
|
|
181
|
+
def adjacent?(left, right)
|
|
182
|
+
left_span = left.span
|
|
183
|
+
right_span = right.span
|
|
184
|
+
return left_span.end_byte == right_span.start_byte if left_span && right_span
|
|
185
|
+
|
|
186
|
+
left.location.line == right.location.line &&
|
|
187
|
+
left.location.column + string_value(left).length == right.location.column
|
|
188
|
+
end
|
|
189
|
+
|
|
132
190
|
# @rbs (Token token) -> external_token
|
|
133
191
|
def classify_punctuation(token)
|
|
134
192
|
@state = :rule_rhs if @state == :rule_colon && token.type == :":"
|
|
@@ -15,11 +15,11 @@ module Ibex
|
|
|
15
15
|
# @rbs @rules: RuleState?
|
|
16
16
|
# @rbs @last_external: external_token?
|
|
17
17
|
|
|
18
|
-
# @rbs (Array[Token] tokens) -> void
|
|
19
|
-
def initialize(tokens)
|
|
18
|
+
# @rbs (Array[Token] tokens, ?extended: bool) -> void
|
|
19
|
+
def initialize(tokens, extended: false)
|
|
20
20
|
@tokens = tokens
|
|
21
21
|
@index = 0
|
|
22
|
-
@declarations = DeclarationState.new
|
|
22
|
+
@declarations = DeclarationState.new(extended: extended)
|
|
23
23
|
@classifier = @declarations
|
|
24
24
|
end
|
|
25
25
|
|
|
@@ -60,6 +60,11 @@ module Ibex
|
|
|
60
60
|
@declarations.extended_pragma?
|
|
61
61
|
end
|
|
62
62
|
|
|
63
|
+
# @rbs () -> bool
|
|
64
|
+
def cst_pragma?
|
|
65
|
+
@declarations.cst_pragma?
|
|
66
|
+
end
|
|
67
|
+
|
|
63
68
|
# @rbs () -> parser_section
|
|
64
69
|
def section
|
|
65
70
|
rules = @rules
|
data/lib/ibex/frontend.rb
CHANGED
|
@@ -2,18 +2,29 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative "error"
|
|
4
4
|
require_relative "tables"
|
|
5
|
-
|
|
5
|
+
require "ibex/runtime"
|
|
6
|
+
require_relative "frontend/source_span"
|
|
6
7
|
require_relative "frontend/source_cursor"
|
|
8
|
+
require_relative "frontend/source_document"
|
|
9
|
+
require_relative "frontend/diagnostic"
|
|
7
10
|
require_relative "frontend/action_scanner"
|
|
8
11
|
require_relative "frontend/lexer"
|
|
12
|
+
require_relative "frontend/lexer_recovery"
|
|
9
13
|
require_relative "frontend/ast"
|
|
14
|
+
require_relative "frontend/rule_documentation"
|
|
15
|
+
require_relative "frontend/token_adapter/declaration_document_state"
|
|
10
16
|
require_relative "frontend/token_adapter/declaration_state"
|
|
11
17
|
require_relative "frontend/token_adapter/delimiter_tracker"
|
|
12
18
|
require_relative "frontend/token_adapter/rule_state"
|
|
13
19
|
require_relative "frontend/token_adapter"
|
|
14
20
|
require_relative "frontend/generated_parser_base"
|
|
15
21
|
require_relative "frontend/generated_parser"
|
|
22
|
+
require_relative "frontend/diagnostic_recovery"
|
|
16
23
|
require_relative "frontend/parser"
|
|
24
|
+
require_relative "frontend/formatter"
|
|
25
|
+
require_relative "frontend/resolution"
|
|
26
|
+
require_relative "frontend/source_loader"
|
|
27
|
+
require_relative "frontend/resolver"
|
|
17
28
|
require_relative "frontend/dsl"
|
|
18
29
|
|
|
19
30
|
module Ibex
|
|
@@ -23,6 +34,6 @@ module Ibex
|
|
|
23
34
|
# type token_value = String | Integer | user_code_token | nil
|
|
24
35
|
# type external_token = Symbol | String
|
|
25
36
|
# type parser_section = :declarations | :rules | :user_code
|
|
26
|
-
# type delimiter_kind = :group | :separated
|
|
37
|
+
# type delimiter_kind = :group | :separated | :parameter
|
|
27
38
|
end
|
|
28
39
|
end
|