// This file is part of AceWiki.
// Copyright 2008-2013, AceWiki developers.
//
// AceWiki 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.
//
// AceWiki 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 AceWiki. If
// not, see http://www.gnu.org/licenses/.
package ch.uzh.ifi.attempto.chartparser;
import java.util.ArrayList;
import java.util.List;
import ch.uzh.ifi.attempto.base.ConcreteOption;
/**
* This class represents a concrete option for the chart parser. Such a concrete option consists of
* a word in the form of a terminal category standing for a possible next token, and optionally of
* a pre-terminal category from which the terminal category was derived.
*
* @author Tobias Kuhn
*/
public class CPConcreteOption implements ConcreteOption {
private final Terminal terminal;
private final Preterminal category;
private final String identifier;
CPConcreteOption(Grammar grammar, Terminal word, Preterminal category) {
this.terminal = word;
this.category = category;
identifier = calculateIdentifier(grammar.getFeatureNamesArray());
}
CPConcreteOption(Grammar grammar, LexicalRule lexRule) {
this(grammar, lexRule.getWord(), lexRule.getCategory());
}
public String getWord() {
return terminal.getName();
}
/**
* Returns the pre-terminal category of this concrete option, or null if no pre-terminal
* category was involved.
*
* @return The pre-terminal category.
*/
public Preterminal getCategory() {
return category;
}
public String getCategoryName() {
if (category == null) {
return null;
} else {
return category.getName();
}
}
String calculateIdentifier(String[] usedFeatureNames) {
if (category == null) {
return terminal + " <-";
} else {
List<Integer> vars = new ArrayList<Integer>();
List<Integer> mvars = new ArrayList<Integer>();
vars.clear();
mvars.clear();
category.collectVars(vars, mvars);
return terminal + " <- " + category.getIdentifier(mvars, usedFeatureNames);
}
}
public boolean equals(Object obj) {
if (!(obj instanceof CPConcreteOption)) return false;
CPConcreteOption other = (CPConcreteOption) obj;
return this.identifier.equals(other.identifier);
}
public int hashCode() {
return identifier.hashCode();
}
public String toString() {
if (category == null) {
return terminal + " <-";
} else {
return terminal + " <- " + category;
}
}
}