//datei-name: debug.C
#include "baum.h"
void Baum::runDbg(int k)
{ varI = 0; forFlag = 0; kFlag = 0; //1
iG = 0; rekI = 0;
if (s[k].t2 == 's' && s[k].v == '"')
{ k = s[k].sr;
if (s[k].v == 'f')
{ iR = k; typ = s[iR].t2; iK = s[iR].sr; fWertDbg(); } } } //1
//1 hier fängt der blinde affe an nach der banane zu suchen
//1 gilt für fWertDbg-aufruf
//run ->
void Baum::fWertDbg()
{ if (! kFlag)
{ loop:
if (iR)
{ if (typ == 's')
{ s[iK].h = iR;
iR = iK;
kontiniu:
switch (s[iR].v)
{ case '=':
zuweis(iR); break;
case '"':
labFall(iR); goto loop;
case '}':
fctFall(iR); goto loop;
case '{':
iK = s[iR].sr; //2
if (s[iR].sl == do_ || s[iR].sl == goto_) //1
{ typ = s[iK].t2; iR = s[iK].sr; goto kontiniu; }
else if (s[iR].sl == '}' || s[iR].sl == break_) break;
else
{ iR = iK; s[iR].s = 1; goto kontiniu; }
case '!':
if (s[iR].t1 == '?' && s[iR].sl == cin_) cinFall(s[iR].sr);
else if (s[iR].t1 == '?' && s[iR].sl == cout_) coutFall(s[iR].sr, s[iR].t2);
else coutFall(iR, 's');
break;
default:
typ = s[iR].t1; iK = s[iR].sl;
if (typ == '?' && iK == 183)
{ cout << endl; iK = s[iR].sr; typ = s[iR].t2; }
goto loop; } }
else
{ if (typ == '@')
{ ++s[iK].s; rekStack[rekI] = iR; ++rekI; //3
fAst(iK); } //4
else if (typ == 'ß')
{ (this->*func[iK])(); iK = iR; }
else if (iK == 183)
{ cout << endl; iK = iR; }
else
{ cout << "fWert: unerwartete syntax in * " << iR << endl; return; } } } }
if (kFlag) kFlag = 0;
else
{ kFlag = 1;
if (iR) root = iR;
else root = iK;
rTyp = typ; return; }
down:
iR = s[iK].h;
if (! iR)
{ dbgFlag = 0; return; }
if (iK == s[iR].sl)
{ if (s[iR].v == '·')
{ iK = iR; goto down; } //5
if (s[iR].v == '_' || s[iR].v == '~')
{ if (varWert[varI])
{ typ = s[iR].t2; iK = s[iR].sr; goto loop; }
iK = iR; goto down; }
if (s[iK].v == '|')
{ iK = iR; goto down; }
if (s[iR].v == ';')
{ if (s[iR].t2 == 's') sWert(s[iR].sr);
else eWert(s[iR].sr, s[iR].t2);
--varI; convTyp(varI, 'i');
if (varWert[varI])
{ typ = s[iR].t1; iK = s[iR].sl; goto loop; }
iK = iR; goto down; }
typ = s[iR].t2; iK = s[iR].sr; goto loop; }
iK = iR;
if (s[iR].v == '_')
{ iR = s[iK].h; whileFall(iK); goto loop; }
if (s[iR].v == '~')
{ iR = s[iK].h; forDo(iK); goto loop; }
if (s[iR].v == 'f')
{ if (s[iR].s)
{ --s[iR].s;
iK = s[iR].sl;
if (s[iK].v == '·') iK = s[iK].sl;
popRek(iK);
--rekI; iK = rekStack[rekI]; } }
goto down; }
// zentraler befehlsverteiler
//1 baumZauber: gotoAusführung
//2 baumZauber: springt nach knoten iK
//3 iK wird von switch (s[iR].v gesetzt bei typ != 's'
//4 rekursionsAufruf (iK : fAst von funktion)
//5 else-fall überspringen
//6 automatischer break-fall
back to
baumC