/*
 * AST.java
 *
 * Created on March 10, 2005, 11:33 PM
 */

package compiler;

/**
 *
 * @author  Administrator
 */
abstract class AST {
    public abstract Object visit(ASTVisitor v, Object arg) ;
}

class CompilationUnit extends AST {
    ClassDeclaration cd ;
    
    CompilationUnit(ClassDeclaration cd){
        this.cd = cd ;
    }
    
    public String toString(){
        return("[ "+cd+" ]");        
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitCompilationUnit(this,arg);
    }
}

class ClassDeclaration extends AST {
    Terminal publicdec ;
    Terminal classname ;
    ClassBody classbody ;
        
    ClassDeclaration( Terminal publicdec, Terminal classname, ClassBody classbody ) {
        this.publicdec = publicdec ;
        this.classname = classname ;
        this.classbody = classbody ;        
    }
    
    public String toString() {
            return("[ "+publicdec+classname+classbody+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitClassDeclaration(this,arg);
    }
}

class ClassBody extends AST {
    Declarations ds ;
        
    ClassBody(Declarations ds) {
        this.ds = ds ;        
    }
    
    public String toString() {
            return("[ "+ds+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitClassBody(this,arg);
    }
}

abstract class Declarations extends AST {
    String declaration_type ;
}

class VariableDeclarations extends Declarations {
    Modifier modifier ;
    Static staticvariable ;
    Type type ;
    Terminal variablename ;
    
    /*
     * The First constructor is for Class Variable Declarations
     */
    VariableDeclarations( Modifier modifier, Static staticvariable, Type type, Terminal variablename) {
        this.modifier = modifier ;
        this.staticvariable = staticvariable ;
        this.type = type ;
        this.variablename = variablename ;
        this.declaration_type = "classvariable" ;
    }    
    
    /*
     * The Second Constructor is for Function Variable Declarations
     */
    VariableDeclarations( Type type, Terminal variablename) {
        this.type = type ;
        this.variablename = variablename ;
        this.modifier = null ;
        this.staticvariable = null ;
        this.declaration_type = "functionvariable" ;
    }
    
    public String toString() {
            return("[ "+modifier+staticvariable+type+variablename+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitVariableDeclarations(this,arg);
    }
}

class FunctionDeclarations extends Declarations {
    Modifier md ;
    Static staticfunction ;
    Type type ;
    Terminal functionname ;
    Declarations parameterlist ;
    Block block ;
    
    /*
     * The First constructor is for all the normal functions
     */
    FunctionDeclarations( Modifier md, Static staticfunction, Type type, Terminal functionname, Declarations parameterlist, Block block,String message ) {
        this.md = md ;
        this.staticfunction = staticfunction ;
        this.type = type ;
        this.functionname = functionname ;
        this.parameterlist = parameterlist ;
        this.block = block ;
        this.declaration_type = message ;
    }
    
    public String toString() {
            return("[ "+md+staticfunction+type+functionname+parameterlist+block+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitFunctionDeclarations(this,arg);
    }
}

class SequenceDeclarations extends Declarations{
    Declarations declarationsone ;
    Declarations declarationstwo ;
    
    SequenceDeclarations(){
        declarationsone = null ;
        declarationstwo = null ;
    }
    
    SequenceDeclarations( Declarations declarationsone, Declarations declarationstwo ) {
        this.declarationsone = declarationsone ;
        this.declarationstwo = declarationstwo ;
    }
    
    public String toString() {
            return("[ "+declarationsone+declarationstwo+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitSequenceDeclarations(this,arg);
    }
}

class Block extends AST {
    Declarations dec ;
    Command cmd ;
    
    Block(Declarations dec, Command cmd){
        this.dec = dec ;
        this.cmd = cmd ;
    }
    
    public String toString() {
            return("[ "+dec+cmd+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitBlock(this,null);
    }
}

abstract class Command extends AST {
    String commandtype ;
}

class IfElseCommand extends Command{
    Expression expression ;
    Command command ;
    Command ecommand ;
    
    IfElseCommand( Expression expression, Command command ) {
        this.expression = expression ;
        this.command = command ;
        this.ecommand = null ;
        this.commandtype = "ifelse" ;
    }
    
    IfElseCommand( Expression expression, Command command, Command ecommand ) {
        this.expression = expression ;
        this.command = command ;
        this.ecommand = ecommand ;
        this.commandtype = "ifelse" ;
    }
    
    public String toString() {
            return("[ "+expression+command+ecommand+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitIfElseCommand(this,arg);
    }
}

class WhileCommand extends Command{
    Expression expression ;
    Command command ;
    
    WhileCommand( Expression expression, Command command ) {
        this.expression = expression ;
        this.command = command ;
        this.commandtype = "while" ;
    }
    
    public String toString() {
            return("[ "+expression+command+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitWhileCommand(this,arg);
    }
}

class ReturnCommand extends Command {
    Expression expression ;
     
    ReturnCommand( Expression expression ) {
        this.expression = expression ;
        this.commandtype = "return" ;
    }
    
    public String toString() {
            return("[ "+expression+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitReturnCommand(this,arg);
    }
}

class AssignmentCommand extends Command {
    ThisAndName tan ;
    Expression exp ;
    
    AssignmentCommand(ThisAndName tan, Expression exp) {
        this.tan = tan ;
        this.exp =exp ;
        this.commandtype = "assign" ;
    }
    
    public String toString() {
            return("[ "+tan+exp+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitAssignmentCommand(this,arg);
    }
}

class MethodCallCommand extends Command {
    ThisAndName tan ;
    Expression exp ;
    
    MethodCallCommand(ThisAndName tan, Expression exp){
        this.tan = tan ;
        this.exp = exp ;
    }
    
    public String toString(){
        return("[ "+tan+exp+" ]");
    }
    public Object visit(ASTVisitor v,Object arg){
        return v.visitMethodCallCommand(this,arg);
    }
}

class SequenceCommand extends Command {
    Command commandone ;
    Command commandtwo ;
    
    SequenceCommand( Command commandone, Command commandtwo ){
        this.commandone = commandone ;
        this.commandtwo = commandtwo ;
    }
    
    public String toString() {
            return("[ "+commandone+commandtwo+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitSequenceCommand(this,arg);
    }
}

abstract class Expression extends AST {
    String type_of_expression ;
}

/*class VariableExpression extends Expression{
    Terminal id ;

    VariableExpression(Terminal id){
    this.id = id ;
    }
}*/

class IntegerLiteralExpression extends Expression {
    String value ;
    
    IntegerLiteralExpression( String value ) {
        this.value = value ;
        this.type_of_expression = "integerliteral" ;
    }
    
    public String toString() {
            return("[ "+value+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitIntegerLiteralExpression(this,arg);
    }
}

class BooleanLiteralExpression extends Expression{
    String value ;
    
    BooleanLiteralExpression( String value ) {
        this.value = value ;
        this.type_of_expression = "booleanliteral" ;
    }
    
    public String toString() {
            return("[ "+value+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitBooleanLiteralExpression(this,arg);
    }
}

class NullLiteralExpression extends Expression{
    String value ;
    
    NullLiteralExpression( String value ) {
        this.value = value ;
        this.type_of_expression = "nullliteral" ;
    }
    
    public String toString() {
            return("[ "+value+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitNullLiteralExpression(this,arg);
    }
}

class SimplePWLExpression extends Expression {
    Expression exp ;
    
    SimplePWLExpression(Expression exp){
        this.exp = exp ;
        this.type_of_expression = "simplepwl" ;
    }
    
    public String toString() {
            return("[ "+exp+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitSimplePWLExpression(this,arg);
    }
}

class ClassInstanceCreationExpression extends Expression {
    Name name ;
    Expression expression ;
    
    ClassInstanceCreationExpression( Name name, Expression expression ) {
        this.name = name ;
        this.expression = expression ;
        this.type_of_expression = "classinstance" ;
    }
    
    public String toString() {
        return("[ "+name+expression+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitClassInstanceCreationExpression(this,arg);
    }
}

class ThisAndNameExpression extends Expression {
    ThisAndName tan ;
    
    
    ThisAndNameExpression(ThisAndName tan){
        this.tan = tan ;
        this.type_of_expression = "thisandname" ;
    }
    
    public String toString() {
            return("[ "+tan+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitThisAndNameExpression(this,arg);
    }
}

class MethodCallExpression extends Expression {
    ThisAndName tan ;
    Expression exp ;
    
    MethodCallExpression(ThisAndName tan, Expression exp) {
        this.tan = tan ;
        this.exp = exp ;
        this.type_of_expression = "methodcall" ;
    }
    
    public String toString() {
            return("[ "+tan+exp+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitMethodCallExpression(this,arg);
    }
}

class JustThis extends Expression{
    String word;
    
    JustThis(String word){
        this.word = word ;
        this.type_of_expression = "justthis" ;
    }
    
    public String toString() {
            return("[ "+word+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitJustThis(this,arg);
    }
}
class BinaryOpExpression extends Expression{
    Expression expressionone ;
    Terminal operator ;
    Expression expressiontwo ;
    
    BinaryOpExpression( Expression expressionone, Terminal operator, Expression expressiontwo){
        this.expressionone = expressionone ;
        this.operator = operator ;
        this.expressiontwo = expressiontwo ;
    }
    
    public String toString() {
        return("[ "+expressionone+operator+expressiontwo+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitBinaryOpExpression(this,arg);
    }
}

class UnaryOpExpression extends Expression{
    Terminal op ;
    Expression exp ;

    UnaryOpExpression( Terminal op, Expression exp){
    this.op = op ;
    this.exp = exp ;        
    }
    
    public String toString() {
        return("[ "+op+exp+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitUnaryOpExpression(this,arg);
    }
}

class SequenceExpression extends Expression {
    Expression expressionone ;
    Expression expressiontwo ;
    
    SequenceExpression( Expression expressionone, Expression expressiontwo ) {
        this.expressionone = expressionone ;
        this.expressiontwo = expressiontwo ;
    }
    
    public String toString() {
        return("[ "+expressionone+expressiontwo+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitSequenceExpression(this,arg);
    }
}


class ThisAndName extends Command {
    Name name ;
    boolean thisavailability ;
    
    ThisAndName( Name name, boolean thisavailability ) {
        this.name = name ;
        this.thisavailability = thisavailability ;
    }
    
    public String toString() {
        if(thisavailability == true ){
            return("[this. "+name+" ]");
        }else{
            return("[ "+name+" ]");
        }
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitThisAndName(this,arg);
    }
}

class Terminal extends AST {
    String terminal ;
    
    Terminal( String terminal ) {
        this.terminal = terminal ;
    }
    
    public String toString() {
        return("[ "+terminal+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitTerminal(this,arg);
    }
}

class Modifier extends AST{
    String str;
    
    Modifier( String str ) {
        this.str = str ;
    }
    
    public String toString() {
        return("[ "+ str +" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitModifier(this,arg);
    }
}

class Static extends AST{
    String modifier;
    
    Static( String modifier ) {
        this.modifier = modifier ;
    }
    
    public String toString() {
        return("[ "+modifier+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitStatic(this,arg);
    }
}

/*class Final extends AST{
    String modifier;
    
    Final( String modifier ) {
        this.modifier = modifier ;
    }
}*/

abstract class Type extends AST {
    boolean ptype ;
    Terminal primitivetype ;
    Name name ;
}

class PrimitiveType extends Type{
    // int | boolean | void
    
    PrimitiveType( Terminal primitivetype ) {
        this.primitivetype = primitivetype ;
        this.ptype = true ;
    }
    
    public String toString() {
        return("[ "+primitivetype+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitPrimitiveType(this,arg);
    }
}

class ReferenceType extends Type{
    
    
    ReferenceType( Name name ) {
        this.name = name ;
        this.ptype = false ;
    }
    public String toString() {
        return("[ "+name+" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitReferenceType(this,arg);
    }
}

class Name extends Expression{
    String name;
    
    Name(String name){
        this.name = name ;
    }
    
    public String toString() {
        return("[ "+ name +" ]");
    }
    
    public Object visit(ASTVisitor v,Object arg){
        return v.visitName(this,arg);
    }
}
Hosted by www.Geocities.ws

1