예제 #1
0
        public TypeSpecifier VisitRangeExpression(Expr.Range exp)
        {
            var left   = Visit(exp.Start);
            var lvalue = _valueStack.Pop();

            var right  = Visit(exp.End);
            var rvalue = _valueStack.Pop();

            if (exp.InclusiveStart)
            {
                _valueStack.Push(lvalue);
            }
            else
            {
                var plusone = LLVM.BuildAdd(_builder, lvalue, LLVM.ConstInt(LLVMPrimitiveType(left.Type), 1, _lFalse), "exclstart");
                _valueStack.Push(plusone);
            }

            if (exp.InclusiveEnd)
            {
                _valueStack.Push(CheckedCast(rvalue, right, left));
            }
            else
            {
                var casted   = CheckedCast(rvalue, right, left);
                var minusone = LLVM.BuildSub(_builder, casted, LLVM.ConstInt(LLVMPrimitiveType(left.Type), 1, _lFalse), "exclend");
                _valueStack.Push(minusone);
            }

            return(left);
        }
예제 #2
0
 public For(TypeSpecifier type, Token ident, Expr.Range range, Stmt body)
 {
     TypeSpecifier   = type;
     Identifier      = ident;
     RangeExpression = range;
     Body            = body;
 }
예제 #3
0
 public T VisitRangeExpression(Expr.Range exp);
예제 #4
0
 public TypeSpecifier VisitRangeExpression(Expr.Range exp)
 {
     return(new TypeSpecifier {
         Type = TypeEnum.UNKNOWN
     });
 }