public Stmt VisitForStatement(Stmt.For statement) { var function = LLVM.GetInsertBlock(_builder).GetBasicBlockParent(); var alloca = EntryAllocation(function, statement.TypeSpecifier, statement.Identifier.Source); var stepType = Visit(statement.RangeExpression); var endn = _valueStack.Pop(); var startn = _valueStack.Pop(); var end = CheckedCast(endn, stepType, statement.TypeSpecifier); var start = CheckedCast(startn, stepType, statement.TypeSpecifier); LLVM.BuildStore(_builder, start, alloca); var loop = LLVM.AppendBasicBlock(function, "forloop"); LLVM.BuildBr(_builder, loop); LLVM.PositionBuilderAtEnd(_builder, loop); if (_namedValues.ContainsKey(statement.Identifier.Source)) { throw new Exception("For loop variable already defined"); } else { _namedValues.Add(statement.Identifier.Source, new LLVMSymbol { KtsType = statement.TypeSpecifier, Value = alloca }); } Visit(statement.Body); var stepVal = LLVM.ConstInt(LLVMPrimitiveType(statement.TypeSpecifier.Type), 1, _lFalse); var curVal = LLVM.BuildLoad(_builder, alloca, statement.Identifier.Source); var nextVal = LLVM.BuildAdd(_builder, curVal, stepVal, "nextvar"); LLVM.BuildStore(_builder, nextVal, alloca); var endCondition = LLVM.BuildICmp(_builder, LLVMIntPredicate.LLVMIntSLT, curVal, end, "loopcond"); var after = LLVM.AppendBasicBlock(function, "afterloop"); LLVM.BuildCondBr(_builder, endCondition, loop, after); LLVM.PositionBuilderAtEnd(_builder, after); return(null); }
public bool VisitForStatement(Stmt.For statement) { bool result = true; if (!statement.TypeSpecifier.IsInt()) { result = false; Console.WriteLine("For statement loop variable isn't integer"); } if (LocalTypes.ContainsKey(statement.Identifier.Source)) { result = false; Console.WriteLine("For statement variable identifier already used"); } LocalTypes.Add(statement.Identifier.Source, statement.TypeSpecifier); var sg = Examine(statement.RangeExpression.Start); if (!sg.IsInt()) { result = false; Console.WriteLine("Range start expression is not an integer"); } var eg = Examine(statement.RangeExpression.End); if (!eg.IsInt()) { result = false; Console.WriteLine("Range end expression is not an integer"); } bool bg = Examine(statement.Body); if (!bg) { result = false; } return(result); }
public object VisitForStmt(Stmt.For stmt, object options) { throw new NotImplementedException(); }
public object VisitForStmt(Stmt.For stmt, object options = null) { AddSymbolDefinition(stmt.iterator.lexeme, "", AccessModifier.Private, true, new Token[] { stmt.iteratorType.token }); return(null); }