/**
* Copyright (c) 2007 - 2009 OptXware Research and Development LLC.
* All rights reserved.   This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*   Daniel Varro - Initial API and implementation
*
* This file was generated automatically based upon the VTCL LPG Parser
* VTCLParser.g 
*/

package org.eclipse.viatra2.lpgparser.ast;

import lpg.lpgjavaruntime.*;

/**
 *<b>
 *<li>Rule 88:  ArithmeticTermAST ::= ArithmeticTermAST MINUS MultArithmeticTermAST
 *</b>
 */
public class ArithmeticTermAST1 extends ASTNode implements IArithmeticTermAST
{
    private IArithmeticTermAST _ArithmeticTermAST;
    private IMultArithmeticTermAST _MultArithmeticTermAST;

    public IArithmeticTermAST getArithmeticTermAST() { return _ArithmeticTermAST; }
    public IMultArithmeticTermAST getMultArithmeticTermAST() { return _MultArithmeticTermAST; }

    public ArithmeticTermAST1(IToken leftIToken, IToken rightIToken,
                              IArithmeticTermAST _ArithmeticTermAST,
                              IMultArithmeticTermAST _MultArithmeticTermAST)
    {
        super(leftIToken, rightIToken);

        this._ArithmeticTermAST = _ArithmeticTermAST;
        ((ASTNode) _ArithmeticTermAST).setParent(this);
        this._MultArithmeticTermAST = _MultArithmeticTermAST;
        ((ASTNode) _MultArithmeticTermAST).setParent(this);
        initialize();
    }

    public boolean equals(Object o)
    {
        if (o == this) return true;
        //
        // The supers call is not required for now because Ast nodes
        // can only extend the root Ast, AstToken and AstList and none
        // of these nodes contain children.
        //
        // if (! super.equals(o)) return false;
        //
        if (! (o instanceof ArithmeticTermAST1)) return false;
        ArithmeticTermAST1 other = (ArithmeticTermAST1) o;
        if (! _ArithmeticTermAST.equals(other.getArithmeticTermAST())) return false;
        if (! _MultArithmeticTermAST.equals(other.getMultArithmeticTermAST())) return false;
        return true;
    }

    public int hashCode()
    {
        int hash = 7;
        hash = hash * 31 + (getArithmeticTermAST().hashCode());
        hash = hash * 31 + (getMultArithmeticTermAST().hashCode());
        return hash;
    }

    public void accept(Visitor v) { v.visit(this); }
    public void accept(ArgumentVisitor v, Object o) { v.visit(this, o); }
    public Object accept(ResultVisitor v) { return v.visit(this); }
    public Object accept(ResultArgumentVisitor v, Object o) { return v.visit(this, o); }
}


