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); }
public For(TypeSpecifier type, Token ident, Expr.Range range, Stmt body) { TypeSpecifier = type; Identifier = ident; RangeExpression = range; Body = body; }
public T VisitRangeExpression(Expr.Range exp);
public TypeSpecifier VisitRangeExpression(Expr.Range exp) { return(new TypeSpecifier { Type = TypeEnum.UNKNOWN }); }