ibex 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +43 -0
  3. data/CHANGELOG.md +30 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +194 -0
  6. data/Rakefile +25 -0
  7. data/Steepfile +10 -0
  8. data/docs/architecture.md +99 -0
  9. data/docs/compat-notes.md +37 -0
  10. data/docs/grammar-reference.md +127 -0
  11. data/docs/lexer-coverage.md +14 -0
  12. data/docs/phase10-extensions.md +27 -0
  13. data/docs/racc-migration.md +47 -0
  14. data/exe/ibex +6 -0
  15. data/gemfiles/Gemfile +7 -0
  16. data/gemfiles/Gemfile.lock +98 -0
  17. data/lib/ibex/analysis/sets.rb +194 -0
  18. data/lib/ibex/analysis.rb +8 -0
  19. data/lib/ibex/cli/counterexample_options.rb +38 -0
  20. data/lib/ibex/cli/outputs.rb +88 -0
  21. data/lib/ibex/cli.rb +333 -0
  22. data/lib/ibex/codegen/dot.rb +52 -0
  23. data/lib/ibex/codegen/html.rb +110 -0
  24. data/lib/ibex/codegen/rbs.rb +54 -0
  25. data/lib/ibex/codegen/report.rb +149 -0
  26. data/lib/ibex/codegen/ruby.rb +235 -0
  27. data/lib/ibex/codegen/symbol_labels.rb +18 -0
  28. data/lib/ibex/error.rb +7 -0
  29. data/lib/ibex/frontend/action_scanner.rb +266 -0
  30. data/lib/ibex/frontend/ast.rb +146 -0
  31. data/lib/ibex/frontend/bootstrap_parser.rb +163 -0
  32. data/lib/ibex/frontend/dsl.rb +196 -0
  33. data/lib/ibex/frontend/generated_parser.rb +434 -0
  34. data/lib/ibex/frontend/generated_parser_base.rb +273 -0
  35. data/lib/ibex/frontend/grammar.y +156 -0
  36. data/lib/ibex/frontend/lexer.rb +165 -0
  37. data/lib/ibex/frontend/parser/declarations.rb +163 -0
  38. data/lib/ibex/frontend/parser/rules.rb +154 -0
  39. data/lib/ibex/frontend/parser.rb +23 -0
  40. data/lib/ibex/frontend/regenerator.rb +41 -0
  41. data/lib/ibex/frontend/source_cursor.rb +94 -0
  42. data/lib/ibex/frontend/token_adapter/declaration_state.rb +248 -0
  43. data/lib/ibex/frontend/token_adapter/delimiter_tracker.rb +37 -0
  44. data/lib/ibex/frontend/token_adapter/rule_state.rb +162 -0
  45. data/lib/ibex/frontend/token_adapter.rb +108 -0
  46. data/lib/ibex/frontend.rb +28 -0
  47. data/lib/ibex/ir/automaton_ir.rb +109 -0
  48. data/lib/ibex/ir/grammar_ir.rb +192 -0
  49. data/lib/ibex/ir/serialize.rb +154 -0
  50. data/lib/ibex/ir.rb +53 -0
  51. data/lib/ibex/lalr/builder.rb +270 -0
  52. data/lib/ibex/lalr/conflict.rb +120 -0
  53. data/lib/ibex/lalr/conflict_search.rb +332 -0
  54. data/lib/ibex/lalr/conflict_search_limits.rb +39 -0
  55. data/lib/ibex/lalr/counterexample.rb +138 -0
  56. data/lib/ibex/lalr/default_reductions.rb +67 -0
  57. data/lib/ibex/lalr.rb +27 -0
  58. data/lib/ibex/normalize/declarations.rb +60 -0
  59. data/lib/ibex/normalize/diagnostics.rb +99 -0
  60. data/lib/ibex/normalize/expander.rb +218 -0
  61. data/lib/ibex/normalize/expression.rb +54 -0
  62. data/lib/ibex/normalize.rb +166 -0
  63. data/lib/ibex/runtime/parser.rb +360 -0
  64. data/lib/ibex/runtime.rb +8 -0
  65. data/lib/ibex/tables.rb +125 -0
  66. data/lib/ibex/version.rb +6 -0
  67. data/lib/ibex.rb +23 -0
  68. data/sig/ibex/analysis/sets.rbs +72 -0
  69. data/sig/ibex/analysis.rbs +6 -0
  70. data/sig/ibex/cli/counterexample_options.rbs +16 -0
  71. data/sig/ibex/cli/outputs.rbs +31 -0
  72. data/sig/ibex/cli.rbs +108 -0
  73. data/sig/ibex/codegen/dot.rbs +19 -0
  74. data/sig/ibex/codegen/html.rbs +35 -0
  75. data/sig/ibex/codegen/rbs.rbs +31 -0
  76. data/sig/ibex/codegen/report.rbs +39 -0
  77. data/sig/ibex/codegen/ruby.rbs +92 -0
  78. data/sig/ibex/codegen/symbol_labels.rbs +11 -0
  79. data/sig/ibex/error.rbs +7 -0
  80. data/sig/ibex/frontend/action_scanner.rbs +74 -0
  81. data/sig/ibex/frontend/ast.rbs +223 -0
  82. data/sig/ibex/frontend/bootstrap_parser.rbs +80 -0
  83. data/sig/ibex/frontend/dsl.rbs +124 -0
  84. data/sig/ibex/frontend/generated_parser.rbs +163 -0
  85. data/sig/ibex/frontend/generated_parser_base.rbs +114 -0
  86. data/sig/ibex/frontend/lexer.rbs +61 -0
  87. data/sig/ibex/frontend/parser/declarations.rbs +56 -0
  88. data/sig/ibex/frontend/parser/rules.rbs +48 -0
  89. data/sig/ibex/frontend/parser.rbs +16 -0
  90. data/sig/ibex/frontend/regenerator.rbs +16 -0
  91. data/sig/ibex/frontend/source_cursor.rbs +73 -0
  92. data/sig/ibex/frontend/token_adapter/declaration_state.rbs +97 -0
  93. data/sig/ibex/frontend/token_adapter/delimiter_tracker.rbs +25 -0
  94. data/sig/ibex/frontend/token_adapter/rule_state.rbs +77 -0
  95. data/sig/ibex/frontend/token_adapter.rbs +67 -0
  96. data/sig/ibex/frontend.rbs +15 -0
  97. data/sig/ibex/ir/automaton_ir.rbs +77 -0
  98. data/sig/ibex/ir/grammar_ir.rbs +143 -0
  99. data/sig/ibex/ir/serialize.rbs +50 -0
  100. data/sig/ibex/ir.rbs +43 -0
  101. data/sig/ibex/lalr/builder.rbs +85 -0
  102. data/sig/ibex/lalr/conflict.rbs +47 -0
  103. data/sig/ibex/lalr/conflict_search.rbs +131 -0
  104. data/sig/ibex/lalr/conflict_search_limits.rbs +29 -0
  105. data/sig/ibex/lalr/counterexample.rbs +53 -0
  106. data/sig/ibex/lalr/default_reductions.rbs +20 -0
  107. data/sig/ibex/lalr.rbs +23 -0
  108. data/sig/ibex/normalize/declarations.rbs +20 -0
  109. data/sig/ibex/normalize/diagnostics.rbs +32 -0
  110. data/sig/ibex/normalize/expander.rbs +66 -0
  111. data/sig/ibex/normalize/expression.rbs +21 -0
  112. data/sig/ibex/normalize.rbs +96 -0
  113. data/sig/ibex/runtime/parser.rbs +167 -0
  114. data/sig/ibex/runtime.rbs +6 -0
  115. data/sig/ibex/tables.rbs +50 -0
  116. data/sig/ibex/version.rbs +6 -0
  117. data/sig/ibex.rbs +6 -0
  118. metadata +161 -0
@@ -0,0 +1,73 @@
1
+ # Generated from lib/ibex/frontend/source_cursor.rb with RBS::Inline
2
+
3
+ module Ibex
4
+ module Frontend
5
+ # A source coordinate retained by frontend and IR objects.
6
+ class Location < Struct[String | Integer]
7
+ attr_accessor file(): String
8
+
9
+ attr_accessor line(): Integer
10
+
11
+ attr_accessor column(): Integer
12
+
13
+ def self.new: (?file: String, ?line: Integer, ?column: Integer) -> instance
14
+ | ({ ?file: String, ?line: Integer, ?column: Integer }) -> instance
15
+ end
16
+
17
+ class Location
18
+ # @rbs () -> IR::location
19
+ def to_h: () -> IR::location
20
+
21
+ # @rbs () -> String
22
+ def to_s: () -> String
23
+ end
24
+
25
+ # A grammar token and its source coordinate.
26
+ class Token < Struct[Symbol | token_value | Location]
27
+ attr_accessor type(): Symbol
28
+
29
+ attr_accessor value(): token_value
30
+
31
+ attr_accessor location(): Location
32
+
33
+ def self.new: (?type: Symbol, ?value: token_value, ?location: Location) -> instance
34
+ | ({ ?type: Symbol, ?value: token_value, ?location: Location }) -> instance
35
+ end
36
+
37
+ class Token
38
+ # @rbs () -> Hash[Symbol, untyped]
39
+ def to_h: () -> Hash[Symbol, untyped]
40
+ end
41
+
42
+ # Advances through source text while maintaining one-based coordinates.
43
+ class SourceCursor
44
+ attr_reader source: String
45
+
46
+ attr_reader file: String
47
+
48
+ attr_reader index: Integer
49
+
50
+ attr_reader line: Integer
51
+
52
+ attr_reader column: Integer
53
+
54
+ # @rbs (String source, String file) -> void
55
+ def initialize: (String source, String file) -> void
56
+
57
+ # @rbs () -> bool
58
+ def eof?: () -> bool
59
+
60
+ # @rbs (?Integer offset) -> String?
61
+ def peek: (?Integer offset) -> String?
62
+
63
+ # @rbs () -> String
64
+ def rest: () -> String
65
+
66
+ # @rbs () -> Location
67
+ def location: () -> Location
68
+
69
+ # @rbs (?Integer count) -> void
70
+ def advance: (?Integer count) -> void
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,97 @@
1
+ # Generated from lib/ibex/frontend/token_adapter/declaration_state.rb with RBS::Inline
2
+
3
+ module Ibex
4
+ module Frontend
5
+ class TokenAdapter
6
+ # Classifies tokens through the class header and declaration section.
7
+ class DeclarationState
8
+ DECLARATIONS: Hash[String, [ external_token, Symbol ]]
9
+
10
+ ASSOCIATIONS: Hash[String, external_token]
11
+
12
+ SCALAR_TYPES: Hash[Symbol, external_token]
13
+
14
+ EXPECTATIONS: Hash[Symbol, String]
15
+
16
+ attr_reader conversion_name: Token?
17
+
18
+ attr_reader declaration: Symbol?
19
+
20
+ attr_reader precedence_closer: String?
21
+
22
+ attr_reader state: Symbol
23
+
24
+ # @rbs () -> void
25
+ def initialize: () -> void
26
+
27
+ # @rbs (Token token, Array[Token] remaining) -> external_token
28
+ def classify: (Token token, Array[Token] remaining) -> external_token
29
+
30
+ # @rbs () -> bool
31
+ def rules?: () -> bool
32
+
33
+ # @rbs () -> bool
34
+ def extended_pragma?: () -> bool
35
+
36
+ # @rbs (Token? token) -> String?
37
+ def expectation: (Token? token) -> String?
38
+
39
+ private
40
+
41
+ # @rbs (Token token, Array[Token] remaining) -> external_token
42
+ def classify_identifier: (Token token, Array[Token] remaining) -> external_token
43
+
44
+ # @rbs (Token token) -> external_token
45
+ def class_keyword: (Token token) -> external_token
46
+
47
+ # @rbs (Array[Token] remaining) -> external_token
48
+ def constant_name: (Array[Token] remaining) -> external_token
49
+
50
+ # @rbs (Token token) -> external_token
51
+ def begin_declaration: (Token token) -> external_token
52
+
53
+ # @rbs (Token token) -> external_token
54
+ def finish_pragma: (Token token) -> external_token
55
+
56
+ # @rbs (Token token) -> external_token
57
+ def begin_precedence: (Token token) -> external_token
58
+
59
+ # @rbs (Token token) -> external_token
60
+ def declaration_symbol: (Token token) -> external_token
61
+
62
+ # @rbs (String value) -> bool
63
+ def declaration_boundary?: (String value) -> bool
64
+
65
+ # @rbs (Token token) -> external_token
66
+ def precedence_identifier: (Token token) -> external_token
67
+
68
+ # @rbs (Token token) -> external_token
69
+ def finish_precedence: (Token token) -> external_token
70
+
71
+ # @rbs (Token token, external_token type, Array[Token] remaining) -> external_token
72
+ def begin_conversion: (Token token, external_token type, Array[Token] remaining) -> external_token
73
+
74
+ # @rbs (Token token, Array[Token] remaining) -> external_token
75
+ def classify_scalar: (Token token, Array[Token] remaining) -> external_token
76
+
77
+ # @rbs (external_token type) -> external_token
78
+ def finish_single_symbol: (external_token type) -> external_token
79
+
80
+ # @rbs (external_token type) -> external_token
81
+ def finish_conversion: (external_token type) -> external_token
82
+
83
+ # @rbs (Token token) -> external_token
84
+ def classify_punctuation: (Token token) -> external_token
85
+
86
+ # @rbs (Token name, Array[Token] remaining) -> void
87
+ def validate_conversion_line: (Token name, Array[Token] remaining) -> void
88
+
89
+ # @rbs (Token? token) -> String?
90
+ def precedence_expectation: (Token? token) -> String?
91
+
92
+ # @rbs (Token token) -> String
93
+ def string_value: (Token token) -> String
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,25 @@
1
+ # Generated from lib/ibex/frontend/token_adapter/delimiter_tracker.rb with RBS::Inline
2
+
3
+ module Ibex
4
+ module Frontend
5
+ class TokenAdapter
6
+ # Tracks ordinary EBNF groups separately from separated-list calls.
7
+ class DelimiterTracker
8
+ attr_reader group_opening: Token?
9
+
10
+ attr_reader open_kind: delimiter_kind?
11
+
12
+ @stack: Array[[ delimiter_kind, Token ]]
13
+
14
+ # @rbs () -> void
15
+ def initialize: () -> void
16
+
17
+ # @rbs () -> bool
18
+ def empty?: () -> bool
19
+
20
+ # @rbs (Token token, external_token external, external_token? previous_external) -> void
21
+ def observe: (Token token, external_token external, external_token? previous_external) -> void
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,77 @@
1
+ # Generated from lib/ibex/frontend/token_adapter/rule_state.rb with RBS::Inline
2
+
3
+ module Ibex
4
+ module Frontend
5
+ class TokenAdapter
6
+ # Classifies context-dependent tokens in the grammar rule section.
7
+ class RuleState
8
+ SCALAR_TYPES: Hash[Symbol, external_token]
9
+
10
+ attr_reader section: parser_section
11
+
12
+ attr_reader state: Symbol
13
+
14
+ @rule_seen: bool?
15
+
16
+ @lhs_column: Integer?
17
+
18
+ @delimiters: DelimiterTracker
19
+
20
+ # @rbs () -> void
21
+ def initialize: () -> void
22
+
23
+ # @rbs (Token token, Array[Token] remaining, last_external: external_token?,
24
+ # previous_external: external_token?) -> external_token
25
+ def classify: (Token token, Array[Token] remaining, last_external: external_token?, previous_external: external_token?) -> external_token
26
+
27
+ # @rbs () -> Token?
28
+ def group_opening: () -> Token?
29
+
30
+ # @rbs () -> delimiter_kind?
31
+ def open_delimiter_kind: () -> delimiter_kind?
32
+
33
+ # @rbs (Token? token) -> String?
34
+ def expectation: (Token? token) -> String?
35
+
36
+ private
37
+
38
+ # @rbs (Token token, Array[Token] remaining, external_token? last_external,
39
+ # external_token? previous_external) -> external_token
40
+ def classify_identifier: (Token token, Array[Token] remaining, external_token? last_external, external_token? previous_external) -> external_token
41
+
42
+ # @rbs (Token token) -> external_token
43
+ def rule_lhs: (Token token) -> external_token
44
+
45
+ # @rbs (external_token? last_external, external_token? previous_external) -> bool
46
+ def named_reference_name?: (external_token? last_external, external_token? previous_external) -> bool
47
+
48
+ # @rbs (Token token, Token following) -> bool
49
+ def rule_boundary?: (Token token, Token following) -> bool
50
+
51
+ # @rbs (Token token) -> external_token
52
+ def start_rule: (Token token) -> external_token
53
+
54
+ # @rbs () -> external_token
55
+ def finish_rules: () -> external_token
56
+
57
+ # @rbs (Token token, Token following) -> bool
58
+ def separated_list_call?: (Token token, Token following) -> bool
59
+
60
+ # @rbs (Token token) -> external_token
61
+ def separated_terminal: (Token token) -> external_token
62
+
63
+ # @rbs (Token token) -> external_token
64
+ def classify_punctuation: (Token token) -> external_token
65
+
66
+ # @rbs () -> void
67
+ def reset_rule_boundary: () -> void
68
+
69
+ # @rbs (Token? token) -> String
70
+ def rules_lhs_expectation: (Token? token) -> String
71
+
72
+ # @rbs (Token token) -> String
73
+ def string_value: (Token token) -> String
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,67 @@
1
+ # Generated from lib/ibex/frontend/token_adapter.rb with RBS::Inline
2
+
3
+ module Ibex
4
+ module Frontend
5
+ # Delivers lexer tokens through declaration and rule context classifiers.
6
+ class TokenAdapter
7
+ attr_reader eof_token: Token?
8
+
9
+ attr_reader last_token: Token?
10
+
11
+ attr_reader previous_external: external_token?
12
+
13
+ @last_external: external_token?
14
+
15
+ @rules: RuleState?
16
+
17
+ @classifier: DeclarationState | RuleState
18
+
19
+ @declarations: DeclarationState
20
+
21
+ @index: Integer
22
+
23
+ @tokens: Array[Token]
24
+
25
+ # @rbs (Array[Token] tokens) -> void
26
+ def initialize: (Array[Token] tokens) -> void
27
+
28
+ # @rbs () -> ([external_token, Token] | false)
29
+ def next_token: () -> ([ external_token, Token ] | false)
30
+
31
+ # @rbs () -> Token?
32
+ def conversion_name: () -> Token?
33
+
34
+ # @rbs () -> Symbol?
35
+ def declaration: () -> Symbol?
36
+
37
+ # @rbs () -> String?
38
+ def precedence_closer: () -> String?
39
+
40
+ # @rbs () -> bool
41
+ def extended_pragma?: () -> bool
42
+
43
+ # @rbs () -> parser_section
44
+ def section: () -> parser_section
45
+
46
+ # @rbs () -> Symbol
47
+ def state: () -> Symbol
48
+
49
+ # @rbs () -> Token?
50
+ def group_opening: () -> Token?
51
+
52
+ # @rbs () -> delimiter_kind?
53
+ def open_delimiter_kind: () -> delimiter_kind?
54
+
55
+ # @rbs (Token? token) -> String?
56
+ def expectation: (Token? token) -> String?
57
+
58
+ private
59
+
60
+ # @rbs (Token token) -> external_token
61
+ def classify: (Token token) -> external_token
62
+
63
+ # @rbs () -> void
64
+ def enter_rules: () -> void
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,15 @@
1
+ # Generated from lib/ibex/frontend.rb with RBS::Inline
2
+
3
+ module Ibex
4
+ module Frontend
5
+ type user_code_token = { name: String, code: String }
6
+
7
+ type token_value = String | Integer | user_code_token | nil
8
+
9
+ type external_token = Symbol | String
10
+
11
+ type parser_section = :declarations | :rules | :user_code
12
+
13
+ type delimiter_kind = :group | :separated
14
+ end
15
+ end
@@ -0,0 +1,77 @@
1
+ # Generated from lib/ibex/ir/automaton_ir.rb with RBS::Inline
2
+
3
+ module Ibex
4
+ module IR
5
+ # A merged LALR item with its lookahead token ids.
6
+ class AutomatonItem
7
+ attr_reader production: Integer
8
+
9
+ attr_reader dot: Integer
10
+
11
+ attr_reader lookaheads: Array[Integer]
12
+
13
+ # @rbs (production: Integer, dot: Integer, lookaheads: Array[Integer]) -> void
14
+ def initialize: (production: Integer, dot: Integer, lookaheads: Array[Integer]) -> void
15
+
16
+ # @rbs (Grammar grammar) -> Hash[Symbol, untyped]
17
+ def to_h: (Grammar grammar) -> Hash[Symbol, untyped]
18
+ end
19
+
20
+ # A deterministic LALR automaton state.
21
+ class AutomatonState
22
+ attr_reader id: Integer
23
+
24
+ attr_reader items: Array[AutomatonItem]
25
+
26
+ attr_reader transitions: Hash[Integer, Integer]
27
+
28
+ attr_reader actions: Hash[Integer, parser_action]
29
+
30
+ attr_reader gotos: Hash[Integer, Integer]
31
+
32
+ attr_reader default_action: parser_action?
33
+
34
+ attr_reader conflicts: Array[conflict]
35
+
36
+ # @rbs (id: Integer, items: Array[AutomatonItem], transitions: Hash[Integer, Integer],
37
+ # actions: Hash[Integer, parser_action], gotos: Hash[Integer, Integer], ?default_action: parser_action?,
38
+ # ?conflicts: Array[conflict]) -> void
39
+ def initialize: (id: Integer, items: Array[AutomatonItem], transitions: Hash[Integer, Integer], actions: Hash[Integer, parser_action], gotos: Hash[Integer, Integer], ?default_action: parser_action?, ?conflicts: Array[conflict]) -> void
40
+
41
+ # @rbs (Grammar grammar) -> Hash[Symbol, untyped]
42
+ def to_h: (Grammar grammar) -> Hash[Symbol, untyped]
43
+
44
+ private
45
+
46
+ # @rbs (Hash[Integer, untyped] values, Grammar grammar) -> Hash[String, untyped]
47
+ def named_keys: (Hash[Integer, untyped] values, Grammar grammar) -> Hash[String, untyped]
48
+ end
49
+
50
+ # Immutable LALR automaton and its source grammar.
51
+ class Automaton
52
+ attr_reader algorithm: String
53
+
54
+ attr_reader grammar_digest: String
55
+
56
+ attr_reader grammar: Grammar
57
+
58
+ attr_reader states: Array[AutomatonState]
59
+
60
+ attr_reader conflict_summary: conflict_summary
61
+
62
+ attr_reader schema_version: Integer
63
+
64
+ # @rbs (grammar: Grammar, states: Array[AutomatonState], conflict_summary: conflict_summary,
65
+ # ?algorithm: String, ?grammar_digest: String?, ?schema_version: Integer) -> void
66
+ def initialize: (grammar: Grammar, states: Array[AutomatonState], conflict_summary: conflict_summary, ?algorithm: String, ?grammar_digest: String?, ?schema_version: Integer) -> void
67
+
68
+ # @rbs () -> Hash[Symbol, untyped]
69
+ def to_h: () -> Hash[Symbol, untyped]
70
+
71
+ private
72
+
73
+ # @rbs (Grammar grammar) -> String
74
+ def digest_for: (Grammar grammar) -> String
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,143 @@
1
+ # Generated from lib/ibex/ir/grammar_ir.rb with RBS::Inline
2
+
3
+ module Ibex
4
+ module IR
5
+ SCHEMA_VERSION: ::Integer
6
+
7
+ # @rbs (untyped value) -> untyped
8
+ def self?.deep_freeze: (untyped value) -> untyped
9
+
10
+ # An interned terminal or nonterminal.
11
+ class GrammarSymbol
12
+ attr_reader id: Integer
13
+
14
+ attr_reader name: String
15
+
16
+ attr_reader kind: Symbol
17
+
18
+ attr_reader reserved: bool
19
+
20
+ attr_reader precedence: precedence?
21
+
22
+ attr_reader location: location?
23
+
24
+ # @rbs (id: Integer, name: String, kind: Symbol, ?reserved: bool, ?precedence: precedence?,
25
+ # ?location: location?) -> void
26
+ def initialize: (id: Integer, name: String, kind: Symbol, ?reserved: bool, ?precedence: precedence?, ?location: location?) -> void
27
+
28
+ # @rbs () -> bool
29
+ def terminal?: () -> bool
30
+
31
+ # @rbs () -> bool
32
+ def nonterminal?: () -> bool
33
+
34
+ # @rbs () -> Hash[Symbol, untyped]
35
+ def to_h: () -> Hash[Symbol, untyped]
36
+ end
37
+
38
+ # Opaque Ruby semantic action metadata.
39
+ class Action
40
+ attr_reader code: String
41
+
42
+ attr_reader location: location
43
+
44
+ attr_reader named_refs: Array[named_ref]
45
+
46
+ attr_reader context_length: Integer
47
+
48
+ # @rbs (code: String, location: location, ?named_refs: Array[named_ref], ?context_length: Integer) -> void
49
+ def initialize: (code: String, location: location, ?named_refs: Array[named_ref], ?context_length: Integer) -> void
50
+
51
+ # @rbs () -> Hash[Symbol, untyped]
52
+ def to_h: () -> Hash[Symbol, untyped]
53
+ end
54
+
55
+ # A normalized BNF production using symbol ids.
56
+ class Production
57
+ attr_reader id: Integer
58
+
59
+ attr_reader lhs: Integer
60
+
61
+ attr_reader rhs: Array[Integer]
62
+
63
+ attr_reader action: Action?
64
+
65
+ attr_reader precedence_override: Integer?
66
+
67
+ attr_reader origin: Hash[Symbol, untyped]
68
+
69
+ # @rbs (id: Integer, lhs: Integer, rhs: Array[Integer], action: Action?, precedence_override: Integer?,
70
+ # origin: Hash[Symbol, untyped]) -> void
71
+ def initialize: (id: Integer, lhs: Integer, rhs: Array[Integer], action: Action?, precedence_override: Integer?, origin: Hash[Symbol, untyped]) -> void
72
+
73
+ # @rbs () -> Hash[Symbol, untyped]
74
+ def to_h: () -> Hash[Symbol, untyped]
75
+ end
76
+
77
+ # One opaque user-code block and the location of its first code line.
78
+ class UserCodeChunk
79
+ attr_reader code: String
80
+
81
+ attr_reader location: location
82
+
83
+ # @rbs (code: String, location: location) -> void
84
+ def initialize: (code: String, location: location) -> void
85
+
86
+ # @rbs () -> Hash[Symbol, untyped]
87
+ def to_h: () -> Hash[Symbol, untyped]
88
+ end
89
+
90
+ # Immutable normalized grammar exchanged between pipeline stages.
91
+ class Grammar
92
+ attr_reader class_name: String
93
+
94
+ attr_reader superclass: String?
95
+
96
+ attr_reader start: String
97
+
98
+ attr_reader expect: Integer
99
+
100
+ attr_reader options: grammar_options
101
+
102
+ attr_reader symbols: Array[GrammarSymbol]
103
+
104
+ attr_reader productions: Array[Production]
105
+
106
+ attr_reader user_code: Hash[String, String]
107
+
108
+ attr_reader user_code_chunks: user_code_chunks
109
+
110
+ attr_reader conversions: Hash[String, String]
111
+
112
+ attr_reader warnings: Array[grammar_warning]
113
+
114
+ attr_reader schema_version: Integer
115
+
116
+ # @rbs (class_name: String, superclass: String?, start: String, expect: Integer, options: grammar_options,
117
+ # symbols: Array[GrammarSymbol], productions: Array[Production], user_code: Hash[String, String],
118
+ # conversions: Hash[String, String], warnings: Array[grammar_warning], ?user_code_chunks: user_code_chunks?,
119
+ # ?schema_version: Integer) -> void
120
+ def initialize: (class_name: String, superclass: String?, start: String, expect: Integer, options: grammar_options, symbols: Array[GrammarSymbol], productions: Array[Production], user_code: Hash[String, String], conversions: Hash[String, String], warnings: Array[grammar_warning], ?user_code_chunks: user_code_chunks?, ?schema_version: Integer) -> void
121
+
122
+ # @rbs (String name) -> GrammarSymbol?
123
+ def symbol: (String name) -> GrammarSymbol?
124
+
125
+ # @rbs (Integer? id) -> GrammarSymbol?
126
+ def symbol_by_id: (Integer? id) -> GrammarSymbol?
127
+
128
+ # @rbs () -> Array[GrammarSymbol]
129
+ def terminals: () -> Array[GrammarSymbol]
130
+
131
+ # @rbs () -> Array[GrammarSymbol]
132
+ def nonterminals: () -> Array[GrammarSymbol]
133
+
134
+ # @rbs () -> Hash[Symbol, untyped]
135
+ def to_h: () -> Hash[Symbol, untyped]
136
+
137
+ private
138
+
139
+ # @rbs () -> void
140
+ def validate_user_code_chunks: () -> void
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,50 @@
1
+ # Generated from lib/ibex/ir/serialize.rb with RBS::Inline
2
+
3
+ module Ibex
4
+ module IR
5
+ # Stable JSON serialization for versioned pipeline IR.
6
+ module Serialize
7
+ private def validate_version: (untyped data) -> untyped
8
+
9
+ private def self.validate_version: (untyped data) -> untyped
10
+
11
+ private def load_grammar: (untyped data) -> untyped
12
+
13
+ private def self.load_grammar: (untyped data) -> untyped
14
+
15
+ private def load_automaton: (untyped data) -> untyped
16
+
17
+ private def self.load_automaton: (untyped data) -> untyped
18
+
19
+ private def load_state: (untyped state, untyped grammar) -> untyped
20
+
21
+ private def self.load_state: (untyped state, untyped grammar) -> untyped
22
+
23
+ private def symbol_keyed: (untyped values, untyped grammar, ?actions: untyped) -> untyped
24
+
25
+ private def self.symbol_keyed: (untyped values, untyped grammar, ?actions: untyped) -> untyped
26
+
27
+ private def normalize_action: (untyped value) -> untyped
28
+
29
+ private def self.normalize_action: (untyped value) -> untyped
30
+
31
+ private def load_production: (untyped production) -> untyped
32
+
33
+ private def self.load_production: (untyped production) -> untyped
34
+
35
+ private def load_user_code_chunks: (untyped chunks) -> untyped
36
+
37
+ private def self.load_user_code_chunks: (untyped chunks) -> untyped
38
+
39
+ private def symbolize: (untyped value) -> untyped
40
+
41
+ private def self.symbolize: (untyped value) -> untyped
42
+
43
+ # @rbs (Grammar | Automaton value) -> String
44
+ def self?.dump: (Grammar | Automaton value) -> String
45
+
46
+ # @rbs (String source) -> (Grammar | Automaton)
47
+ def self?.load: (String source) -> (Grammar | Automaton)
48
+ end
49
+ end
50
+ end
data/sig/ibex/ir.rbs ADDED
@@ -0,0 +1,43 @@
1
+ # Generated from lib/ibex/ir.rb with RBS::Inline
2
+
3
+ module Ibex
4
+ module IR
5
+ type location = { file: String, line: Integer, column: Integer }
6
+
7
+ type precedence = { associativity: Symbol, level: Integer }
8
+
9
+ type named_ref = { name: String, index: Integer }
10
+
11
+ type user_code_chunks = Hash[String, Array[UserCodeChunk]]
12
+
13
+ type grammar_options = { result_var: bool, omit_action_call: bool }
14
+
15
+ type grammar_warning = { type: Symbol, ?symbol: String, ?production: Integer, ?original: Integer, loc: location? }
16
+
17
+ type shift_action = { type: :shift, state: Integer }
18
+
19
+ type reduce_action = { type: :reduce, production: Integer }
20
+
21
+ type accept_action = { type: :accept }
22
+
23
+ type error_action = { type: :error }
24
+
25
+ type parser_action = shift_action | reduce_action | accept_action | error_action
26
+
27
+ type runtime_action = [ :shift, Integer ] | [ :reduce, Integer ] | [ :accept ] | [ :error ]
28
+
29
+ type conflict_resolution = { by: Symbol, chose: Symbol | Integer, ?associativity: Symbol }
30
+
31
+ type shift_reduce_conflict = { type: :shift_reduce, symbol: String, shift_to: Integer, reduce: Integer, resolution: conflict_resolution }
32
+
33
+ type reduce_reduce_conflict = { type: :reduce_reduce, symbol: String, reductions: Array[Integer], resolution: conflict_resolution }
34
+
35
+ type conflict = shift_reduce_conflict | reduce_reduce_conflict
36
+
37
+ type conflict_summary = { sr: Integer, resolved_sr: Integer, rr: Integer, expected_sr: Integer, expectation_met: bool }
38
+
39
+ type interpretation = Hash[Symbol, untyped]
40
+
41
+ type counterexample = { state: Integer, type: Symbol, symbol_path: Array[String], sentence: Array[String], lookahead_index: Integer, unifying: bool, interpretations: Array[interpretation] }
42
+ end
43
+ end