/*
* Copyright 2007-2013
* Licensed under GNU Lesser General Public License
*
* This file is part of EpochX: genetic programming software for research
*
* EpochX is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EpochX is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with EpochX. If not, see <http://www.gnu.org/licenses/>.
*
* The latest version is available from: http://www.epochx.org
*/
package org.epochx.grammar;
/**
* A terminal node of a parse tree, that was constructed to represent a specific
* instantiation of a {@link GrammarLiteral} of a grammar.
*
* @see NonTerminalSymbol
* @see GrammarLiteral
*/
public class TerminalSymbol implements Symbol {
// The associated grammar node.
private GrammarLiteral literal;
/**
* Constructs a <code>TerminalSymbol</code> for the given
* <code>GrammarLiteral</code>.
*
* @param literal the grammar node that this symbol is an instantiation of.
*/
public TerminalSymbol(GrammarLiteral literal) {
this.literal = literal;
}
/**
* Returns a <code>String</code> representation of this terminal symbol,
* which is the value of the underlying grammar literal.
*
* @return a <code>String</code> representation of this terminal symbol.
*/
@Override
public String toString() {
return literal.toString();
}
/**
* Creates and returns a copy of this terminal symbol. The underlying
* grammar rule is only shallow copied to the clone.
*
* @return a <code>TerminalSymbol</code> which is a copy of this instance.
*/
@Override
public TerminalSymbol clone() {
TerminalSymbol clone = null;
try {
clone = (TerminalSymbol) super.clone();
} catch (CloneNotSupportedException e) {
// This shouldn't ever happen - if it does then everything is
// going to blow up anyway.
assert false;
}
// Shallow copy the grammar rules.
clone.literal = literal;
return clone;
}
/**
* Tests the given <code>Object</code> for equality with this terminal
* symbol. The objects are considered to be equal if the argument is an
* instance of <code>TerminalSymbol</code> and the underlying grammar
* literals have matching literal values according to the
* <code>String</code> <code>equals</code> method.
*
* @param obj the <code>Object</code> to test for equality.
* @return <code>true</code> if the given <code>Object</code> is
* equal to this non-terminal according to the contract outlined
* above and <code>false</code> otherwise.
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof TerminalSymbol) {
TerminalSymbol objSymbol = (TerminalSymbol) obj;
return toString().equals(objSymbol.toString());
} else {
return false;
}
}
}