# HG changeset patch # User Aziz K?ksal # Date 1199570763 -3600 # Node ID e25345656d10217a7c14eef9afa6efb63ee566cb # Parent 05c375fb2d5c41dd07fc7c336898eb0dc0a2c226 Moved dil.Expressions to dil.ast.Expressions. diff -r 05c375fb2d5c -r e25345656d10 trunk/src/dil/Expressions.d --- a/trunk/src/dil/Expressions.d Sat Jan 05 23:01:42 2008 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1243 +0,0 @@ -/++ - Author: Aziz Köksal - License: GPL3 -+/ -module dil.Expressions; - -import dil.ast.Node; -import dil.Token; -import dil.Types; -import dil.ast.Declarations; -import dil.Statements; -import dil.Identifier; -import dil.Scope; -import dil.semantic.Types; -import common; - -abstract class Expression : Node -{ - Type type; /// The type of this expression. - this() - { - super(NodeCategory.Expression); - } - - // Semantic analysis: - - Expression semantic(Scope scop) - { - debug Stdout("SA for "~this.classinfo.name).newline; - if (!type) - type = Types.Undefined; - return this; - } - - Expression evaluate() - { - return null; - } - - import dil.Messages; - void error(Scope scop, MID mid) - { - scop.error(this.begin, mid); - } - - void error(Scope scop, char[] msg) - { - - } -} - -class EmptyExpression : Expression -{ - this() - { - mixin(set_kind); - } -} - -abstract class BinaryExpression : Expression -{ - Expression left, right; - Token* tok; - this(Expression left, Expression right, Token* tok) - { - addChildren([left, right]); - this.left = left; - this.right = right; - this.tok = tok; - } - - override Expression semantic(Scope scop) - { - left = left.semantic(scop); - right = right.semantic(scop); - return this; - } -} - -class CondExpression : BinaryExpression -{ - Expression condition; - this(Expression condition, Expression left, Expression right, Token* tok) - { - addChild(condition); - super(left, right, tok); - mixin(set_kind); - this.condition = condition; - } -} - -class CommaExpression : BinaryExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class OrOrExpression : BinaryExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class AndAndExpression : BinaryExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class OrExpression : BinaryExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class XorExpression : BinaryExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class AndExpression : BinaryExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -abstract class CmpExpression : BinaryExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - } -} - -class EqualExpression : CmpExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class IdentityExpression : CmpExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class RelExpression : CmpExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class InExpression : BinaryExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class LShiftExpression : BinaryExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class RShiftExpression : BinaryExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class URShiftExpression : BinaryExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class PlusExpression : BinaryExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class MinusExpression : BinaryExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class CatExpression : BinaryExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class MulExpression : BinaryExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class DivExpression : BinaryExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class ModExpression : BinaryExpression -{ - this(Expression left, Expression right, Token* tok) - { - super(left, right, tok); - mixin(set_kind); - } -} - -class AssignExpression : BinaryExpression -{ - this(Expression left, Expression right) - { - super(left, right, null); - mixin(set_kind); - } -} -class LShiftAssignExpression : BinaryExpression -{ - this(Expression left, Expression right) - { - super(left, right, null); - mixin(set_kind); - } -} -class RShiftAssignExpression : BinaryExpression -{ - this(Expression left, Expression right) - { - super(left, right, null); - mixin(set_kind); - } -} -class URShiftAssignExpression : BinaryExpression -{ - this(Expression left, Expression right) - { - super(left, right, null); - mixin(set_kind); - } -} -class OrAssignExpression : BinaryExpression -{ - this(Expression left, Expression right) - { - super(left, right, null); - mixin(set_kind); - } -} -class AndAssignExpression : BinaryExpression -{ - this(Expression left, Expression right) - { - super(left, right, null); - mixin(set_kind); - } -} -class PlusAssignExpression : BinaryExpression -{ - this(Expression left, Expression right) - { - super(left, right, null); - mixin(set_kind); - } -} -class MinusAssignExpression : BinaryExpression -{ - this(Expression left, Expression right) - { - super(left, right, null); - mixin(set_kind); - } -} -class DivAssignExpression : BinaryExpression -{ - this(Expression left, Expression right) - { - super(left, right, null); - mixin(set_kind); - } -} -class MulAssignExpression : BinaryExpression -{ - this(Expression left, Expression right) - { - super(left, right, null); - mixin(set_kind); - } -} -class ModAssignExpression : BinaryExpression -{ - this(Expression left, Expression right) - { - super(left, right, null); - mixin(set_kind); - } -} -class XorAssignExpression : BinaryExpression -{ - this(Expression left, Expression right) - { - super(left, right, null); - mixin(set_kind); - } -} -class CatAssignExpression : BinaryExpression -{ - this(Expression left, Expression right) - { - super(left, right, null); - mixin(set_kind); - } -} - -abstract class UnaryExpression : Expression -{ - Expression e; - this(Expression e) - { - addChild(e); - this.e = e; - } -} - -class AddressExpression : UnaryExpression -{ - this(Expression e) - { - super(e); - mixin(set_kind); - } -} - -class PreIncrExpression : UnaryExpression -{ - this(Expression e) - { - super(e); - mixin(set_kind); - } -} - -class PreDecrExpression : UnaryExpression -{ - this(Expression e) - { - super(e); - mixin(set_kind); - } -} - -class PostIncrExpression : UnaryExpression -{ - this(Expression e) - { - super(e); - mixin(set_kind); - } -} - -class PostDecrExpression : UnaryExpression -{ - this(Expression e) - { - super(e); - mixin(set_kind); - } -} - -class DerefExpression : UnaryExpression -{ - this(Expression e) - { - super(e); - mixin(set_kind); - } -} - -class SignExpression : UnaryExpression -{ - this(Expression e) - { - super(e); - mixin(set_kind); - } -} - -class NotExpression : UnaryExpression -{ - this(Expression e) - { - super(e); - mixin(set_kind); - } -} - -class CompExpression : UnaryExpression -{ - this(Expression e) - { - super(e); - mixin(set_kind); - } -} -/+ -class DotIdExpression : UnaryExpression -{ - string ident; - this(Expression e, string ident) - { - super(e); - this.ident = ident; - } -} -+/ -/+ -class DotTemplateInstanceExpression : UnaryExpression -{ - string ident; - TemplateArguments targs; - this(Expression e, string ident, TemplateArguments targs) - { - super(e); - this.ident = ident; - this.targs = targs; - } -} -+/ -class PostDotListExpression : UnaryExpression -{ - DotListExpression dotList; - this(Expression e, DotListExpression dotList) - { - super(e); - mixin(set_kind); - addChild(dotList); - this.dotList = dotList; - } -} - -class CallExpression : UnaryExpression -{ - Expression[] args; - this(Expression e, Expression[] args) - { - super(e); - mixin(set_kind); - addOptChildren(args); - this.args = args; - } -} - -class NewExpression : /*Unary*/Expression -{ - Expression[] newArgs; - TypeNode type; - Expression[] ctorArgs; - this(/*Expression e, */Expression[] newArgs, TypeNode type, Expression[] ctorArgs) - { - /*super(e);*/ - mixin(set_kind); - addOptChildren(newArgs); - addChild(type); - addOptChildren(ctorArgs); - this.newArgs = newArgs; - this.type = type; - this.ctorArgs = ctorArgs; - } -} - -class NewAnonClassExpression : /*Unary*/Expression -{ - Expression[] newArgs; - BaseClass[] bases; - Expression[] ctorArgs; - Declarations decls; - this(/*Expression e, */Expression[] newArgs, BaseClass[] bases, Expression[] ctorArgs, Declarations decls) - { - /*super(e);*/ - mixin(set_kind); - addOptChildren(newArgs); - addOptChildren(bases); - addOptChildren(ctorArgs); - addChild(decls); - - this.newArgs = newArgs; - this.bases = bases; - this.ctorArgs = ctorArgs; - this.decls = decls; - } -} - -class DeleteExpression : UnaryExpression -{ - this(Expression e) - { - super(e); - mixin(set_kind); - } -} - -class CastExpression : UnaryExpression -{ - TypeNode type; - this(Expression e, TypeNode type) - { - addChild(type); // Add type before super(). - super(e); - mixin(set_kind); - this.type = type; - } -} - -class IndexExpression : UnaryExpression -{ - Expression[] args; - this(Expression e, Expression[] args) - { - super(e); - mixin(set_kind); - addChildren(args); - this.args = args; - } -} - -class SliceExpression : UnaryExpression -{ - Expression left, right; - this(Expression e, Expression left, Expression right) - { - super(e); - mixin(set_kind); - assert(left ? (right !is null) : right is null); - if (left) - addChildren([left, right]); - - this.left = left; - this.right = right; - } -} - -/* -class PrimaryExpression -{ - -} -*/ - -class IdentifierExpression : Expression -{ - Identifier* identifier; - this(Identifier* identifier) - { - mixin(set_kind); - this.identifier = identifier; - } -} - -class SpecialTokenExpression : Expression -{ - Token* specialToken; - this(Token* specialToken) - { - mixin(set_kind); - this.specialToken = specialToken; - } - - Expression e; /// The expression created in the semantic phase. - - override Expression semantic(Scope) - { - if (type) - return e; - switch (specialToken.type) - { - case TOK.LINE, TOK.VERSION: - e = new IntExpression(specialToken.uint_, Types.Uint); - break; - case TOK.FILE, TOK.DATE, TOK.TIME, TOK.TIMESTAMP, TOK.VENDOR: - e = new StringExpression(specialToken.str); - break; - default: - assert(0); - } - type = e.type; - return e; - } -} - -/* -class IdentifierListExpression : Expression -{ - Expression[] identList; - this(Expression[] identList) - { - this.identList = identList; - } -} -*/ - -class DotExpression : Expression -{ - this() - { - mixin(set_kind); - } -} - -class DotListExpression : Expression -{ - Expression[] items; - this(Expression[] items) - { - mixin(set_kind); - addChildren(items); - this.items = items; - } -} - -class TemplateInstanceExpression : Expression -{ - Identifier* ident; - TemplateArguments targs; - this(Identifier* ident, TemplateArguments targs) - { - mixin(set_kind); - addOptChild(targs); - this.ident = ident; - this.targs = targs; - } -} - -class ThisExpression : Expression -{ - this() - { - mixin(set_kind); - } -} - -class SuperExpression : Expression -{ - this() - { - mixin(set_kind); - } -} - -class NullExpression : Expression -{ - this() - { - mixin(set_kind); - } - - this(Type type) - { - this(); - this.type = type; - } - - override Expression semantic(Scope) - { - if (!type) - type = Types.Void_ptr; - return this; - } -} - -class DollarExpression : Expression -{ - this() - { - mixin(set_kind); - } - - override Expression semantic(Scope scop) - { - if (type) - return this; - type = Types.Size_t; - // if (!scop.inArraySubscript) - // error(scop, "$ can only be in an array subscript."); - return this; - } -} - -class BoolExpression : Expression -{ - this() - { - mixin(set_kind); - } - - Expression e; - override Expression semantic(Scope scop) - { - if (type) - return this; - assert(this.begin !is null); - auto b = (this.begin.type == TOK.True) ? true : false; - e = new IntExpression(b, Types.Bool); - type = Types.Bool; - return this; - } -} - -class IntExpression : Expression -{ - ulong number; - - this(ulong number, Type type) - { - mixin(set_kind); - this.number = number; - this.type = type; - } - - this(Token* token) - { - auto type = Types.Int; // Should be most common case. - switch (token.type) - { - // case TOK.Int32: - // type = Types.Int; break; - case TOK.Uint32: - type = Types.Uint; break; - case TOK.Int64: - type = Types.Long; break; - case TOK.Uint64: - type = Types.Ulong; break; - default: - assert(token.type == TOK.Int32); - } - this(token.ulong_, type); - } - - override Expression semantic(Scope) - { - if (type) - return this; - - if (number & 0x8000_0000_0000_0000) - type = Types.Ulong; // 0xFFFF_FFFF_FFFF_FFFF - else if (number & 0xFFFF_FFFF_0000_0000) - type = Types.Long; // 0x7FFF_FFFF_FFFF_FFFF - else if (number & 0x8000_0000) - type = Types.Uint; // 0xFFFF_FFFF - else - type = Types.Int; // 0x7FFF_FFFF - return this; - } -} - -class RealExpression : Expression -{ - real number; - - this(real number, Type type) - { - mixin(set_kind); - this.number = number; - this.type = type; - } - - this(Token* token) - { - auto type = Types.Double; // Most common case? - switch (token.type) - { - case TOK.Float32: - type = Types.Float; break; - // case TOK.Float64: - // type = Types.Double; break; - case TOK.Float80: - type = Types.Real; break; - case TOK.Imaginary32: - type = Types.Ifloat; break; - case TOK.Imaginary64: - type = Types.Idouble; break; - case TOK.Imaginary80: - type = Types.Ireal; break; - default: - assert(token.type == TOK.Float64); - } - this(token.real_, type); - } - - override Expression semantic(Scope) - { - if (type) - return this; - type = Types.Double; - return this; - } -} - -/++ - This expression holds a complex number. - It is only created in the semantic phase. -+/ -class ComplexExpression : Expression -{ - creal number; - - this(creal number, Type type) - { - mixin(set_kind); - this.number = number; - this.type = type; - } - - override Expression semantic(Scope) - { - if (type) - return this; - type = Types.Cdouble; - return this; - } -} - -class CharExpression : Expression -{ - dchar character; - this(dchar character) - { - mixin(set_kind); - this.character = character; - } - - override Expression semantic(Scope scop) - { - if (type) - return this; - if (character <= 0xFF) - type = Types.Char; - else if (character <= 0xFFFF) - type = Types.Wchar; - else - type = Types.Dchar; - return this; - } -} - -class StringExpression : Expression -{ - Token*[] stringTokens; - this() - { mixin(set_kind); } - - /// Constructor used in parsing phase. - this(Token*[] stringTokens) - { - this(); - this.stringTokens = stringTokens; - } - - ubyte[] str; /// The string data. - Type charType; /// The character type of the string. - // Constructors used in semantic phase. - this(ubyte[] str, Type charType) - { - this(); - this.str = str; - this.charType = charType; - type = new TypeSArray(charType, str.length); - } - - this(char[] str) - { - this(cast(ubyte[])str, Types.Char); - } - this(wchar[] str) - { - this(cast(ubyte[])str, Types.Wchar); - } - this(dchar[] str) - { - this(cast(ubyte[])str, Types.Dchar); - } - - override Expression semantic(Scope scop) - { - if (type) - return this; - return this; - } - - char[] getString() - { - char[] buffer; - foreach (token; stringTokens) - buffer ~= token.str[0..$-1]; - return buffer; - } -} - -class ArrayLiteralExpression : Expression -{ - Expression[] values; - this(Expression[] values) - { - mixin(set_kind); - addOptChildren(values); - this.values = values; - } -} - -class AArrayLiteralExpression : Expression -{ - Expression[] keys, values; - this(Expression[] keys, Expression[] values) - { - assert(keys.length == values.length); - mixin(set_kind); - foreach (i, key; keys) - addChildren([key, values[i]]); - this.keys = keys; - this.values = values; - } -} - -class AssertExpression : Expression -{ - Expression expr, msg; - this(Expression expr, Expression msg) - { - mixin(set_kind); - addChild(expr); - addOptChild(msg); - this.expr = expr; - this.msg = msg; - } -} - -class MixinExpression : Expression -{ - Expression expr; - this(Expression expr) - { - mixin(set_kind); - addChild(expr); - this.expr = expr; - } - - // import dil.Parser; - override Expression semantic(Scope scop) - { - // TODO: - /+ - auto expr = this.expr.semantic(scop); - auto strExpr = Cast!(StringExpression)(expr); - // if (strExpr is null) - // error(scop, MID.MixinExpressionMustBeString); - auto parser = new Parser(strExpr.getString(), "", scop.infoMan); - expr = parser.start2(); - return expr; - +/ - return null; - } -} - -class ImportExpression : Expression -{ - Expression expr; - this(Expression expr) - { - mixin(set_kind); - addChild(expr); - this.expr = expr; - } -} - -class TypeofExpression : Expression -{ - TypeNode type; - this(TypeNode type) - { - mixin(set_kind); - addChild(type); - this.type = type; - } -} - -class TypeDotIdExpression : Expression -{ - TypeNode type; - Identifier* ident; - this(TypeNode type, Identifier* ident) - { - mixin(set_kind); - addChild(type); - this.type = type; - this.ident = ident; - } -} - -class TypeidExpression : Expression -{ - TypeNode type; - this(TypeNode type) - { - mixin(set_kind); - addChild(type); - this.type = type; - } -} - -class IsExpression : Expression -{ - TypeNode type; - Identifier* ident; - Token* opTok, specTok; - TypeNode specType; - TemplateParameters tparams; // D 2.0 - this(TypeNode type, Identifier* ident, Token* opTok, Token* specTok, - TypeNode specType, typeof(tparams) tparams) - { - mixin(set_kind); - addChild(type); - addOptChild(specType); - version(D2) - addOptChild(tparams); - this.type = type; - this.ident = ident; - this.opTok = opTok; - this.specTok = specTok; - this.specType = specType; - this.tparams = tparams; - } -} - -class FunctionLiteralExpression : Expression -{ - TypeNode returnType; - Parameters parameters; - FunctionBody funcBody; - - this() - { - mixin(set_kind); - addOptChild(returnType); - addOptChild(parameters); - addChild(funcBody); - } - - this(TypeNode returnType, Parameters parameters, FunctionBody funcBody) - { - this.returnType = returnType; - this.parameters = parameters; - this.funcBody = funcBody; - this(); - } - - this(FunctionBody funcBody) - { - this.funcBody = funcBody; - this(); - } -} - -version(D2) -{ -class TraitsExpression : Expression -{ - Identifier* ident; - TemplateArguments targs; - this(typeof(ident) ident, typeof(targs) targs) - { - mixin(set_kind); - addOptChild(targs); - this.ident = ident; - this.targs = targs; - } -} -} - -class VoidInitializer : Expression -{ - this() - { - mixin(set_kind); - } -} - -class ArrayInitializer : Expression -{ - Expression[] keys; - Expression[] values; - this(Expression[] keys, Expression[] values) - { - assert(keys.length == values.length); - mixin(set_kind); - foreach (i, key; keys) - { - addOptChild(key); // The key is optional in ArrayInitializers. - addChild(values[i]); - } - this.keys = keys; - this.values = values; - } -} - -class StructInitializer : Expression -{ - Identifier*[] idents; - Expression[] values; - this(Identifier*[] idents, Expression[] values) - { - mixin(set_kind); - addOptChildren(values); - this.idents = idents; - this.values = values; - } -} - -class AsmTypeExpression : UnaryExpression -{ - this(Expression e) - { - super(e); - mixin(set_kind); - } -} - -class AsmOffsetExpression : UnaryExpression -{ - this(Expression e) - { - super(e); - mixin(set_kind); - } -} - -class AsmSegExpression : UnaryExpression -{ - this(Expression e) - { - super(e); - mixin(set_kind); - } -} - -class AsmPostBracketExpression : UnaryExpression -{ - this(Expression e) - { - super(e); - mixin(set_kind); - } -} - -class AsmBracketExpression : Expression -{ - Expression e; - this(Expression e) - { - mixin(set_kind); - addChild(e); - this.e = e; - } -} - -class AsmLocalSizeExpression : Expression -{ - this() - { - mixin(set_kind); - } -} - -class AsmRegisterExpression : Expression -{ - Identifier* register; - int number; // ST(0) - ST(7) or FS:0, FS:4, FS:8 - this(Identifier* register, int number = -1) - { - mixin(set_kind); - this.register = register; - this.number = number; - } -} diff -r 05c375fb2d5c -r e25345656d10 trunk/src/dil/SettingsLoader.d --- a/trunk/src/dil/SettingsLoader.d Sat Jan 05 23:01:42 2008 +0100 +++ b/trunk/src/dil/SettingsLoader.d Sat Jan 05 23:06:03 2008 +0100 @@ -6,7 +6,7 @@ import dil.Settings; import dil.Messages; -import dil.Module, dil.ast.Node, dil.ast.Declarations, dil.Expressions; +import dil.Module, dil.ast.Node, dil.ast.Declarations, dil.ast.Expressions; import dil.File; import tango.io.FilePath; import common; diff -r 05c375fb2d5c -r e25345656d10 trunk/src/dil/Statements.d --- a/trunk/src/dil/Statements.d Sat Jan 05 23:01:42 2008 +0100 +++ b/trunk/src/dil/Statements.d Sat Jan 05 23:06:03 2008 +0100 @@ -5,7 +5,7 @@ module dil.Statements; import dil.ast.Node; -import dil.Expressions; +import dil.ast.Expressions; import dil.ast.Declarations; import dil.Types; import dil.Token; diff -r 05c375fb2d5c -r e25345656d10 trunk/src/dil/Types.d --- a/trunk/src/dil/Types.d Sat Jan 05 23:01:42 2008 +0100 +++ b/trunk/src/dil/Types.d Sat Jan 05 23:06:03 2008 +0100 @@ -6,7 +6,7 @@ import dil.ast.Node; import dil.Token; -import dil.Expressions; +import dil.ast.Expressions; import dil.Enums; import dil.Identifier; import dil.Scope; diff -r 05c375fb2d5c -r e25345656d10 trunk/src/dil/ast/Declarations.d --- a/trunk/src/dil/ast/Declarations.d Sat Jan 05 23:01:42 2008 +0100 +++ b/trunk/src/dil/ast/Declarations.d Sat Jan 05 23:06:03 2008 +0100 @@ -5,7 +5,7 @@ module dil.ast.Declarations; import dil.ast.Node; -import dil.Expressions; +import dil.ast.Expressions; import dil.Types; import dil.Statements; import dil.Token; diff -r 05c375fb2d5c -r e25345656d10 trunk/src/dil/ast/Expressions.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/trunk/src/dil/ast/Expressions.d Sat Jan 05 23:06:03 2008 +0100 @@ -0,0 +1,1243 @@ +/++ + Author: Aziz Köksal + License: GPL3 ++/ +module dil.ast.Expressions; + +import dil.ast.Node; +import dil.Token; +import dil.Types; +import dil.ast.Declarations; +import dil.Statements; +import dil.Identifier; +import dil.Scope; +import dil.semantic.Types; +import common; + +abstract class Expression : Node +{ + Type type; /// The type of this expression. + this() + { + super(NodeCategory.Expression); + } + + // Semantic analysis: + + Expression semantic(Scope scop) + { + debug Stdout("SA for "~this.classinfo.name).newline; + if (!type) + type = Types.Undefined; + return this; + } + + Expression evaluate() + { + return null; + } + + import dil.Messages; + void error(Scope scop, MID mid) + { + scop.error(this.begin, mid); + } + + void error(Scope scop, char[] msg) + { + + } +} + +class EmptyExpression : Expression +{ + this() + { + mixin(set_kind); + } +} + +abstract class BinaryExpression : Expression +{ + Expression left, right; + Token* tok; + this(Expression left, Expression right, Token* tok) + { + addChildren([left, right]); + this.left = left; + this.right = right; + this.tok = tok; + } + + override Expression semantic(Scope scop) + { + left = left.semantic(scop); + right = right.semantic(scop); + return this; + } +} + +class CondExpression : BinaryExpression +{ + Expression condition; + this(Expression condition, Expression left, Expression right, Token* tok) + { + addChild(condition); + super(left, right, tok); + mixin(set_kind); + this.condition = condition; + } +} + +class CommaExpression : BinaryExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class OrOrExpression : BinaryExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class AndAndExpression : BinaryExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class OrExpression : BinaryExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class XorExpression : BinaryExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class AndExpression : BinaryExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +abstract class CmpExpression : BinaryExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + } +} + +class EqualExpression : CmpExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class IdentityExpression : CmpExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class RelExpression : CmpExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class InExpression : BinaryExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class LShiftExpression : BinaryExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class RShiftExpression : BinaryExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class URShiftExpression : BinaryExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class PlusExpression : BinaryExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class MinusExpression : BinaryExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class CatExpression : BinaryExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class MulExpression : BinaryExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class DivExpression : BinaryExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class ModExpression : BinaryExpression +{ + this(Expression left, Expression right, Token* tok) + { + super(left, right, tok); + mixin(set_kind); + } +} + +class AssignExpression : BinaryExpression +{ + this(Expression left, Expression right) + { + super(left, right, null); + mixin(set_kind); + } +} +class LShiftAssignExpression : BinaryExpression +{ + this(Expression left, Expression right) + { + super(left, right, null); + mixin(set_kind); + } +} +class RShiftAssignExpression : BinaryExpression +{ + this(Expression left, Expression right) + { + super(left, right, null); + mixin(set_kind); + } +} +class URShiftAssignExpression : BinaryExpression +{ + this(Expression left, Expression right) + { + super(left, right, null); + mixin(set_kind); + } +} +class OrAssignExpression : BinaryExpression +{ + this(Expression left, Expression right) + { + super(left, right, null); + mixin(set_kind); + } +} +class AndAssignExpression : BinaryExpression +{ + this(Expression left, Expression right) + { + super(left, right, null); + mixin(set_kind); + } +} +class PlusAssignExpression : BinaryExpression +{ + this(Expression left, Expression right) + { + super(left, right, null); + mixin(set_kind); + } +} +class MinusAssignExpression : BinaryExpression +{ + this(Expression left, Expression right) + { + super(left, right, null); + mixin(set_kind); + } +} +class DivAssignExpression : BinaryExpression +{ + this(Expression left, Expression right) + { + super(left, right, null); + mixin(set_kind); + } +} +class MulAssignExpression : BinaryExpression +{ + this(Expression left, Expression right) + { + super(left, right, null); + mixin(set_kind); + } +} +class ModAssignExpression : BinaryExpression +{ + this(Expression left, Expression right) + { + super(left, right, null); + mixin(set_kind); + } +} +class XorAssignExpression : BinaryExpression +{ + this(Expression left, Expression right) + { + super(left, right, null); + mixin(set_kind); + } +} +class CatAssignExpression : BinaryExpression +{ + this(Expression left, Expression right) + { + super(left, right, null); + mixin(set_kind); + } +} + +abstract class UnaryExpression : Expression +{ + Expression e; + this(Expression e) + { + addChild(e); + this.e = e; + } +} + +class AddressExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} + +class PreIncrExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} + +class PreDecrExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} + +class PostIncrExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} + +class PostDecrExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} + +class DerefExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} + +class SignExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} + +class NotExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} + +class CompExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} +/+ +class DotIdExpression : UnaryExpression +{ + string ident; + this(Expression e, string ident) + { + super(e); + this.ident = ident; + } +} ++/ +/+ +class DotTemplateInstanceExpression : UnaryExpression +{ + string ident; + TemplateArguments targs; + this(Expression e, string ident, TemplateArguments targs) + { + super(e); + this.ident = ident; + this.targs = targs; + } +} ++/ +class PostDotListExpression : UnaryExpression +{ + DotListExpression dotList; + this(Expression e, DotListExpression dotList) + { + super(e); + mixin(set_kind); + addChild(dotList); + this.dotList = dotList; + } +} + +class CallExpression : UnaryExpression +{ + Expression[] args; + this(Expression e, Expression[] args) + { + super(e); + mixin(set_kind); + addOptChildren(args); + this.args = args; + } +} + +class NewExpression : /*Unary*/Expression +{ + Expression[] newArgs; + TypeNode type; + Expression[] ctorArgs; + this(/*Expression e, */Expression[] newArgs, TypeNode type, Expression[] ctorArgs) + { + /*super(e);*/ + mixin(set_kind); + addOptChildren(newArgs); + addChild(type); + addOptChildren(ctorArgs); + this.newArgs = newArgs; + this.type = type; + this.ctorArgs = ctorArgs; + } +} + +class NewAnonClassExpression : /*Unary*/Expression +{ + Expression[] newArgs; + BaseClass[] bases; + Expression[] ctorArgs; + Declarations decls; + this(/*Expression e, */Expression[] newArgs, BaseClass[] bases, Expression[] ctorArgs, Declarations decls) + { + /*super(e);*/ + mixin(set_kind); + addOptChildren(newArgs); + addOptChildren(bases); + addOptChildren(ctorArgs); + addChild(decls); + + this.newArgs = newArgs; + this.bases = bases; + this.ctorArgs = ctorArgs; + this.decls = decls; + } +} + +class DeleteExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} + +class CastExpression : UnaryExpression +{ + TypeNode type; + this(Expression e, TypeNode type) + { + addChild(type); // Add type before super(). + super(e); + mixin(set_kind); + this.type = type; + } +} + +class IndexExpression : UnaryExpression +{ + Expression[] args; + this(Expression e, Expression[] args) + { + super(e); + mixin(set_kind); + addChildren(args); + this.args = args; + } +} + +class SliceExpression : UnaryExpression +{ + Expression left, right; + this(Expression e, Expression left, Expression right) + { + super(e); + mixin(set_kind); + assert(left ? (right !is null) : right is null); + if (left) + addChildren([left, right]); + + this.left = left; + this.right = right; + } +} + +/* +class PrimaryExpression +{ + +} +*/ + +class IdentifierExpression : Expression +{ + Identifier* identifier; + this(Identifier* identifier) + { + mixin(set_kind); + this.identifier = identifier; + } +} + +class SpecialTokenExpression : Expression +{ + Token* specialToken; + this(Token* specialToken) + { + mixin(set_kind); + this.specialToken = specialToken; + } + + Expression e; /// The expression created in the semantic phase. + + override Expression semantic(Scope) + { + if (type) + return e; + switch (specialToken.type) + { + case TOK.LINE, TOK.VERSION: + e = new IntExpression(specialToken.uint_, Types.Uint); + break; + case TOK.FILE, TOK.DATE, TOK.TIME, TOK.TIMESTAMP, TOK.VENDOR: + e = new StringExpression(specialToken.str); + break; + default: + assert(0); + } + type = e.type; + return e; + } +} + +/* +class IdentifierListExpression : Expression +{ + Expression[] identList; + this(Expression[] identList) + { + this.identList = identList; + } +} +*/ + +class DotExpression : Expression +{ + this() + { + mixin(set_kind); + } +} + +class DotListExpression : Expression +{ + Expression[] items; + this(Expression[] items) + { + mixin(set_kind); + addChildren(items); + this.items = items; + } +} + +class TemplateInstanceExpression : Expression +{ + Identifier* ident; + TemplateArguments targs; + this(Identifier* ident, TemplateArguments targs) + { + mixin(set_kind); + addOptChild(targs); + this.ident = ident; + this.targs = targs; + } +} + +class ThisExpression : Expression +{ + this() + { + mixin(set_kind); + } +} + +class SuperExpression : Expression +{ + this() + { + mixin(set_kind); + } +} + +class NullExpression : Expression +{ + this() + { + mixin(set_kind); + } + + this(Type type) + { + this(); + this.type = type; + } + + override Expression semantic(Scope) + { + if (!type) + type = Types.Void_ptr; + return this; + } +} + +class DollarExpression : Expression +{ + this() + { + mixin(set_kind); + } + + override Expression semantic(Scope scop) + { + if (type) + return this; + type = Types.Size_t; + // if (!scop.inArraySubscript) + // error(scop, "$ can only be in an array subscript."); + return this; + } +} + +class BoolExpression : Expression +{ + this() + { + mixin(set_kind); + } + + Expression e; + override Expression semantic(Scope scop) + { + if (type) + return this; + assert(this.begin !is null); + auto b = (this.begin.type == TOK.True) ? true : false; + e = new IntExpression(b, Types.Bool); + type = Types.Bool; + return this; + } +} + +class IntExpression : Expression +{ + ulong number; + + this(ulong number, Type type) + { + mixin(set_kind); + this.number = number; + this.type = type; + } + + this(Token* token) + { + auto type = Types.Int; // Should be most common case. + switch (token.type) + { + // case TOK.Int32: + // type = Types.Int; break; + case TOK.Uint32: + type = Types.Uint; break; + case TOK.Int64: + type = Types.Long; break; + case TOK.Uint64: + type = Types.Ulong; break; + default: + assert(token.type == TOK.Int32); + } + this(token.ulong_, type); + } + + override Expression semantic(Scope) + { + if (type) + return this; + + if (number & 0x8000_0000_0000_0000) + type = Types.Ulong; // 0xFFFF_FFFF_FFFF_FFFF + else if (number & 0xFFFF_FFFF_0000_0000) + type = Types.Long; // 0x7FFF_FFFF_FFFF_FFFF + else if (number & 0x8000_0000) + type = Types.Uint; // 0xFFFF_FFFF + else + type = Types.Int; // 0x7FFF_FFFF + return this; + } +} + +class RealExpression : Expression +{ + real number; + + this(real number, Type type) + { + mixin(set_kind); + this.number = number; + this.type = type; + } + + this(Token* token) + { + auto type = Types.Double; // Most common case? + switch (token.type) + { + case TOK.Float32: + type = Types.Float; break; + // case TOK.Float64: + // type = Types.Double; break; + case TOK.Float80: + type = Types.Real; break; + case TOK.Imaginary32: + type = Types.Ifloat; break; + case TOK.Imaginary64: + type = Types.Idouble; break; + case TOK.Imaginary80: + type = Types.Ireal; break; + default: + assert(token.type == TOK.Float64); + } + this(token.real_, type); + } + + override Expression semantic(Scope) + { + if (type) + return this; + type = Types.Double; + return this; + } +} + +/++ + This expression holds a complex number. + It is only created in the semantic phase. ++/ +class ComplexExpression : Expression +{ + creal number; + + this(creal number, Type type) + { + mixin(set_kind); + this.number = number; + this.type = type; + } + + override Expression semantic(Scope) + { + if (type) + return this; + type = Types.Cdouble; + return this; + } +} + +class CharExpression : Expression +{ + dchar character; + this(dchar character) + { + mixin(set_kind); + this.character = character; + } + + override Expression semantic(Scope scop) + { + if (type) + return this; + if (character <= 0xFF) + type = Types.Char; + else if (character <= 0xFFFF) + type = Types.Wchar; + else + type = Types.Dchar; + return this; + } +} + +class StringExpression : Expression +{ + Token*[] stringTokens; + this() + { mixin(set_kind); } + + /// Constructor used in parsing phase. + this(Token*[] stringTokens) + { + this(); + this.stringTokens = stringTokens; + } + + ubyte[] str; /// The string data. + Type charType; /// The character type of the string. + // Constructors used in semantic phase. + this(ubyte[] str, Type charType) + { + this(); + this.str = str; + this.charType = charType; + type = new TypeSArray(charType, str.length); + } + + this(char[] str) + { + this(cast(ubyte[])str, Types.Char); + } + this(wchar[] str) + { + this(cast(ubyte[])str, Types.Wchar); + } + this(dchar[] str) + { + this(cast(ubyte[])str, Types.Dchar); + } + + override Expression semantic(Scope scop) + { + if (type) + return this; + return this; + } + + char[] getString() + { + char[] buffer; + foreach (token; stringTokens) + buffer ~= token.str[0..$-1]; + return buffer; + } +} + +class ArrayLiteralExpression : Expression +{ + Expression[] values; + this(Expression[] values) + { + mixin(set_kind); + addOptChildren(values); + this.values = values; + } +} + +class AArrayLiteralExpression : Expression +{ + Expression[] keys, values; + this(Expression[] keys, Expression[] values) + { + assert(keys.length == values.length); + mixin(set_kind); + foreach (i, key; keys) + addChildren([key, values[i]]); + this.keys = keys; + this.values = values; + } +} + +class AssertExpression : Expression +{ + Expression expr, msg; + this(Expression expr, Expression msg) + { + mixin(set_kind); + addChild(expr); + addOptChild(msg); + this.expr = expr; + this.msg = msg; + } +} + +class MixinExpression : Expression +{ + Expression expr; + this(Expression expr) + { + mixin(set_kind); + addChild(expr); + this.expr = expr; + } + + // import dil.Parser; + override Expression semantic(Scope scop) + { + // TODO: + /+ + auto expr = this.expr.semantic(scop); + auto strExpr = Cast!(StringExpression)(expr); + // if (strExpr is null) + // error(scop, MID.MixinExpressionMustBeString); + auto parser = new Parser(strExpr.getString(), "", scop.infoMan); + expr = parser.start2(); + return expr; + +/ + return null; + } +} + +class ImportExpression : Expression +{ + Expression expr; + this(Expression expr) + { + mixin(set_kind); + addChild(expr); + this.expr = expr; + } +} + +class TypeofExpression : Expression +{ + TypeNode type; + this(TypeNode type) + { + mixin(set_kind); + addChild(type); + this.type = type; + } +} + +class TypeDotIdExpression : Expression +{ + TypeNode type; + Identifier* ident; + this(TypeNode type, Identifier* ident) + { + mixin(set_kind); + addChild(type); + this.type = type; + this.ident = ident; + } +} + +class TypeidExpression : Expression +{ + TypeNode type; + this(TypeNode type) + { + mixin(set_kind); + addChild(type); + this.type = type; + } +} + +class IsExpression : Expression +{ + TypeNode type; + Identifier* ident; + Token* opTok, specTok; + TypeNode specType; + TemplateParameters tparams; // D 2.0 + this(TypeNode type, Identifier* ident, Token* opTok, Token* specTok, + TypeNode specType, typeof(tparams) tparams) + { + mixin(set_kind); + addChild(type); + addOptChild(specType); + version(D2) + addOptChild(tparams); + this.type = type; + this.ident = ident; + this.opTok = opTok; + this.specTok = specTok; + this.specType = specType; + this.tparams = tparams; + } +} + +class FunctionLiteralExpression : Expression +{ + TypeNode returnType; + Parameters parameters; + FunctionBody funcBody; + + this() + { + mixin(set_kind); + addOptChild(returnType); + addOptChild(parameters); + addChild(funcBody); + } + + this(TypeNode returnType, Parameters parameters, FunctionBody funcBody) + { + this.returnType = returnType; + this.parameters = parameters; + this.funcBody = funcBody; + this(); + } + + this(FunctionBody funcBody) + { + this.funcBody = funcBody; + this(); + } +} + +version(D2) +{ +class TraitsExpression : Expression +{ + Identifier* ident; + TemplateArguments targs; + this(typeof(ident) ident, typeof(targs) targs) + { + mixin(set_kind); + addOptChild(targs); + this.ident = ident; + this.targs = targs; + } +} +} + +class VoidInitializer : Expression +{ + this() + { + mixin(set_kind); + } +} + +class ArrayInitializer : Expression +{ + Expression[] keys; + Expression[] values; + this(Expression[] keys, Expression[] values) + { + assert(keys.length == values.length); + mixin(set_kind); + foreach (i, key; keys) + { + addOptChild(key); // The key is optional in ArrayInitializers. + addChild(values[i]); + } + this.keys = keys; + this.values = values; + } +} + +class StructInitializer : Expression +{ + Identifier*[] idents; + Expression[] values; + this(Identifier*[] idents, Expression[] values) + { + mixin(set_kind); + addOptChildren(values); + this.idents = idents; + this.values = values; + } +} + +class AsmTypeExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} + +class AsmOffsetExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} + +class AsmSegExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} + +class AsmPostBracketExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} + +class AsmBracketExpression : Expression +{ + Expression e; + this(Expression e) + { + mixin(set_kind); + addChild(e); + this.e = e; + } +} + +class AsmLocalSizeExpression : Expression +{ + this() + { + mixin(set_kind); + } +} + +class AsmRegisterExpression : Expression +{ + Identifier* register; + int number; // ST(0) - ST(7) or FS:0, FS:4, FS:8 + this(Identifier* register, int number = -1) + { + mixin(set_kind); + this.register = register; + this.number = number; + } +} diff -r 05c375fb2d5c -r e25345656d10 trunk/src/dil/parser/Parser.d --- a/trunk/src/dil/parser/Parser.d Sat Jan 05 23:01:42 2008 +0100 +++ b/trunk/src/dil/parser/Parser.d Sat Jan 05 23:06:03 2008 +0100 @@ -11,7 +11,7 @@ import dil.Information; import dil.ast.Declarations; import dil.Statements; -import dil.Expressions; +import dil.ast.Expressions; import dil.Types; import dil.Enums; import dil.CompilerInfo; diff -r 05c375fb2d5c -r e25345656d10 trunk/src/dil/semantic/Analysis.d --- a/trunk/src/dil/semantic/Analysis.d Sat Jan 05 23:01:42 2008 +0100 +++ b/trunk/src/dil/semantic/Analysis.d Sat Jan 05 23:06:03 2008 +0100 @@ -5,7 +5,7 @@ module dil.semantic.Analysis; import dil.ast.Node; -import dil.Expressions; +import dil.ast.Expressions; import dil.Token; import dil.Scope; import dil.IdTable; diff -r 05c375fb2d5c -r e25345656d10 trunk/src/main.d --- a/trunk/src/main.d Sat Jan 05 23:01:42 2008 +0100 +++ b/trunk/src/main.d Sat Jan 05 23:06:03 2008 +0100 @@ -12,7 +12,7 @@ import dil.SettingsLoader; import dil.CompilerInfo; import dil.Module; -import dil.ast.Declarations, dil.Expressions, dil.ast.Node; +import dil.ast.Declarations, dil.ast.Expressions, dil.ast.Node; import dil.Information; import dil.File; import cmd.Generate;