view ast/Exp.d @ 1:2168f4cb73f1

First push
author johnsen@johnsen-desktop
date Fri, 18 Apr 2008 02:01:38 +0200
parents
children 2ce5209f1954
line wrap: on
line source

module ast.Exp;

import tango.text.Util : jhash;

import lexer.Token;

import sema.SymbolTable;

enum ExpType
{
    Binary,
    Negate,
    IntegerLit,
    Identifier,
    AssignExp,
    CallExp,
}

class Exp
{
    this(ExpType expType) 
    {
        this.expType = expType;
    }

    ExpType expType;
    Scope env;
}

class CallExp : Exp
{
    this(Exp exp, Exp[] args)
    {
        super(ExpType.CallExp);
        this.exp = exp;
        this.args = args;
    }

    Exp exp;
    Exp[] args;
}

class AssignExp : Exp
{
    this(Identifier identifier, Exp exp)
    {
        super(ExpType.AssignExp);
        this.identifier = identifier;
        this.exp = exp;
    }

    Identifier identifier;
    Exp exp;
}

class BinaryExp : Exp
{
    public enum Operator : char
    {
        Mul = '*', Div = '/',
        Add = '+', Sub = '-'
    }

    this(Operator op, Exp left, Exp right)
    {
        super(ExpType.Binary);
        this.op = op;
        this.left = left;
        this.right = right;
    }

    Operator op;
    Exp left, right;
}

class NegateExp : Exp
{
    this(Exp exp)
    {
        super(ExpType.Negate);
        this.exp = exp;
    }

    public Exp exp;
}

class IntegerLit : Exp
{
    this(Token t)
    {
        super(ExpType.IntegerLit);
        this.token = t;
    }

    Token token;
}

class Identifier : Exp
{
    this(Token t)
    {
        super(ExpType.Identifier);
        this.token = t;
        name = t.get;
    }

    char[] get()
    {
        return name;
    }

    hash_t toHash()
    {
        return jhash(name);
    }

    int opCmp(Object o)
    {
        if (auto id = cast(Identifier)o)
            return typeid(char[]).compare(&name, &id.name);
        return 0;
    }

    int opEquals(Object o)
    {
        if (auto id = cast(Identifier)o)
            return typeid(char[]).equals(&name, &id.name);
        return 0;
    }

    Token token;
    char[] name;
}