public override void CheckSemantics(TigerScope scope, Report report) { ContainingScope = scope; //Check children LeftOperandNode.CheckSemantics(scope, report); RightOperandNode.CheckSemantics(scope, report); if (!LeftOperandNode.IsOK || !RightOperandNode.IsOK) { return; } //Check children types if (TigerType.AreCompatible(LeftOperandNode.TigerType, TigerType.Int) && TigerType.AreCompatible(RightOperandNode.TigerType, TigerType.Int)) { TigerType = TigerType.Int; } else if (!TigerType.AreCompatible(LeftOperandNode.TigerType, TigerType.Int)) { report.AddError(SemanticErrors.LogicalOperandInvalidType(LeftOperandNode, LeftOperandNode.TigerType)); } else { report.AddError(SemanticErrors.LogicalOperandInvalidType(RightOperandNode, RightOperandNode.TigerType)); } }
public override void GenerateCode(ILGenerator generator) { LeftOperandNode.GenerateCode(generator); RightOperandNode.GenerateCode(generator); generator.Emit(OpCodes.Ceq); generator.Emit(OpCodes.Ldc_I4_0); generator.Emit(OpCodes.Ceq); }
public override void GenerateCode(ILGenerator generator) { LeftOperandNode.GenerateCode(generator); RightOperandNode.GenerateCode(generator); var endLabel = generator.DefineLabel(); var leLabel = generator.DefineLabel(); generator.Emit(OpCodes.Ble, leLabel); generator.Emit(OpCodes.Ldc_I4_0); generator.Emit(OpCodes.Br, endLabel); generator.MarkLabel(leLabel); generator.Emit(OpCodes.Ldc_I4_1); generator.MarkLabel(endLabel); }
public override void CheckSemantics(TigerScope scope, Report report) { ContainingScope = scope; //Check children LeftOperandNode.CheckSemantics(scope, report); RightOperandNode.CheckSemantics(scope, report); if (!LeftOperandNode.IsOK || !RightOperandNode.IsOK) { return; } TigerType = TigerType.Int; //Check children types if (!TigerType.AreCompatible(LeftOperandNode.TigerType, RightOperandNode.TigerType) || (TigerType.AreOfSameType(LeftOperandNode.TigerType, TigerType.Nil) && TigerType.AreOfSameType(RightOperandNode.TigerType, TigerType.Nil))) { report.AddError(SemanticErrors.InvalidIdentityComparison(this, LeftOperandNode.TigerType, RightOperandNode.TigerType)); } }
public override void GenerateCode(ModuleBuilder moduleBuilder, TypeBuilder program, ILGenerator generator) { //-------------------------------------------------- // [Stack Status] // 1. l_operand // (...) //-------------------------------------------------- LeftOperandNode.GenerateCode(moduleBuilder, program, generator); //-------------------------------------------------- // [Stack Status] // 1. r_operand // (...) //-------------------------------------------------- RightOperandNode.GenerateCode(moduleBuilder, program, generator); //-------------------------------------------------- // [Stack Status] // 1. l_operand [OperatorOpCode] r_operand // (...) //-------------------------------------------------- generator.Emit(OperatorOpCode); }
public override void CheckSemantics(TigerScope scope, Report report) { ContainingScope = scope; //Check children LeftOperandNode.CheckSemantics(scope, report); RightOperandNode.CheckSemantics(scope, report); if (!LeftOperandNode.IsOK || !RightOperandNode.IsOK) { return; } //Check children types if ((TigerType.AreCompatible(LeftOperandNode.TigerType, TigerType.Int) && TigerType.AreCompatible(RightOperandNode.TigerType, TigerType.Int)) || (TigerType.AreCompatible(LeftOperandNode.TigerType, TigerType.String) && TigerType.AreCompatible(RightOperandNode.TigerType, TigerType.String))) { TigerType = TigerType.Int; } else { report.AddError(SemanticErrors.InvalidOrderComparison(this, LeftOperandNode.TigerType, RightOperandNode.TigerType)); } }