// 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.HashMap; import java.util.List; /** * This class represents a lexical rule. Lexical rules can also be called "lexicon entries". A * lexical rule consists of a word (in the form of a terminal category) and a pre-terminal * category. In the pre-terminal category of a lexical rule is simply called its "category". * * @author Tobias Kuhn */ public class LexicalRule { private final Preterminal category; private final Terminal word; private final Annotation annotation; /** * Creates a new lexical rule. * * @param annotation The annotation object. * @param category The category of the lexical rule. * @param word The word of the lexical rule as a terminal category. */ public LexicalRule(Annotation annotation, Preterminal category, Terminal word) { this.category = category; this.word = word; if (annotation == null) { this.annotation = new Annotation(); } else { this.annotation = annotation; } } /** * Creates a new lexical rule. * * @param category The category of the lexical rule. * @param word The word of the lexical rule as a terminal category. */ public LexicalRule(Preterminal category, Terminal word) { this(null, category, word); } /** * Creates a new lexical rule. * * @param category The category of the lexical rule. * @param word The word of the lexical rule. */ public LexicalRule(Preterminal category, String word) { this(category, new Terminal(word)); } /** * Creates a new lexical rule. * * @param categoryName The category name of the lexical rule. * @param word The word of the lexical rule. */ public LexicalRule(String categoryName, String word) { this(new Preterminal(categoryName), new Terminal(word)); } /** * Creates a new lexical rule. * * @param annotation The annotation object. * @param categories This list must contain exactly two elements. The first one must be a * pre-terminal category representing the category of the lexical rule. The second one * must be a terminal category representing the word of the lexical rule. */ public LexicalRule(Annotation annotation, List<Category> categories) { this.category = (Preterminal) categories.get(0); this.word = (Terminal) categories.get(1); if (annotation == null) { this.annotation = new Annotation(); } else { this.annotation = annotation; } } /** * Returns the category of the lexical rule. * * @return The category of the lexical rule. */ public Preterminal getCategory() { return category; } /** * Returns the word of the lexical rule. * * @return The word as a terminal category. */ public Terminal getWord() { return word; } /** * Returns the annotation object of this rule. * * @return The annotation object. */ public Annotation getAnnotation() { return annotation; } /** * Creates a deep copy of this lexicon entry. * * @return A deep copy. */ public LexicalRule deepCopy() { return deepCopy(new HashMap<Integer, StringObject>()); } /** * Creates a deep copy of this lexicon entry using the given string objects. * This method is usually called form another deepCopy-method. * * @param stringObjs The string objects to be used. * @return A deep copy. */ LexicalRule deepCopy(HashMap<Integer, StringObject> stringObjs) { Preterminal categoryC = (Preterminal) category.deepCopy(stringObjs); Terminal wordC = (Terminal) word.deepCopy(stringObjs); Annotation annotationC = annotation.deepCopy(stringObjs); return new LexicalRule(annotationC, categoryC, wordC); } public String toString() { return category + " => " + word; } }