/*
* 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);
}
}