📄 3.flow.c
字号:
#include <stdio.h>#/*correct the flow of control in the new program - use GOTO's which maybe changed later to NEXT, BREAK, etc.*/#include "def.h"#include "3.def.h"#define BRANCHTYPE(v) (NTYPE(v) == GOVX )#define HASLEX(t) (t != GOVX && t != COMPVX && t != ASGOVX && t != ITERVX ) /* for these, control never flows directly to following statement */getflow() { fixflow(START,UNDEFINED); }fixflow(v,autolex)VERT v;VERT autolex; /* lexical successor of v */ { VERT lex,chlex,z,x,w; int i; lex = lexval(v,autolex); if (HASLEX(NTYPE(v)) && NTYPE(v) != ICASVX) if (DEFINED(REACH(v)) && REACH(v) != lex) insib(v,makebr(REACH(v))); else if (NTYPE(v) == DOVX && ARC(v,1) != lex) insib(v,makebr(ARC(v,1))); if (NTYPE(v) == ITERVX) { BRK(v) = autolex; chlex = v; } else chlex = lexval(v,autolex); for (i = 0; i < CHILDNUM(v); ++i) { w = LCHILD(v,i); if (DEFINED(w)) fixflow(w,chlex); else { ASSERT(i < ARCNUM(v),fixflow); z = ARC(v,i); ASSERT(DEFINED(z), fixflow); if (z != chlex) { x = makebr(z); LCHILD(v,i) = x; RSIB(x) = UNDEFINED; } } } if (DEFINED(RSIB(v))) fixflow(RSIB(v),autolex); }lexval(v,lastlex)VERT v,lastlex; { VERT sib; if (!HASLEX(NTYPE(v))) return(UNDEFINED); sib = RSIB(v); if (NTYPE(v) == ICASVX || NTYPE(v) == ACASVX) return(lastlex); else if (!DEFINED(sib)) return(lastlex); else if (BRANCHTYPE(sib)) return(ARC(sib,0)); else return(sib); }makebr(w) /* make branching node leading to w */VERT w; { VERT new; new = create(GOVX,1); ARC(new,0) = w; RSIB(new) = UNDEFINED; REACH(new) = UNDEFINED; return(new); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -