public virtual MiniPascalType NodeType(Scope Current) { Type = firstExpression.NodeType(Current); foreach (OperatorPair <T> expr in simpleExpressions) { MiniPascalType anotherType = expr.Operand.NodeType(Current); if (!Type.Equals(anotherType)) { throw new InvalidTypeException(anotherType, Type); } if (!Type.HasOperatorDefined(expr.Operator)) { throw new UndefinedOperatorException(Type, expr.Operator); } Type = anotherType.BinaryOperation(expr.Operator).ReturnType; } return(Type); }
public void CallPrint(MiniPascalType Type) { if (Type.Equals(MiniPascalType.Boolean)) { Label trueRes = generator.DefineLabel(); Label end = generator.DefineLabel(); generator.Emit(OpCodes.Ldc_I4_1); generator.Emit(OpCodes.Ceq); generator.Emit(OpCodes.Brtrue_S, trueRes); PushString(bool.FalseString); generator.Emit(OpCodes.Br, end); generator.MarkLabel(trueRes); PushString(bool.TrueString); generator.MarkLabel(end); generator.Emit(OpCodes.Call, typeof(Console).GetMethod(nameof(Console.Write), SimpleType.String.CLRTypeArray)); } else { generator.Emit(OpCodes.Call, typeof(Console).GetMethod(nameof(Console.Write), Type.SimpleType.CLRTypeArray)); } }