    001    package org.maltparser.parser.algorithm.stack;
    002
    003    import org.maltparser.core.exception.MaltChainedException;
    004    import org.maltparser.core.feature.function.AddressFunction;
    005    import org.maltparser.core.feature.value.AddressValue;
    006    import org.maltparser.parser.Algorithm;
    007    import org.maltparser.parser.ParsingException;
    008    /**
    009     * @author Johan Hall
    010     *
    011     */
    012    public class StackAddressFunction extends AddressFunction {
    013            public enum StackSubFunction {
    014                    STACK, INPUT, LOOKAHEAD
    015            };
    016            private String subFunctionName;
    017            private StackSubFunction subFunction;
    018            private Algorithm parsingAlgorithm;
    019            private int index;
    020
    021            public StackAddressFunction(String subFunctionName, Algorithm parsingAlgorithm) {
    022                    super();
    023                    setSubFunctionName(subFunctionName);
    024                    setAlgorithm(parsingAlgorithm);
    025            }
    026
    027            public void initialize(Object[] arguments) throws MaltChainedException {
    028                    if (arguments.length != 1) {
    029                            throw new ParsingException("Could not initialize "+this.getClass().getName()+": number of arguments are not correct. ");
    030                    }
    031                    if (!(arguments[0] instanceof Integer)) {
    032                            throw new ParsingException("Could not initialize "+this.getClass().getName()+": the first argument is not an integer. ");
    033                    }
    034
    035                    setIndex(((Integer)arguments[0]).intValue());
    036            }
    037
    038            public Class<?>[] getParameterTypes() {
    039                    Class<?>[] paramTypes = { java.lang.Integer.class };
    040                    return paramTypes;
    041            }
    042
    043            public void update() throws MaltChainedException {
    044                    update((StackConfig)parsingAlgorithm.getCurrentParserConfiguration());
    045            }
    046
    047            public void update(Object[] arguments) throws MaltChainedException {
    048                    if (arguments.length != 1 || !(arguments[0] instanceof StackConfig)) {
    049                            throw new ParsingException("Arguments to the Stack address function is not correct. ");
    050                    }
    051                    update((StackConfig)arguments[0]);
    052            }
    053
    054            private void update(StackConfig config) throws MaltChainedException {
    055                    if (subFunction == StackSubFunction.STACK) {
    056                            address.setAddress(config.getStackNode(index));
    057                    } else if (subFunction == StackSubFunction.INPUT) {
    058                            address.setAddress(config.getInputNode(index));
    059                    } else if (subFunction == StackSubFunction.LOOKAHEAD) {
    060                            address.setAddress(config.getLookaheadNode(index));
    061                    } else {
    062                            address.setAddress(null);
    063                    }
    064            }
    065
    066            public String getSubFunctionName() {
    067                    return subFunctionName;
    068            }
    069
    070            public void setSubFunctionName(String subFunctionName) {
    071                    this.subFunctionName = subFunctionName;
    072                    subFunction = StackSubFunction.valueOf(subFunctionName.toUpperCase());
    073            }
    074
    075            public StackSubFunction getSubFunction() {
    076                    return subFunction;
    077            }
    078
    079            public AddressValue getAddressValue() {
    080                    return address;
    081            }
    082
    083            public Algorithm getParsingAlgorithm() {
    084                    return parsingAlgorithm;
    085            }
    086
    087            public void setAlgorithm(Algorithm parsingAlgorithm) {
    088                    this.parsingAlgorithm = parsingAlgorithm;
    089            }
    090
    091            public int getIndex() {
    092                    return index;
    093            }
    094
    095            public void setIndex(int index) {
    096                    this.index = index;
    097            }
    098
    099            public boolean equals(Object obj) {
    100                    if (this == obj)
    101                            return true;
    102                    if (obj == null)
    103                            return false;
    104                    if (getClass() != obj.getClass())
    105                            return false;
    106
    107                    StackAddressFunction other = (StackAddressFunction) obj;
    108                    if (index != other.index)
    109                            return false;
    110                    if (parsingAlgorithm == null) {
    111                            if (other.parsingAlgorithm != null)
    112                                    return false;
    113                    } else if (!parsingAlgorithm.equals(other.parsingAlgorithm))
    114                            return false;
    115                    if (subFunction == null) {
    116                            if (other.subFunction != null)
    117                                    return false;
    118                    } else if (!subFunction.equals(other.subFunction))
    119                            return false;
    120                    return true;
    121            }
    122
    123            public String toString() {
    124                    final StringBuilder sb = new StringBuilder();
    125                    sb.append(subFunctionName);
    126                    sb.append('[');
    127                    sb.append(index);
    128                    sb.append(']');
    129                    return sb.toString();
    130            }
    131    }