public override ILType GetResultType(ILGenerationContext context) { ILType operandType = Operand.GetResultType(context); ILBaseType operandBaseType = operandType as ILBaseType; if (operandBaseType == null || !Types.IsIntegralType(operandBaseType.Type)) throw new ParserException("Invalid operation on non-integral type.", TokenIndex, Token); return operandBaseType; }
public override ILType GetResultType(ILGenerationContext context) { ILType operandType = Operand.GetResultType(context); ILPointerType pointerType = operandType as ILPointerType; if (pointerType == null) throw new ParserException("Unable to dereference non-pointer type.", TokenIndex, Token); return pointerType.InnerType.Type; }
public override ILType GetResultType(ILGenerationContext context) { ILType operandType = Operand.GetResultType(context); switch (operandType.Category) { case ILTypeCategory.Base: return operandType; case ILTypeCategory.Struct: throw new ParserException("Invalid operation on struct type.", TokenIndex, Token); case ILTypeCategory.Pointer: return operandType; default: throw new InternalCompilerException("Unknown ILType category."); } }
public override ILType GetResultType(ILGenerationContext context) { ILType leftType = Left.GetResultType(context); ILType rightType = Right.GetResultType(context); if (leftType.Category == ILTypeCategory.Struct || rightType.Category == ILTypeCategory.Struct) throw new ParserException("Invalid operation on struct type.", TokenIndex, Token); else if (leftType.Category == ILTypeCategory.Pointer && rightType.Category == ILTypeCategory.Pointer) throw new ParserException("Cannot perform operation on pointer type and pointer type.", TokenIndex, Token); else if (leftType.Category == ILTypeCategory.Pointer && rightType.Category == ILTypeCategory.Base) return leftType; else if (leftType.Category == ILTypeCategory.Base && rightType.Category == ILTypeCategory.Pointer) return rightType; else //Both types are base types return base.GetResultType(context); }
public override ILType GetResultType(ILGenerationContext context) { ILType operandType = Operand.GetResultType(context); switch (operandType.Category) { case ILTypeCategory.Base: return operandType; case ILTypeCategory.Pointer: return operandType; case ILTypeCategory.Struct: throw new ParserException("Invalid operation on struct type.", TokenIndex, Token); } ILBaseType operandBaseType = operandType as ILBaseType; if (operandBaseType == null || !Types.IsIntegralType(operandBaseType.Type)) throw new ParserException("Invalid operation on non-integral type.", TokenIndex, Token); return operandBaseType; }
public override ILType GetResultType(ILGenerationContext context) { ILType leftType = Left.GetResultType(context); ILType rightType = Right.GetResultType(context); if (leftType.Category == ILTypeCategory.Struct || rightType.Category == ILTypeCategory.Struct) { throw new ParserException("Invalid operation on struct type.", TokenIndex, Token); } if (leftType.Category == ILTypeCategory.Pointer || rightType.Category == ILTypeCategory.Pointer) // Pointer Arithmetic Is Handled In BasicArithmeticBinaryOperatorNode { throw new ParserException("Invalid operation on pointer type.", TokenIndex, Token); } ILBaseType leftBaseType = (ILBaseType)leftType; ILBaseType rightBaseType = (ILBaseType)rightType; var promotedType = Promote(leftBaseType.Type, rightBaseType.Type); return new ILBaseType(promotedType); }
protected override void GenerateILInternal(ILGenerationContext context) { context.Output.Write(new ILLoadF { Address = ILAddressingReference.CreateConstant(1.0), Size = FloatOperandSize.Size32 }); }
public override ILType GetResultType(ILGenerationContext context) { return new ILPointerType(new ILBaseType(Language.BaseType.Char)); }
public virtual bool IsLValue(ILGenerationContext context) { throw new NotImplementedException("Hit fallback IsLValue method."); }
protected override void GenerateILInternal(ILGenerationContext context) { Value.GenerateIL(context); }
public virtual ILAddressingReference GenerateLValue(ILGenerationContext context) { throw new NotImplementedException("Hit fallback GenerateLValue method."); }
public override ILType GetResultType(ILGenerationContext context) { return new ILBaseType(BaseType.Char); }
public override ILType GetResultType(ILGenerationContext context) { return Value.GetResultType(context); }
public override ILType GetResultType(ILGenerationContext context) { return new ILBaseType(Language.BaseType.Int); }
public override ILType GetResultType(ILGenerationContext context) { return context.ResolveTypeReference(Type).Type; //TODO: CHECK WHETHER IGNORING MODIFIERS HERE COULD CAUSE ISSUES }
protected override void GenerateILInternal(ILGenerationContext context) { throw new NotImplementedException(); }
public abstract ILType GetResultType(ILGenerationContext context);
public void RegisterVariable(ILGenerationContext context, string name, ILTypeReference type) { if (Variables.ContainsKey(name)) throw new ParserException(string.Format("Duplicate definition for variable \"{0}\".", name), context.CurrentNode.TokenIndex, context.CurrentNode.Token); }
public void RegisterStruct(ILGenerationContext context, ILStructType type) { if (Structs.ContainsKey(type.Name)) throw new ParserException(string.Format("Duplicate definition for type struct \"{0}\".", type.Name), context.CurrentNode.TokenIndex, context.CurrentNode.Token); Structs.Add(type.Name, type); }
public override ILType GetResultType(ILGenerationContext context) { ILType operandType = Operand.GetResultType(context); return new ILPointerType(operandType); }
public virtual void GenerateIL(ILGenerationContext context) { context.CurrentNode = this; GenerateILInternal(context); }
protected virtual void GenerateILInternal(ILGenerationContext context) //This should be made internal at some point { throw new NotImplementedException("Hit Node.cs fallback GenerateILInternal."); }
public override ILType GetResultType(ILGenerationContext context) { throw new NotImplementedException(); }
protected override void GenerateILInternal(ILGenerationContext context) { context.Output.Write(new ILLoad { Address = ILAddressingReference.CreateConstant(Value), Size = (GeneralOperandSize)Types.GetBaseTypeSize(BaseType.Int) }); }