diff --git a/sources/zweic/Tree.scala b/sources/zweic/Tree.scala new file mode 100755 index 0000000..123fdcf --- /dev/null +++ b/sources/zweic/Tree.scala @@ -0,0 +1,159 @@ +/* zweic -- a compiler for zwei + * + * Stephane Micheloud & LAMP + * + * $Id$ + */ + +package zweic; + +import Operators.Operator; + +//############################################################################ +// The root of the tree node hierarchy + +/** + * Class Tree defines the type of all abstract syntax tree nodes. + */ +abstract class Tree { + + /** + * The source code position of this tree node. + * Has to be set explicitly woth the setPos method + */ + private var p: Int = Position.UNDEFINED; + def pos: Int = p; + def setPos(p: Int): this.type = { this.p = p; this } + +} + +//############################################################################ +// Tree node representing a complete program + +/** + * P = Program { D } E + */ +case class Program(classes: List[ClassDef], main: Expr) + extends Tree; + +//############################################################################ +// Tree nodes for definitions + +/** + * A common superclass for all definitions + */ +abstract class Def extends Tree { + def name: Name; +} + +/** + * D = ClassDef name [ name ] { M } + */ +case class ClassDef( +// ... � compl�ter ... + ) + extends Def; + + +/** + * A common superclass for member definitions + */ +abstract class Member extends Def; + +/** + * M = FieldDecl name T + */ +case class FieldDecl( +// ... � compl�ter ... + ) + extends Member; + + +/** + * D = MethodDecl name name { name T } T E + */ +case class MethodDef( +// ... � compl�ter ... + ) + extends Member; + +//############################################################################ +// Tree nodes for types + +/** + * A common superclass for tree nodes designating types + */ +abstract class TypeTree extends Tree; + +/** + * T = Int + */ +case class IntType extends TypeTree; + +/** + * T = Null + */ +case class NullType extends TypeTree; + +/** + * T = ClassType name + */ +case class ClassType(name: Name) extends TypeTree; + +//############################################################################ +// Tree nodes for statements + +/** + * A common superclass for all statements + */ +abstract class Stat extends Tree; + +/** + * S = While E { S } + */ +case class While(cond: Expr, stats: List[Stat]) extends Stat; + +/** + * S = Var name T E + */ +case class Var(varname: Name, vartype: TypeTree, init: Expr) + extends Stat; + +/** + * S = Set name E + */ +case class Set(name: Name, expr: Expr) extends Stat; + +/** + * S = Do E + */ +case class Do(expr: Expr) extends Stat; + +/** + * S = PrintInt E + */ +case class PrintInt(expr: Expr) extends Stat; + +/** + * S = PrintChar E + */ +case class PrintChar(expr: Expr) extends Stat; + +//############################################################################ +// Tree nodes for expressions + +/** + * A common superclass for expressions + */ +abstract class Expr extends Tree; + +// ... � compl�ter ... + +/** + * E = Unop O E + */ +case class Unop(op: Operator, expr: Expr) extends Expr; + +// ... � compl�ter ... + +//############################################################################