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(); }
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); }
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(); }