Class: Rley::Syntax::Production
- Inherits:
-
Object
- Object
- Rley::Syntax::Production
- Defined in:
- lib/rley/syntax/production.rb
Overview
In a context-free grammar, a production is a rule in which its left-hand side (LHS) consists solely of a non-terminal symbol and the right-hand side (RHS) consists of a sequence of symbols. The symbols in RHS can be either terminal or non-terminal symbols. The rule stipulates that the LHS is equivalent to the RHS, in other words every occurrence of the LHS can be substituted to corresponding RHS.
Instance Attribute Summary collapse
-
#constraints ⇒ Array<Syntax::MatchClosest>
A list of constraints between rhs members.
-
#generative ⇒ Boolean
writeonly
rhs members are generative (that is, they can each generate/derive a non-empty string of terminals).
-
#lhs ⇒ NonTerminal
(also: #head)
readonly
The left-hand side of the rule.
-
#name ⇒ String
The name of the production rule.
-
#nullable ⇒ Boolean
writeonly
A production is nullable when all of its rhs members are nullable.
-
#rhs ⇒ SymbolSeq
(also: #body)
readonly
The right-hand side (rhs).
Instance Method Summary collapse
-
#as(aName) ⇒ Object
(also: #tag)
A setter for the production name.
-
#empty? ⇒ Boolean
Is the rhs empty?.
-
#generative? ⇒ Boolean
Return true iff the production is generative.
-
#initialize(aNonTerminal, theSymbols) ⇒ Production
constructor
Create a Production instance.
-
#inspect ⇒ String
Returns a string containing a human-readable representation of the production.
-
#nullable? ⇒ Boolen
True iff the production is nullable.
Constructor Details
#initialize(aNonTerminal, theSymbols) ⇒ Production
Create a Production instance.
45 46 47 48 49 |
# File 'lib/rley/syntax/production.rb', line 45 def initialize(aNonTerminal, theSymbols) @lhs = valid_lhs(aNonTerminal) @rhs = valid_rhs(theSymbols) @constraints = [] end |
Instance Attribute Details
#constraints ⇒ Array<Syntax::MatchClosest>
Returns A list of constraints between rhs members.
35 36 37 |
# File 'lib/rley/syntax/production.rb', line 35 def constraints @constraints end |
#generative=(value) ⇒ Boolean (writeonly)
rhs members are generative (that is, they can each generate/derive a non-empty string of terminals).
28 29 30 |
# File 'lib/rley/syntax/production.rb', line 28 def generative=(value) @generative = value end |
#lhs ⇒ NonTerminal (readonly) Also known as: head
Returns The left-hand side of the rule.
19 20 21 |
# File 'lib/rley/syntax/production.rb', line 19 def lhs @lhs end |
#name ⇒ String
Returns The name of the production rule. It must be unique in a grammar.
23 24 25 |
# File 'lib/rley/syntax/production.rb', line 23 def name @name end |
#nullable=(value) ⇒ Boolean (writeonly)
Returns A production is nullable when all of its rhs members are nullable.
32 33 34 |
# File 'lib/rley/syntax/production.rb', line 32 def nullable=(value) @nullable = value end |
#rhs ⇒ SymbolSeq (readonly) Also known as: body
Returns The right-hand side (rhs).
16 17 18 |
# File 'lib/rley/syntax/production.rb', line 16 def rhs @rhs end |
Instance Method Details
#as(aName) ⇒ Object Also known as: tag
A setter for the production name
84 85 86 |
# File 'lib/rley/syntax/production.rb', line 84 def as(aName) @name = aName end |
#empty? ⇒ Boolean
Is the rhs empty?
53 54 55 |
# File 'lib/rley/syntax/production.rb', line 53 def empty? rhs.empty? end |
#generative? ⇒ Boolean
Return true iff the production is generative
58 59 60 61 62 63 |
# File 'lib/rley/syntax/production.rb', line 58 def generative? # if @generative.nil? # end @generative end |
#inspect ⇒ String
Returns a string containing a human-readable representation of the production.
73 74 75 76 77 78 79 80 |
# File 'lib/rley/syntax/production.rb', line 73 def inspect result = +"#<#{self.class.name}:#{object_id}" result << " @name=\"#{name}\"" result << " @lhs=#{lhs.name}" result << " @rhs=#{rhs.inspect}" result << " @generative=#{@generative}>" result end |
#nullable? ⇒ Boolen
Returns true iff the production is nullable.
66 67 68 |
# File 'lib/rley/syntax/production.rb', line 66 def nullable? @nullable end |