Exemple #1
0
        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);
        }
Exemple #3
0
 public object VisitForStmt(Stmt.For stmt, object options)
 {
     throw new NotImplementedException();
 }
Exemple #4
0
 public object VisitForStmt(Stmt.For stmt, object options = null)
 {
     AddSymbolDefinition(stmt.iterator.lexeme, "", AccessModifier.Private, true, new Token[] { stmt.iteratorType.token });
     return(null);
 }