diff --git a/Steepfile b/Steepfile index 6e455bbe..a8789d38 100644 --- a/Steepfile +++ b/Steepfile @@ -11,12 +11,14 @@ target :lib do check "lib/lrama/grammar/error_token.rb" check "lib/lrama/grammar/parameterizing_rule" check "lib/lrama/grammar/parameterizing_rules" + check "lib/lrama/grammar/symbols" check "lib/lrama/grammar/percent_code.rb" check "lib/lrama/grammar/precedence.rb" check "lib/lrama/grammar/printer.rb" check "lib/lrama/grammar/reference.rb" check "lib/lrama/grammar/rule_builder.rb" check "lib/lrama/grammar/symbol.rb" + check "lib/lrama/grammar/type.rb" check "lib/lrama/lexer" check "lib/lrama/report" check "lib/lrama/bitmap.rb" diff --git a/lib/lrama/grammar/symbols/resolver.rb b/lib/lrama/grammar/symbols/resolver.rb index 456993b8..07e03e70 100644 --- a/lib/lrama/grammar/symbols/resolver.rb +++ b/lib/lrama/grammar/symbols/resolver.rb @@ -14,7 +14,7 @@ def symbols end def sort_by_number! - @symbols.sort_by!(&:number) + symbols.sort_by!(&:number) end def add_term(id:, alias_name: nil, tag: nil, token_id: nil, replace: false) @@ -198,9 +198,17 @@ def fill_terms_number when "\\\\" sym.token_id = 92 when /\A\\(\d+)\z/ - sym.token_id = Integer($1, 8) + unless (id = Integer($1, 8)).nil? + sym.token_id = id + else + raise "Unknown Char s_value #{sym}" + end when /\A(.)\z/ - sym.token_id = $1.bytes.first + unless (id = $1&.bytes&.first).nil? + sym.token_id = id + else + raise "Unknown Char s_value #{sym}" + end else raise "Unknown Char s_value #{sym}" end @@ -237,7 +245,7 @@ def used_numbers return @used_numbers if defined?(@used_numbers) @used_numbers = {} - @symbols.map(&:number).each do |n| + symbols.map(&:number).each do |n| @used_numbers[n] = true end @used_numbers diff --git a/sig/lrama/grammar/symbol.rbs b/sig/lrama/grammar/symbol.rbs index 6c345bdb..0d066934 100644 --- a/sig/lrama/grammar/symbol.rbs +++ b/sig/lrama/grammar/symbol.rbs @@ -2,7 +2,7 @@ module Lrama class Grammar class Symbol attr_accessor id: Lexer::Token - attr_accessor alias_name: String + attr_accessor alias_name: String? attr_accessor number: Integer attr_accessor tag: Lexer::Token? attr_accessor term: bool @@ -20,8 +20,8 @@ module Lrama attr_writer accept_symbol: Symbol def initialize: ( - id: Lexer::Token, alias_name: String?, number: Integer?, tag: Lexer::Token?, - term: bool, token_id: Integer?, nullable: bool?, precedence: Precedence?, printer: Printer?) -> void + id: Lexer::Token, term: bool, ?alias_name: String?, ?number: Integer?, ?tag: Lexer::Token?, + ?token_id: Integer?, ?nullable: bool?, ?precedence: Precedence?, ?printer: Printer?) -> void def term?: () -> bool def nterm?: () -> bool @@ -31,7 +31,7 @@ module Lrama def accept_symbol?: () -> bool def display_name: () -> String def enum_name: () -> String - def comment: () -> String + def comment: () -> String? end end end diff --git a/sig/lrama/grammar/symbols/resolver.rbs b/sig/lrama/grammar/symbols/resolver.rbs new file mode 100644 index 00000000..8f16cd16 --- /dev/null +++ b/sig/lrama/grammar/symbols/resolver.rbs @@ -0,0 +1,41 @@ +module Lrama + class Grammar + class Symbols + class Resolver + attr_reader terms: Array[Grammar::Symbol] + attr_reader nterms: Array[Grammar::Symbol] + + @symbols: Array[Grammar::Symbol]? + @number: Integer + @used_numbers: Hash[Integer, bool] + + def initialize: () -> void + def symbols: () -> Array[Grammar::Symbol] + def sort_by_number!: () -> void + def add_term: (id: Lexer::Token, ?alias_name: String?, ?tag: Lexer::Token?, ?token_id: Integer?, ?replace: bool) -> Grammar::Symbol + def add_nterm: (id: Lexer::Token, ?alias_name: String?, ?tag: Lexer::Token?) -> Grammar::Symbol? + def find_symbol_by_s_value: (Grammar::Symbol s_value) -> Grammar::Symbol? + def find_symbol_by_s_value!: (Grammar::Symbol s_value) -> Grammar::Symbol + def find_symbol_by_id: (Lexer::Token id) -> Grammar::Symbol? + def find_symbol_by_id!: (Lexer::Token id) -> Grammar::Symbol + def find_symbol_by_token_id: (Integer token_id) -> Grammar::Symbol? + def find_symbol_by_number!: (Integer number) -> Grammar::Symbol + def fill_symbol_number: () -> void + def fill_nterm_type: (Array[Grammar::Type] types) -> void + def fill_printer: (Array[Grammar::Printer] printers) -> void + def fill_error_token: (Array[Grammar::ErrorToken] error_tokens) -> void + def token_to_symbol: (Lexer::Token token) -> Grammar::Symbol + def validate!: () -> void + + private + + def find_nterm_by_id!: (Lexer::Token id) -> Grammar::Symbol + def fill_terms_number: () -> void + def fill_nterms_number: () -> void + def used_numbers: () -> Hash[Integer, bool] + def validate_number_uniqueness!: () -> void + def validate_alias_name_uniqueness!: () -> void + end + end + end +end diff --git a/sig/lrama/grammar/type.rbs b/sig/lrama/grammar/type.rbs new file mode 100644 index 00000000..2cdd8b13 --- /dev/null +++ b/sig/lrama/grammar/type.rbs @@ -0,0 +1,11 @@ +module Lrama + class Grammar + class Type + attr_reader id: Lexer::Token + attr_reader tag: Lexer::Token + + def initialize: (id: Lexer::Token, tag: Lexer::Token) -> void + def ==: (Grammar::Type other) -> bool + end + end +end