Class: RLTK::CFG::Production

Inherits:
Object
  • Object
show all
Defined in:
lib/rltk/cfg.rb

Overview

Oddly enough, the Production class represents a production in a context-free grammar.

Direct Known Subclasses

Item

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id, lhs, rhs) ⇒ Production

Instantiates a new Production object with the specified ID, and left- and right-hand sides.

Parameters:

  • id (Integer)

    ID number of this production.

  • lhs (Symbol)

    Left-hand side of the production.

  • rhs (Array<Symbol>)

    Right-hand side of the production.



575
576
577
578
579
# File 'lib/rltk/cfg.rb', line 575

def initialize(id, lhs, rhs)
  @id  = id
  @lhs = lhs
  @rhs = rhs
end

Instance Attribute Details

#idInteger (readonly)

Returns ID of this production.

Returns:

  • (Integer)

    ID of this production.



561
562
563
# File 'lib/rltk/cfg.rb', line 561

def id
  @id
end

#lhsSymbol (readonly)

Returns Left-hand side of this production.

Returns:

  • (Symbol)

    Left-hand side of this production.



564
565
566
# File 'lib/rltk/cfg.rb', line 564

def lhs
  @lhs
end

#rhsArray<Symbol> (readonly)

Returns Right-hand side of this production.

Returns:

  • (Array<Symbol>)

    Right-hand side of this production.



567
568
569
# File 'lib/rltk/cfg.rb', line 567

def rhs
  @rhs
end

Instance Method Details

#==(other) ⇒ Boolean

Comparese on production to another. Returns true only if the left- and right- hand sides match.

Parameters:

  • other (Production)

    Another production to compare to.

Returns:

  • (Boolean)


587
588
589
# File 'lib/rltk/cfg.rb', line 587

def ==(other)
  self.lhs == other.lhs and self.rhs == other.rhs
end

#copyProduction

Returns A new copy of this production.

Returns:



592
593
594
# File 'lib/rltk/cfg.rb', line 592

def copy
  Production.new(@id, @lhs, @rhs.clone)
end

#last_terminalSymbol

Returns The last terminal in the right-hand side of the production.

Returns:

  • (Symbol)

    The last terminal in the right-hand side of the production.



597
598
599
# File 'lib/rltk/cfg.rb', line 597

def last_terminal
  @rhs.inject(nil) { |m, sym| if CFG::is_terminal?(sym) then sym else m end }
end

#to_itemItem

Returns An Item based on this production.

Returns:

  • (Item)

    An Item based on this production.



602
603
604
# File 'lib/rltk/cfg.rb', line 602

def to_item
  Item.new(0, @id, @lhs, @rhs)
end

#to_s(padding = 0) ⇒ String

Returns a string representation of this production.

Parameters:

  • padding (Integer) (defaults to: 0)

    The ammount of padding spaces to add to the beginning of the string.

Returns:

  • (String)


611
612
613
# File 'lib/rltk/cfg.rb', line 611

def to_s(padding = 0)
  "#{format("%-#{padding}s", @lhs)} -> #{@rhs.empty? ? 'ɛ' : @rhs.map { |s| s.to_s }.join(' ')}"
end