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.
- checksums.yaml +7 -0
- data/.rubocop.yml +43 -0
- data/CHANGELOG.md +30 -0
- data/LICENSE.txt +21 -0
- data/README.md +194 -0
- data/Rakefile +25 -0
- data/Steepfile +10 -0
- data/docs/architecture.md +99 -0
- data/docs/compat-notes.md +37 -0
- data/docs/grammar-reference.md +127 -0
- data/docs/lexer-coverage.md +14 -0
- data/docs/phase10-extensions.md +27 -0
- data/docs/racc-migration.md +47 -0
- data/exe/ibex +6 -0
- data/gemfiles/Gemfile +7 -0
- data/gemfiles/Gemfile.lock +98 -0
- data/lib/ibex/analysis/sets.rb +194 -0
- data/lib/ibex/analysis.rb +8 -0
- data/lib/ibex/cli/counterexample_options.rb +38 -0
- data/lib/ibex/cli/outputs.rb +88 -0
- data/lib/ibex/cli.rb +333 -0
- data/lib/ibex/codegen/dot.rb +52 -0
- data/lib/ibex/codegen/html.rb +110 -0
- data/lib/ibex/codegen/rbs.rb +54 -0
- data/lib/ibex/codegen/report.rb +149 -0
- data/lib/ibex/codegen/ruby.rb +235 -0
- data/lib/ibex/codegen/symbol_labels.rb +18 -0
- data/lib/ibex/error.rb +7 -0
- data/lib/ibex/frontend/action_scanner.rb +266 -0
- data/lib/ibex/frontend/ast.rb +146 -0
- data/lib/ibex/frontend/bootstrap_parser.rb +163 -0
- data/lib/ibex/frontend/dsl.rb +196 -0
- data/lib/ibex/frontend/generated_parser.rb +434 -0
- data/lib/ibex/frontend/generated_parser_base.rb +273 -0
- data/lib/ibex/frontend/grammar.y +156 -0
- data/lib/ibex/frontend/lexer.rb +165 -0
- data/lib/ibex/frontend/parser/declarations.rb +163 -0
- data/lib/ibex/frontend/parser/rules.rb +154 -0
- data/lib/ibex/frontend/parser.rb +23 -0
- data/lib/ibex/frontend/regenerator.rb +41 -0
- data/lib/ibex/frontend/source_cursor.rb +94 -0
- data/lib/ibex/frontend/token_adapter/declaration_state.rb +248 -0
- data/lib/ibex/frontend/token_adapter/delimiter_tracker.rb +37 -0
- data/lib/ibex/frontend/token_adapter/rule_state.rb +162 -0
- data/lib/ibex/frontend/token_adapter.rb +108 -0
- data/lib/ibex/frontend.rb +28 -0
- data/lib/ibex/ir/automaton_ir.rb +109 -0
- data/lib/ibex/ir/grammar_ir.rb +192 -0
- data/lib/ibex/ir/serialize.rb +154 -0
- data/lib/ibex/ir.rb +53 -0
- data/lib/ibex/lalr/builder.rb +270 -0
- data/lib/ibex/lalr/conflict.rb +120 -0
- data/lib/ibex/lalr/conflict_search.rb +332 -0
- data/lib/ibex/lalr/conflict_search_limits.rb +39 -0
- data/lib/ibex/lalr/counterexample.rb +138 -0
- data/lib/ibex/lalr/default_reductions.rb +67 -0
- data/lib/ibex/lalr.rb +27 -0
- data/lib/ibex/normalize/declarations.rb +60 -0
- data/lib/ibex/normalize/diagnostics.rb +99 -0
- data/lib/ibex/normalize/expander.rb +218 -0
- data/lib/ibex/normalize/expression.rb +54 -0
- data/lib/ibex/normalize.rb +166 -0
- data/lib/ibex/runtime/parser.rb +360 -0
- data/lib/ibex/runtime.rb +8 -0
- data/lib/ibex/tables.rb +125 -0
- data/lib/ibex/version.rb +6 -0
- data/lib/ibex.rb +23 -0
- data/sig/ibex/analysis/sets.rbs +72 -0
- data/sig/ibex/analysis.rbs +6 -0
- data/sig/ibex/cli/counterexample_options.rbs +16 -0
- data/sig/ibex/cli/outputs.rbs +31 -0
- data/sig/ibex/cli.rbs +108 -0
- data/sig/ibex/codegen/dot.rbs +19 -0
- data/sig/ibex/codegen/html.rbs +35 -0
- data/sig/ibex/codegen/rbs.rbs +31 -0
- data/sig/ibex/codegen/report.rbs +39 -0
- data/sig/ibex/codegen/ruby.rbs +92 -0
- data/sig/ibex/codegen/symbol_labels.rbs +11 -0
- data/sig/ibex/error.rbs +7 -0
- data/sig/ibex/frontend/action_scanner.rbs +74 -0
- data/sig/ibex/frontend/ast.rbs +223 -0
- data/sig/ibex/frontend/bootstrap_parser.rbs +80 -0
- data/sig/ibex/frontend/dsl.rbs +124 -0
- data/sig/ibex/frontend/generated_parser.rbs +163 -0
- data/sig/ibex/frontend/generated_parser_base.rbs +114 -0
- data/sig/ibex/frontend/lexer.rbs +61 -0
- data/sig/ibex/frontend/parser/declarations.rbs +56 -0
- data/sig/ibex/frontend/parser/rules.rbs +48 -0
- data/sig/ibex/frontend/parser.rbs +16 -0
- data/sig/ibex/frontend/regenerator.rbs +16 -0
- data/sig/ibex/frontend/source_cursor.rbs +73 -0
- data/sig/ibex/frontend/token_adapter/declaration_state.rbs +97 -0
- data/sig/ibex/frontend/token_adapter/delimiter_tracker.rbs +25 -0
- data/sig/ibex/frontend/token_adapter/rule_state.rbs +77 -0
- data/sig/ibex/frontend/token_adapter.rbs +67 -0
- data/sig/ibex/frontend.rbs +15 -0
- data/sig/ibex/ir/automaton_ir.rbs +77 -0
- data/sig/ibex/ir/grammar_ir.rbs +143 -0
- data/sig/ibex/ir/serialize.rbs +50 -0
- data/sig/ibex/ir.rbs +43 -0
- data/sig/ibex/lalr/builder.rbs +85 -0
- data/sig/ibex/lalr/conflict.rbs +47 -0
- data/sig/ibex/lalr/conflict_search.rbs +131 -0
- data/sig/ibex/lalr/conflict_search_limits.rbs +29 -0
- data/sig/ibex/lalr/counterexample.rbs +53 -0
- data/sig/ibex/lalr/default_reductions.rbs +20 -0
- data/sig/ibex/lalr.rbs +23 -0
- data/sig/ibex/normalize/declarations.rbs +20 -0
- data/sig/ibex/normalize/diagnostics.rbs +32 -0
- data/sig/ibex/normalize/expander.rbs +66 -0
- data/sig/ibex/normalize/expression.rbs +21 -0
- data/sig/ibex/normalize.rbs +96 -0
- data/sig/ibex/runtime/parser.rbs +167 -0
- data/sig/ibex/runtime.rbs +6 -0
- data/sig/ibex/tables.rbs +50 -0
- data/sig/ibex/version.rbs +6 -0
- data/sig/ibex.rbs +6 -0
- 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
|