Пример #1
0
        public void Visit(AST.Assignment assignment)
        {
            LLVMValueRef left;

            if (assignment.Left is AST.Variable variable)
            {
                if (llvmVars.TryGetValue(variable, out var variableLLVM) == false)
                {
                    variable.Type.Accept(this);
                    var typeLLVM = types.Pop();
                    LLVM.PositionBuilderAtEnd(builder, varBlocks.Peek());
                    variableLLVM       = LLVM.BuildAlloca(builder, typeLLVM, variable.Name);
                    llvmVars[variable] = variableLLVM;
                }
                left = variableLLVM;
            }
            else
            {
                throw new InvalidOperationException();
            }

            assignment.Right.Accept(this);
            var right = values.Pop();

            LLVM.PositionBuilderAtEnd(builder, codeBlocks.Peek());
            values.Push(LLVM.BuildStore(builder, right, left));

            returns = false;
        }
 virtual public void visit(AST.Assignment assignment)
 {
     assignment.left.accept(this);
     assignment.right.accept(this);
 }