class Rley::Base::DottedItem
A dotted item is a parse state for a given production/grammar rule It partitions the rhs of the rule in two parts. The left part consists of the symbols in the rules that are matched by the input tokens. The right part consists of symbols that are predicted to match the input tokens. The terminology stems from the traditional way to visualize the partition by using a fat dot character as a separator between the left and right parts An item with the dot at the beginning (i.e. before any rhs symbol)
is called a predicted item.
An item with the dot at the end (i.e. after all rhs symbols)
is called a reduce item.
An item with a dot in front of a terminal is called a shift item.
Attributes
A possible constraint between symbol on left of dot and the closest preceding given terminal @return [NilClass, Syntax::MatchClosest
]
Index of the next symbol (from the rhs) after the ‘dot’. If the dot is at the end of the rhs (i.e.) there is no next symbol, then the position takes the value -1. It the rhs is empty, then the position is -2 @return [Integer]
Production rule @return [Syntax::Production]
Public Class Methods
Source
# File lib/rley/base/dotted_item.rb, line 38 def initialize(aProduction, aPosition) @production = aProduction @position = valid_position(aPosition) end
@param aProduction [Syntax::Production] @param aPosition [Integer] Position of the dot in rhs of production.
Public Instance Methods
Source
# File lib/rley/base/dotted_item.rb, line 60 def at_start? position.zero? || position == -2 end
Return true if the dot position is at the start of the rhs. @return [Boolean]
Source
# File lib/rley/base/dotted_item.rb, line 76 def lhs production.lhs end
The non-terminal symbol that is on the left-side of the production @return [Syntax::NonTerminal]
Source
# File lib/rley/base/dotted_item.rb, line 91 def next_symbol position.negative? ? nil : production.rhs[position] end
Return the symbol after the dot. nil is returned if the dot is at the end @return [Syntax::GrmSymbol, NilClass]
An item with the dot at the beginning is called predicted item
Source
# File lib/rley/base/dotted_item.rb, line 98 def prev_position unless @k_prev_position case position when -2, 0 result = nil when -1 result = production.rhs.size == 1 ? 0 : production.rhs.size - 1 else result = position - 1 end @k_prev_position = [result] end @k_prev_position[0] end
Calculate the position of the dot if were moved by one step on the left. @return [Integer]
Source
# File lib/rley/base/dotted_item.rb, line 83 def prev_symbol before_position = prev_position before_position.nil? ? nil : production.rhs[before_position] end
Return the symbol before the dot. nil is returned if the dot is at the start of the rhs @return [Syntax::GrmSymbol, NilClass]
Source
# File lib/rley/base/dotted_item.rb, line 70 def reduce_item? position.negative? # Either -1 or -2 end
A dotted item is called a reduce item if the dot is at the end. @return [Boolean]
Source
# File lib/rley/base/dotted_item.rb, line 118 def successor_of?(another) return false if production != another.production to_the_left = prev_position return false if to_the_left.nil? to_the_left == another.position end
Return true if this dotted item has a dot one place to the right compared to the dotted item argument. @param another [DottedItem] @return [Boolean]
Source
# File lib/rley/base/dotted_item.rb, line 45 def to_s prefix = "#{production.lhs} => " text_values = production.rhs.map(&:to_s) if position.negative? text_values << '.' else text_values.insert(position, '.') end suffix = text_values.join(' ') prefix + suffix end
Return a String representation of the dotted item. @return [String]
Private Instance Methods
Source
# File lib/rley/base/dotted_item.rb, line 131 def valid_position(aPosition) rhs_size = production.rhs.size if aPosition.negative? || aPosition > rhs_size raise StandardError, 'Out of bound index' end if rhs_size.zero? -2 # Minus 2 at start/end of empty production elsif aPosition == rhs_size -1 # Minus 1 at end of non-empty production else aPosition end end
Return the given position after its validation.