lrama 0.7.0 → 0.7.1
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/.gitattributes +2 -0
- data/.github/workflows/codespell.yaml +1 -1
- data/.github/workflows/gh-pages.yml +5 -6
- data/.github/workflows/test.yaml +25 -14
- data/Gemfile +4 -3
- data/NEWS.md +370 -35
- data/README.md +7 -88
- data/Rakefile +3 -2
- data/Steepfile +11 -5
- data/doc/Index.md +1 -1
- data/doc/development/compressed_state_table/parser.rb +2 -0
- data/doc/development/profiling.md +44 -0
- data/exe/lrama +1 -1
- data/lib/lrama/bitmap.rb +18 -5
- data/lib/lrama/command.rb +95 -43
- data/lib/lrama/context.rb +22 -24
- data/lib/lrama/counterexamples/derivation.rb +14 -4
- data/lib/lrama/counterexamples/example.rb +47 -22
- data/lib/lrama/counterexamples/node.rb +30 -0
- data/lib/lrama/counterexamples/path.rb +12 -14
- data/lib/lrama/counterexamples/state_item.rb +24 -1
- data/lib/lrama/counterexamples/triple.rb +27 -9
- data/lib/lrama/counterexamples.rb +216 -88
- data/lib/lrama/diagram.rb +77 -0
- data/lib/lrama/digraph.rb +28 -7
- data/lib/lrama/erb.rb +29 -0
- data/lib/lrama/grammar/auxiliary.rb +6 -1
- data/lib/lrama/grammar/binding.rb +37 -25
- data/lib/lrama/grammar/code/destructor_code.rb +11 -0
- data/lib/lrama/grammar/code/initial_action_code.rb +3 -0
- data/lib/lrama/grammar/code/no_reference_code.rb +3 -0
- data/lib/lrama/grammar/code/printer_code.rb +11 -0
- data/lib/lrama/grammar/code/rule_action.rb +17 -0
- data/lib/lrama/grammar/code.rb +16 -1
- data/lib/lrama/grammar/counter.rb +10 -0
- data/lib/lrama/grammar/destructor.rb +14 -1
- data/lib/lrama/grammar/error_token.rb +14 -1
- data/lib/lrama/grammar/inline/resolver.rb +80 -0
- data/lib/lrama/grammar/inline.rb +3 -0
- data/lib/lrama/grammar/{parameterizing_rule → parameterized}/resolver.rb +19 -8
- data/lib/lrama/grammar/{parameterizing_rule → parameterized}/rhs.rb +7 -2
- data/lib/lrama/grammar/parameterized/rule.rb +36 -0
- data/lib/lrama/grammar/parameterized.rb +5 -0
- data/lib/lrama/grammar/percent_code.rb +12 -1
- data/lib/lrama/grammar/precedence.rb +43 -1
- data/lib/lrama/grammar/printer.rb +9 -0
- data/lib/lrama/grammar/reference.rb +13 -0
- data/lib/lrama/grammar/rule.rb +61 -1
- data/lib/lrama/grammar/rule_builder.rb +84 -69
- data/lib/lrama/grammar/stdlib.y +68 -48
- data/lib/lrama/grammar/symbol.rb +63 -19
- data/lib/lrama/grammar/symbols/resolver.rb +64 -3
- data/lib/lrama/grammar/type.rb +13 -1
- data/lib/lrama/grammar/union.rb +12 -1
- data/lib/lrama/grammar.rb +231 -35
- data/lib/lrama/lexer/location.rb +25 -8
- data/lib/lrama/lexer/token/base.rb +73 -0
- data/lib/lrama/lexer/token/char.rb +15 -2
- data/lib/lrama/lexer/token/empty.rb +14 -0
- data/lib/lrama/lexer/token/ident.rb +2 -2
- data/lib/lrama/lexer/token/instantiate_rule.rb +4 -4
- data/lib/lrama/lexer/token/int.rb +14 -0
- data/lib/lrama/lexer/token/str.rb +11 -0
- data/lib/lrama/lexer/token/tag.rb +2 -2
- data/lib/lrama/lexer/token/token.rb +11 -0
- data/lib/lrama/lexer/token/user_code.rb +63 -37
- data/lib/lrama/lexer/token.rb +6 -56
- data/lib/lrama/lexer.rb +51 -23
- data/lib/lrama/logger.rb +12 -2
- data/lib/lrama/option_parser.rb +63 -9
- data/lib/lrama/options.rb +25 -7
- data/lib/lrama/output.rb +4 -11
- data/lib/lrama/parser.rb +854 -723
- data/lib/lrama/reporter/conflicts.rb +44 -0
- data/lib/lrama/reporter/grammar.rb +39 -0
- data/lib/lrama/reporter/precedences.rb +54 -0
- data/lib/lrama/reporter/profile/call_stack.rb +45 -0
- data/lib/lrama/reporter/profile/memory.rb +44 -0
- data/lib/lrama/reporter/profile.rb +4 -0
- data/lib/lrama/reporter/rules.rb +43 -0
- data/lib/lrama/reporter/states.rb +387 -0
- data/lib/lrama/reporter/terms.rb +44 -0
- data/lib/lrama/reporter.rb +39 -0
- data/lib/lrama/state/action/goto.rb +33 -0
- data/lib/lrama/state/action/reduce.rb +71 -0
- data/lib/lrama/state/action/shift.rb +39 -0
- data/lib/lrama/state/action.rb +5 -0
- data/lib/lrama/state/inadequacy_annotation.rb +140 -0
- data/lib/lrama/{states → state}/item.rb +33 -4
- data/lib/lrama/state/reduce_reduce_conflict.rb +14 -1
- data/lib/lrama/state/resolved_conflict.rb +38 -4
- data/lib/lrama/state/shift_reduce_conflict.rb +14 -1
- data/lib/lrama/state.rb +301 -200
- data/lib/lrama/states.rb +447 -175
- data/lib/lrama/tracer/actions.rb +22 -0
- data/lib/lrama/tracer/closure.rb +30 -0
- data/lib/lrama/tracer/duration.rb +38 -0
- data/lib/lrama/tracer/only_explicit_rules.rb +24 -0
- data/lib/lrama/tracer/rules.rb +23 -0
- data/lib/lrama/tracer/state.rb +33 -0
- data/lib/lrama/tracer.rb +51 -0
- data/lib/lrama/version.rb +2 -1
- data/lib/lrama/warnings/conflicts.rb +27 -0
- data/lib/lrama/warnings/implicit_empty.rb +29 -0
- data/lib/lrama/warnings/name_conflicts.rb +63 -0
- data/lib/lrama/warnings/redefined_rules.rb +23 -0
- data/lib/lrama/warnings/required.rb +23 -0
- data/lib/lrama/warnings/useless_precedence.rb +25 -0
- data/lib/lrama/warnings.rb +33 -0
- data/lib/lrama.rb +5 -5
- data/parser.y +495 -404
- data/rbs_collection.lock.yaml +27 -3
- data/rbs_collection.yaml +2 -0
- data/sig/generated/lrama/bitmap.rbs +12 -4
- data/sig/generated/lrama/counterexamples/derivation.rbs +36 -0
- data/sig/generated/lrama/counterexamples/example.rbs +58 -0
- data/sig/generated/lrama/counterexamples/node.rbs +18 -0
- data/sig/generated/lrama/counterexamples/path.rbs +23 -0
- data/sig/generated/lrama/counterexamples/state_item.rbs +19 -0
- data/sig/generated/lrama/counterexamples/triple.rbs +32 -0
- data/sig/generated/lrama/counterexamples.rbs +98 -0
- data/sig/generated/lrama/diagram.rbs +34 -0
- data/sig/generated/lrama/digraph.rbs +26 -6
- data/sig/generated/lrama/erb.rbs +14 -0
- data/sig/generated/lrama/grammar/auxiliary.rbs +16 -0
- data/sig/generated/lrama/grammar/binding.rbs +18 -12
- data/sig/generated/lrama/grammar/code/destructor_code.rbs +26 -0
- data/sig/{lrama → generated/lrama}/grammar/code/initial_action_code.rbs +6 -0
- data/sig/{lrama → generated/lrama}/grammar/code/no_reference_code.rbs +6 -0
- data/sig/generated/lrama/grammar/code/printer_code.rbs +26 -0
- data/sig/generated/lrama/grammar/code/rule_action.rbs +63 -0
- data/sig/generated/lrama/grammar/code.rbs +38 -0
- data/sig/{lrama → generated/lrama}/grammar/counter.rbs +4 -0
- data/sig/generated/lrama/grammar/destructor.rbs +19 -0
- data/sig/generated/lrama/grammar/error_token.rbs +19 -0
- data/sig/generated/lrama/grammar/inline/resolver.rbs +26 -0
- data/sig/generated/lrama/grammar/parameterized/resolver.rbs +42 -0
- data/sig/generated/lrama/grammar/parameterized/rhs.rbs +21 -0
- data/sig/generated/lrama/grammar/parameterized/rule.rbs +28 -0
- data/sig/{lrama → generated/lrama}/grammar/percent_code.rbs +8 -0
- data/sig/generated/lrama/grammar/precedence.rbs +45 -0
- data/sig/{lrama/grammar/error_token.rbs → generated/lrama/grammar/printer.rbs} +8 -3
- data/sig/generated/lrama/grammar/reference.rbs +31 -0
- data/sig/generated/lrama/grammar/rule.rbs +83 -0
- data/sig/generated/lrama/grammar/rule_builder.rbs +91 -0
- data/sig/generated/lrama/grammar/symbol.rbs +89 -0
- data/sig/generated/lrama/grammar/symbols/resolver.rbs +131 -0
- data/sig/generated/lrama/grammar/type.rbs +21 -0
- data/sig/generated/lrama/grammar/union.rbs +17 -0
- data/sig/generated/lrama/grammar.rbs +289 -0
- data/sig/generated/lrama/lexer/location.rbs +12 -3
- data/sig/generated/lrama/lexer/token/base.rbs +53 -0
- data/sig/generated/lrama/lexer/token/char.rbs +9 -2
- data/sig/generated/lrama/lexer/token/empty.rbs +11 -0
- data/sig/generated/lrama/lexer/token/ident.rbs +2 -2
- data/sig/generated/lrama/lexer/token/instantiate_rule.rbs +5 -5
- data/sig/generated/lrama/lexer/token/int.rbs +13 -0
- data/sig/generated/lrama/lexer/token/str.rbs +10 -0
- data/sig/generated/lrama/lexer/token/tag.rbs +2 -2
- data/sig/generated/lrama/lexer/token/token.rbs +10 -0
- data/sig/generated/lrama/lexer/token/user_code.rbs +2 -2
- data/sig/generated/lrama/lexer/token.rbs +1 -39
- data/sig/generated/lrama/lexer.rbs +54 -0
- data/sig/generated/lrama/logger.rbs +6 -0
- data/sig/generated/lrama/option_parser.rbs +52 -0
- data/sig/{lrama → generated/lrama}/options.rbs +27 -3
- data/sig/generated/lrama/reporter/conflicts.rbs +18 -0
- data/sig/generated/lrama/reporter/grammar.rbs +13 -0
- data/sig/generated/lrama/reporter/precedences.rbs +15 -0
- data/sig/generated/lrama/reporter/profile/call_stack.rbs +19 -0
- data/sig/generated/lrama/reporter/profile/memory.rbs +19 -0
- data/sig/generated/lrama/reporter/rules.rbs +13 -0
- data/sig/generated/lrama/reporter/states.rbs +69 -0
- data/sig/generated/lrama/reporter/terms.rbs +13 -0
- data/sig/generated/lrama/reporter.rbs +13 -0
- data/sig/generated/lrama/state/action/goto.rbs +28 -0
- data/sig/generated/lrama/state/action/reduce.rbs +49 -0
- data/sig/generated/lrama/state/action/shift.rbs +33 -0
- data/sig/generated/lrama/state/inadequacy_annotation.rbs +45 -0
- data/sig/generated/lrama/state/item.rbs +75 -0
- data/sig/generated/lrama/state/reduce_reduce_conflict.rbs +19 -0
- data/sig/generated/lrama/state/resolved_conflict.rbs +38 -0
- data/sig/generated/lrama/state/shift_reduce_conflict.rbs +19 -0
- data/sig/generated/lrama/state.rbs +231 -0
- data/sig/generated/lrama/states.rbs +215 -0
- data/sig/generated/lrama/tracer/actions.rbs +13 -0
- data/sig/generated/lrama/tracer/closure.rbs +13 -0
- data/sig/generated/lrama/tracer/duration.rbs +18 -0
- data/sig/generated/lrama/tracer/only_explicit_rules.rbs +13 -0
- data/sig/generated/lrama/tracer/rules.rbs +13 -0
- data/sig/generated/lrama/tracer/state.rbs +16 -0
- data/sig/generated/lrama/tracer.rbs +23 -0
- data/sig/generated/lrama/version.rbs +5 -0
- data/sig/generated/lrama/warnings/conflicts.rbs +13 -0
- data/sig/generated/lrama/warnings/implicit_empty.rbs +17 -0
- data/sig/generated/lrama/warnings/name_conflicts.rbs +31 -0
- data/sig/generated/lrama/warnings/redefined_rules.rbs +13 -0
- data/sig/generated/lrama/warnings/required.rbs +13 -0
- data/sig/generated/lrama/warnings/useless_precedence.rbs +13 -0
- data/sig/generated/lrama/warnings.rbs +11 -0
- data/sig/railroad_diagrams/railroad_diagrams.rbs +16 -0
- data/template/bison/_yacc.h +8 -0
- data/template/diagram/diagram.html +102 -0
- metadata +126 -66
- data/lib/lrama/counterexamples/production_path.rb +0 -19
- data/lib/lrama/counterexamples/start_path.rb +0 -23
- data/lib/lrama/counterexamples/transition_path.rb +0 -19
- data/lib/lrama/diagnostics.rb +0 -36
- data/lib/lrama/grammar/parameterizing_rule/rule.rb +0 -24
- data/lib/lrama/grammar/parameterizing_rule.rb +0 -5
- data/lib/lrama/grammar_validator.rb +0 -37
- data/lib/lrama/report/duration.rb +0 -27
- data/lib/lrama/report/profile.rb +0 -16
- data/lib/lrama/report.rb +0 -4
- data/lib/lrama/state/reduce.rb +0 -37
- data/lib/lrama/state/shift.rb +0 -15
- data/lib/lrama/states_reporter.rb +0 -362
- data/lib/lrama/trace_reporter.rb +0 -45
- data/sig/generated/lrama/trace_reporter.rbs +0 -25
- data/sig/lrama/counterexamples/derivation.rbs +0 -33
- data/sig/lrama/counterexamples/example.rbs +0 -45
- data/sig/lrama/counterexamples/path.rbs +0 -21
- data/sig/lrama/counterexamples/production_path.rbs +0 -11
- data/sig/lrama/counterexamples/start_path.rbs +0 -13
- data/sig/lrama/counterexamples/state_item.rbs +0 -10
- data/sig/lrama/counterexamples/transition_path.rbs +0 -11
- data/sig/lrama/counterexamples/triple.rbs +0 -20
- data/sig/lrama/counterexamples.rbs +0 -29
- data/sig/lrama/grammar/auxiliary.rbs +0 -10
- data/sig/lrama/grammar/code/destructor_code.rbs +0 -14
- data/sig/lrama/grammar/code/printer_code.rbs +0 -14
- data/sig/lrama/grammar/code/rule_action.rbs +0 -19
- data/sig/lrama/grammar/code.rbs +0 -24
- data/sig/lrama/grammar/destructor.rbs +0 -13
- data/sig/lrama/grammar/parameterizing_rule/resolver.rbs +0 -24
- data/sig/lrama/grammar/parameterizing_rule/rhs.rbs +0 -14
- data/sig/lrama/grammar/parameterizing_rule/rule.rbs +0 -16
- data/sig/lrama/grammar/parameterizing_rule.rbs +0 -6
- data/sig/lrama/grammar/precedence.rbs +0 -13
- data/sig/lrama/grammar/printer.rbs +0 -13
- data/sig/lrama/grammar/reference.rbs +0 -22
- data/sig/lrama/grammar/rule.rbs +0 -45
- data/sig/lrama/grammar/rule_builder.rbs +0 -47
- data/sig/lrama/grammar/symbol.rbs +0 -38
- data/sig/lrama/grammar/symbols/resolver.rbs +0 -60
- data/sig/lrama/grammar/type.rbs +0 -11
- data/sig/lrama/grammar/union.rbs +0 -12
- data/sig/lrama/grammar.rbs +0 -108
- data/sig/lrama/report/duration.rbs +0 -11
- data/sig/lrama/report/profile.rbs +0 -7
- data/sig/lrama/state/reduce.rbs +0 -20
- data/sig/lrama/state/reduce_reduce_conflict.rbs +0 -13
- data/sig/lrama/state/resolved_conflict.rbs +0 -14
- data/sig/lrama/state/shift.rbs +0 -14
- data/sig/lrama/state/shift_reduce_conflict.rbs +0 -13
- data/sig/lrama/state.rbs +0 -79
- data/sig/lrama/states/item.rbs +0 -30
- data/sig/lrama/states.rbs +0 -101
- data/sig/lrama/warning.rbs +0 -16
|
@@ -1,24 +1,54 @@
|
|
|
1
|
+
# rbs_inline: enabled
|
|
1
2
|
# frozen_string_literal: true
|
|
2
3
|
|
|
3
4
|
module Lrama
|
|
4
5
|
class Grammar
|
|
5
6
|
class Symbols
|
|
6
7
|
class Resolver
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
# @rbs!
|
|
9
|
+
#
|
|
10
|
+
# interface _DelegatedMethods
|
|
11
|
+
# def symbols: () -> Array[Grammar::Symbol]
|
|
12
|
+
# def nterms: () -> Array[Grammar::Symbol]
|
|
13
|
+
# def terms: () -> Array[Grammar::Symbol]
|
|
14
|
+
# def add_nterm: (id: Lexer::Token::Base, ?alias_name: String?, ?tag: Lexer::Token::Tag?) -> Grammar::Symbol
|
|
15
|
+
# def add_term: (id: Lexer::Token::Base, ?alias_name: String?, ?tag: Lexer::Token::Tag?, ?token_id: Integer?, ?replace: bool) -> Grammar::Symbol
|
|
16
|
+
# def find_symbol_by_number!: (Integer number) -> Grammar::Symbol
|
|
17
|
+
# def find_symbol_by_id!: (Lexer::Token::Base id) -> Grammar::Symbol
|
|
18
|
+
# def token_to_symbol: (Lexer::Token::Base token) -> Grammar::Symbol
|
|
19
|
+
# def find_symbol_by_s_value!: (::String s_value) -> Grammar::Symbol
|
|
20
|
+
# def fill_nterm_type: (Array[Grammar::Type] types) -> void
|
|
21
|
+
# def fill_symbol_number: () -> void
|
|
22
|
+
# def fill_printer: (Array[Grammar::Printer] printers) -> void
|
|
23
|
+
# def fill_destructor: (Array[Destructor] destructors) -> (Destructor | bot)
|
|
24
|
+
# def fill_error_token: (Array[Grammar::ErrorToken] error_tokens) -> void
|
|
25
|
+
# def sort_by_number!: () -> Array[Grammar::Symbol]
|
|
26
|
+
# end
|
|
27
|
+
#
|
|
28
|
+
# @symbols: Array[Grammar::Symbol]?
|
|
29
|
+
# @number: Integer
|
|
30
|
+
# @used_numbers: Hash[Integer, bool]
|
|
31
|
+
|
|
32
|
+
attr_reader :terms #: Array[Grammar::Symbol]
|
|
33
|
+
attr_reader :nterms #: Array[Grammar::Symbol]
|
|
34
|
+
|
|
35
|
+
# @rbs () -> void
|
|
9
36
|
def initialize
|
|
10
37
|
@terms = []
|
|
11
38
|
@nterms = []
|
|
12
39
|
end
|
|
13
40
|
|
|
41
|
+
# @rbs () -> Array[Grammar::Symbol]
|
|
14
42
|
def symbols
|
|
15
43
|
@symbols ||= (@terms + @nterms)
|
|
16
44
|
end
|
|
17
45
|
|
|
46
|
+
# @rbs () -> Array[Grammar::Symbol]
|
|
18
47
|
def sort_by_number!
|
|
19
48
|
symbols.sort_by!(&:number)
|
|
20
49
|
end
|
|
21
50
|
|
|
51
|
+
# @rbs (id: Lexer::Token::Base, ?alias_name: String?, ?tag: Lexer::Token::Tag?, ?token_id: Integer?, ?replace: bool) -> Grammar::Symbol
|
|
22
52
|
def add_term(id:, alias_name: nil, tag: nil, token_id: nil, replace: false)
|
|
23
53
|
if token_id && (sym = find_symbol_by_token_id(token_id))
|
|
24
54
|
if replace
|
|
@@ -43,6 +73,7 @@ module Lrama
|
|
|
43
73
|
term
|
|
44
74
|
end
|
|
45
75
|
|
|
76
|
+
# @rbs (id: Lexer::Token::Base, ?alias_name: String?, ?tag: Lexer::Token::Tag?) -> Grammar::Symbol
|
|
46
77
|
def add_nterm(id:, alias_name: nil, tag: nil)
|
|
47
78
|
if (sym = find_symbol_by_id(id))
|
|
48
79
|
return sym
|
|
@@ -57,32 +88,39 @@ module Lrama
|
|
|
57
88
|
nterm
|
|
58
89
|
end
|
|
59
90
|
|
|
91
|
+
# @rbs (::String s_value) -> Grammar::Symbol?
|
|
60
92
|
def find_term_by_s_value(s_value)
|
|
61
93
|
terms.find { |s| s.id.s_value == s_value }
|
|
62
94
|
end
|
|
63
95
|
|
|
96
|
+
# @rbs (::String s_value) -> Grammar::Symbol?
|
|
64
97
|
def find_symbol_by_s_value(s_value)
|
|
65
98
|
symbols.find { |s| s.id.s_value == s_value }
|
|
66
99
|
end
|
|
67
100
|
|
|
101
|
+
# @rbs (::String s_value) -> Grammar::Symbol
|
|
68
102
|
def find_symbol_by_s_value!(s_value)
|
|
69
103
|
find_symbol_by_s_value(s_value) || (raise "Symbol not found. value: `#{s_value}`")
|
|
70
104
|
end
|
|
71
105
|
|
|
106
|
+
# @rbs (Lexer::Token::Base id) -> Grammar::Symbol?
|
|
72
107
|
def find_symbol_by_id(id)
|
|
73
108
|
symbols.find do |s|
|
|
74
109
|
s.id == id || s.alias_name == id.s_value
|
|
75
110
|
end
|
|
76
111
|
end
|
|
77
112
|
|
|
113
|
+
# @rbs (Lexer::Token::Base id) -> Grammar::Symbol
|
|
78
114
|
def find_symbol_by_id!(id)
|
|
79
115
|
find_symbol_by_id(id) || (raise "Symbol not found. #{id}")
|
|
80
116
|
end
|
|
81
117
|
|
|
118
|
+
# @rbs (Integer token_id) -> Grammar::Symbol?
|
|
82
119
|
def find_symbol_by_token_id(token_id)
|
|
83
120
|
symbols.find {|s| s.token_id == token_id }
|
|
84
121
|
end
|
|
85
122
|
|
|
123
|
+
# @rbs (Integer number) -> Grammar::Symbol
|
|
86
124
|
def find_symbol_by_number!(number)
|
|
87
125
|
sym = symbols[number]
|
|
88
126
|
|
|
@@ -92,6 +130,7 @@ module Lrama
|
|
|
92
130
|
sym
|
|
93
131
|
end
|
|
94
132
|
|
|
133
|
+
# @rbs () -> void
|
|
95
134
|
def fill_symbol_number
|
|
96
135
|
# YYEMPTY = -2
|
|
97
136
|
# YYEOF = 0
|
|
@@ -102,6 +141,7 @@ module Lrama
|
|
|
102
141
|
fill_nterms_number
|
|
103
142
|
end
|
|
104
143
|
|
|
144
|
+
# @rbs (Array[Grammar::Type] types) -> void
|
|
105
145
|
def fill_nterm_type(types)
|
|
106
146
|
types.each do |type|
|
|
107
147
|
nterm = find_nterm_by_id!(type.id)
|
|
@@ -109,6 +149,7 @@ module Lrama
|
|
|
109
149
|
end
|
|
110
150
|
end
|
|
111
151
|
|
|
152
|
+
# @rbs (Array[Grammar::Printer] printers) -> void
|
|
112
153
|
def fill_printer(printers)
|
|
113
154
|
symbols.each do |sym|
|
|
114
155
|
printers.each do |printer|
|
|
@@ -126,6 +167,7 @@ module Lrama
|
|
|
126
167
|
end
|
|
127
168
|
end
|
|
128
169
|
|
|
170
|
+
# @rbs (Array[Destructor] destructors) -> (Array[Grammar::Symbol] | bot)
|
|
129
171
|
def fill_destructor(destructors)
|
|
130
172
|
symbols.each do |sym|
|
|
131
173
|
destructors.each do |destructor|
|
|
@@ -143,6 +185,7 @@ module Lrama
|
|
|
143
185
|
end
|
|
144
186
|
end
|
|
145
187
|
|
|
188
|
+
# @rbs (Array[Grammar::ErrorToken] error_tokens) -> void
|
|
146
189
|
def fill_error_token(error_tokens)
|
|
147
190
|
symbols.each do |sym|
|
|
148
191
|
error_tokens.each do |token|
|
|
@@ -160,28 +203,33 @@ module Lrama
|
|
|
160
203
|
end
|
|
161
204
|
end
|
|
162
205
|
|
|
206
|
+
# @rbs (Lexer::Token::Base token) -> Grammar::Symbol
|
|
163
207
|
def token_to_symbol(token)
|
|
164
208
|
case token
|
|
165
|
-
when Lrama::Lexer::Token
|
|
209
|
+
when Lrama::Lexer::Token::Base
|
|
166
210
|
find_symbol_by_id!(token)
|
|
167
211
|
else
|
|
168
212
|
raise "Unknown class: #{token}"
|
|
169
213
|
end
|
|
170
214
|
end
|
|
171
215
|
|
|
216
|
+
# @rbs () -> void
|
|
172
217
|
def validate!
|
|
173
218
|
validate_number_uniqueness!
|
|
174
219
|
validate_alias_name_uniqueness!
|
|
220
|
+
validate_symbols!
|
|
175
221
|
end
|
|
176
222
|
|
|
177
223
|
private
|
|
178
224
|
|
|
225
|
+
# @rbs (Lexer::Token::Base id) -> Grammar::Symbol
|
|
179
226
|
def find_nterm_by_id!(id)
|
|
180
227
|
@nterms.find do |s|
|
|
181
228
|
s.id == id
|
|
182
229
|
end || (raise "Symbol not found. #{id}")
|
|
183
230
|
end
|
|
184
231
|
|
|
232
|
+
# @rbs () -> void
|
|
185
233
|
def fill_terms_number
|
|
186
234
|
# Character literal in grammar file has
|
|
187
235
|
# token id corresponding to ASCII code by default,
|
|
@@ -245,6 +293,7 @@ module Lrama
|
|
|
245
293
|
end
|
|
246
294
|
end
|
|
247
295
|
|
|
296
|
+
# @rbs () -> void
|
|
248
297
|
def fill_nterms_number
|
|
249
298
|
token_id = 0
|
|
250
299
|
|
|
@@ -266,6 +315,7 @@ module Lrama
|
|
|
266
315
|
end
|
|
267
316
|
end
|
|
268
317
|
|
|
318
|
+
# @rbs () -> Hash[Integer, bool]
|
|
269
319
|
def used_numbers
|
|
270
320
|
return @used_numbers if defined?(@used_numbers)
|
|
271
321
|
|
|
@@ -276,6 +326,7 @@ module Lrama
|
|
|
276
326
|
@used_numbers
|
|
277
327
|
end
|
|
278
328
|
|
|
329
|
+
# @rbs () -> void
|
|
279
330
|
def validate_number_uniqueness!
|
|
280
331
|
invalid = symbols.group_by(&:number).select do |number, syms|
|
|
281
332
|
syms.count > 1
|
|
@@ -286,6 +337,7 @@ module Lrama
|
|
|
286
337
|
raise "Symbol number is duplicated. #{invalid}"
|
|
287
338
|
end
|
|
288
339
|
|
|
340
|
+
# @rbs () -> void
|
|
289
341
|
def validate_alias_name_uniqueness!
|
|
290
342
|
invalid = symbols.select(&:alias_name).group_by(&:alias_name).select do |alias_name, syms|
|
|
291
343
|
syms.count > 1
|
|
@@ -295,6 +347,15 @@ module Lrama
|
|
|
295
347
|
|
|
296
348
|
raise "Symbol alias name is duplicated. #{invalid}"
|
|
297
349
|
end
|
|
350
|
+
|
|
351
|
+
# @rbs () -> void
|
|
352
|
+
def validate_symbols!
|
|
353
|
+
symbols.each { |sym| sym.id.validate }
|
|
354
|
+
errors = symbols.map { |sym| sym.id.errors }.flatten.compact
|
|
355
|
+
return if errors.empty?
|
|
356
|
+
|
|
357
|
+
raise errors.join("\n")
|
|
358
|
+
end
|
|
298
359
|
end
|
|
299
360
|
end
|
|
300
361
|
end
|
data/lib/lrama/grammar/type.rb
CHANGED
|
@@ -1,15 +1,27 @@
|
|
|
1
|
+
# rbs_inline: enabled
|
|
1
2
|
# frozen_string_literal: true
|
|
2
3
|
|
|
3
4
|
module Lrama
|
|
4
5
|
class Grammar
|
|
5
6
|
class Type
|
|
6
|
-
|
|
7
|
+
# TODO: rbs-inline 0.11.0 doesn't support instance variables.
|
|
8
|
+
# Move these type declarations above instance variable definitions, once it's supported.
|
|
9
|
+
# see: https://github.com/soutaro/rbs-inline/pull/149
|
|
10
|
+
#
|
|
11
|
+
# @rbs!
|
|
12
|
+
# @id: Lexer::Token::Base
|
|
13
|
+
# @tag: Lexer::Token::Tag
|
|
7
14
|
|
|
15
|
+
attr_reader :id #: Lexer::Token::Base
|
|
16
|
+
attr_reader :tag #: Lexer::Token::Tag
|
|
17
|
+
|
|
18
|
+
# @rbs (id: Lexer::Token::Base, tag: Lexer::Token::Tag) -> void
|
|
8
19
|
def initialize(id:, tag:)
|
|
9
20
|
@id = id
|
|
10
21
|
@tag = tag
|
|
11
22
|
end
|
|
12
23
|
|
|
24
|
+
# @rbs (Grammar::Type other) -> bool
|
|
13
25
|
def ==(other)
|
|
14
26
|
self.class == other.class &&
|
|
15
27
|
self.id == other.id &&
|
data/lib/lrama/grammar/union.rb
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
|
+
# rbs_inline: enabled
|
|
1
2
|
# frozen_string_literal: true
|
|
2
3
|
|
|
3
4
|
module Lrama
|
|
4
5
|
class Grammar
|
|
5
|
-
class Union
|
|
6
|
+
class Union
|
|
7
|
+
attr_reader :code #: Grammar::Code::NoReferenceCode
|
|
8
|
+
attr_reader :lineno #: Integer
|
|
9
|
+
|
|
10
|
+
# @rbs (code: Grammar::Code::NoReferenceCode, lineno: Integer) -> void
|
|
11
|
+
def initialize(code:, lineno:)
|
|
12
|
+
@code = code
|
|
13
|
+
@lineno = lineno
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @rbs () -> String
|
|
6
17
|
def braces_less_code
|
|
7
18
|
# Braces is already removed by lexer
|
|
8
19
|
code.s_value
|