Пример #1
0
 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);
 }
Пример #2
0
 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));
     }
 }