예제 #1
0
        protected internal override void VisitAST(ForStmtAST node)
        {
            this.Visit(node.PreRun); // init
            var(postLabel, endLabel) = OpenLoop();
            var beginLabel = Ins.CreateLabel();

            GenCode.Add(Ins.Label(beginLabel));
            this.Visit(node.InfLoop.Cond);
            // repeat's logic is opposite to for
            if (node.NodeType == ASTType.Repeat)
            {
                GenCode.Add(Ins.Not());
            }
            GenCode.Add(Ins.Fjp(endLabel));
            // body
            this.Visit(node.InfLoop.Body);
            // post run
            GenCode.Add(Ins.Label(postLabel));
            this.Visit(node.PostRun);
            // jump to cond
            GenCode.Add(Ins.Ujp(beginLabel));
            GenCode.Add(Ins.Label(endLabel));

            CloseLoop();
        }
예제 #2
0
 protected internal override void VisitAST(UnaryExprAST node)
 {
     this.Visit(node.Hs);
     var code = node.NodeType switch
     {
         ASTType.Not => Ins.Not(),
         ASTType.Neg => Ins.Neg(node.RetType),
         _ => throw new NotImplementedException()
     };
     GenCode.Add(code);
 }
예제 #3
0
        protected internal override void VisitAST(RepeatStmtAST node)
        {
            var(beginLabel, endLabel) = OpenLoop();
            GenCode.Add(Ins.Label(beginLabel));

            this.Visit(node.InfLoop.Body);

            // repeat's logic is opposite to for
            this.Visit(node.InfLoop.Cond);
            GenCode.Add(Ins.Not());

            GenCode.Add(Ins.Fjp(endLabel));
            GenCode.Add(Ins.Ujp(beginLabel));
            GenCode.Add(Ins.Label(endLabel));

            CloseLoop();
        }