From b1d5cddab4ad5d2ad47d830b9533a47353d7dd1b Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 5 Jun 2022 14:40:41 -0400 Subject: [PATCH] Change Token constructor to take a Hash of all parameters --- lib/propane/grammar.rb | 4 ++-- lib/propane/parser.rb | 2 +- lib/propane/token.rb | 32 +++++++++++++++++--------------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/lib/propane/grammar.rb b/lib/propane/grammar.rb index 97f8a05..c0572a8 100644 --- a/lib/propane/grammar.rb +++ b/lib/propane/grammar.rb @@ -37,10 +37,10 @@ class Propane unless name =~ /^[a-zA-Z_][a-zA-Z_0-9]*$/ raise Error.new("Invalid token name #{name}") end - @tokens << Token.new(name, pattern, @tokens.size, line_number) + @tokens << Token.new(name: name, pattern: pattern, id: @tokens.size, line_number: line_number) elsif sliced = input.slice!(/\Adrop\s+(\S+)\n/) pattern = $1 - @drop_tokens << Token.new(nil, pattern, nil, line_number) + @drop_tokens << Token.new(pattern: pattern, line_number: line_number) elsif sliced = input.slice!(/\A(\S+)\s*:\s*\[(.*?)\] <<\n(.*?)^>>\n/m) rule_name, components, code = $1, $2, $3 components = components.strip.split(/\s+/) diff --git a/lib/propane/parser.rb b/lib/propane/parser.rb index d51b1d8..be5c70c 100644 --- a/lib/propane/parser.rb +++ b/lib/propane/parser.rb @@ -3,7 +3,7 @@ class Propane class Parser def initialize(rule_sets) - @token_eof = Token.new("$", nil, TOKEN_EOF, nil) + @token_eof = Token.new(name: "$", id: TOKEN_EOF) @item_sets = [] @item_sets_set = {} start_items = rule_sets["Start"].rules.map do |rule| diff --git a/lib/propane/token.rb b/lib/propane/token.rb index 98130d1..b40af45 100644 --- a/lib/propane/token.rb +++ b/lib/propane/token.rb @@ -2,15 +2,15 @@ class Propane class Token - # @return [String] + # @return [String, nil] # Token name. attr_reader :name - # @return [String] + # @return [String, nil] # Token pattern. attr_reader :pattern - # @return [Integer] + # @return [Integer, nil] # Token ID. attr_reader :id @@ -18,27 +18,29 @@ class Propane # Line number where the token was defined in the input grammar. attr_reader :line_number - # @return [Regex::NFA] + # @return [Regex::NFA, nil] # Regex NFA for matching the token. attr_reader :nfa # Construct a Token. # - # @param name [String] + # @param options [Hash] + # Optional parameters. + # @option options [String, nil] :name # Token name. - # @param pattern [String] + # @option options [String, nil] :pattern # Token pattern. - # @param id [Integer] + # @option options [Integer, nil] :id # Token ID. - # @param line_number [Integer, nil] + # @option options [Integer, nil] :line_number # Line number where the token was defined in the input grammar. - def initialize(name, pattern, id, line_number) - @name = name - @pattern = pattern - @id = id - @line_number = line_number - unless pattern.nil? - regex = Regex.new(pattern) + def initialize(options) + @name = options[:name] + @pattern = options[:pattern] + @id = options[:id] + @line_number = options[:line_number] + unless @pattern.nil? + regex = Regex.new(@pattern) regex.nfa.end_state.accepts = self @nfa = regex.nfa end