BLUESTACK.ORG : datei8

HomePage :: PageIndex :: RecentChanges :: RecentlyCommented :: UserSettings :: You are 38.103.63.60
//datei-name: equal1.C #include "baum.h" // 0xdf: '&#65533; 176 : '' 183 : '' 191 : '' void Baum::gBaum(int k) { int i, fAst; iStruct = glob = iF = 0; stck0 = stack; shadowRoot = k = shadow(k); while (stck0 > stack) { ast = *--stck0; flag = 0; shadow1(k); } //0 vorScan(k); preCrement(k); postCrement(k); nachScan(k); gp = int(gStack); if (s[s[k].sr].v == 'f') { for (i = iF - 1; i > 0; i -= 2) { k = mintF[i]; fAst = iK = s[k].sr; //1 locals = 0; //2 if (s[fAst].t1 == 's') { locals = s[fAst].sl; paramScan(locals); locals = s[fAst].sl; if (i == iF - 1) { glob = locals; locals = 0; } } k = s[fAst].sr; //3 eeScan(k); fooScan(k); if (err) return; m = 0; runVersion(k); if (err) return; umbau(fAst, 'r', mint[0], 's'); k = s[fAst].sr; //3 refScan(k); sizeScan(k); doLoopScan(k); gotoScan(k); switchRek(k); brCoScan(k); Ast = k; retCScan(k); } slotScan(shadowRoot); } else mes = 2; } //0 wort @ kommentar bearbeiten //1 funktion aus tabelle holen (s[fAst].v : 'f') //2 locals : deklarationsAst fr lokale (im mainFall globale) variablen //3 k : funktionsRumpf int Baum::shadow(int k) //erzeugt zu einem gegebenen baum einen shadow_baum (rekursiv) u. gibt dessen wurzel zurck { int sl, sr, k1; char t1, t2, v; sl = s[k].sl; sr = s[k].sr; t1 = s[k].t1; t2 = s[k].t2; v = s[k].v; if (v == '@') //1 { if (t1 == 's') return shadow(sl); *stck0++ = k; return k; } if (t1 == 's') sl = shadow(sl); else { t1 = '?'; if (v == '"') { if (t2 == 's' && s[sr].v == 'f') { k1 = fScan(sl); //2 if (k1) return k1; sr = shadow(sr); k1 = sBau(sl, sr, t1, t2, v); mintF[iF] = sl; ++iF; mintF[iF] = k1; ++iF; return k1; } } } if (t2 == 's') sr = shadow(sr); else t2 = '?'; return (sBau(sl, sr, t1, t2, v)); } //1: fr kommentar nachBearbeitung //2: verhindert mehrfaches anlegen von funktions_shadows int Baum::fScan(int name) { int i; for (i = 0; i < iF; i += 2) { if (name == mintF[i]) return mintF[i + 1]; } return 0; } void Baum::shadow1(int k) // kommentare ausblenden { if (flag) return; if (s[k].t1 == 's') { if (s[k].sl == ast) { Ast = s[s[k].sl].sl; umbau(k, 'l', Ast, '?'); flag = 1; } else shadow1(s[k].sl); } if (flag) return; if (s[k].t2 == 's') { if (s[k].sr == ast) { Ast = s[s[k].sr].sl; umbau(k, 'r', Ast, '?'); flag = 1; } else shadow1(s[k].sr); } } void Baum::vorScan(int k) // (cin, cout, endl, new, foo lab-aufruf) syntax { if (s[k].t1 == '?') { if (s[k].sl == '!' || s[k].sl == '?') { s[k].v = '!'; if (s[k].t2 == 's') { setEndl(s[k].sr); vorScan(s[k].sr); } else if (s[k].sr == 183) s[k].t2 = '!'; return; } } if (s[k].v == '"') { if (s[k].t2 == 's') { wrzl = k; k = s [k].sr; if (s[k].v == 'f') vorScan(s[k].sr); else if (s[k].v == ' ') { if (s[k].t1 == '?' && s[k].sl == '[') { s[k].sl = s[wrzl].sl; s[wrzl].sl = new_; s[k].v = '['; } else if (s[k].t2 == '?' && s[k].sr == '}') { s[wrzl].v = '}'; CntrlU(wrzl); abbauLr(wrzl); if (s[wrzl].t1 == 's') vorScan(s[wrzl].sl); } else vorScan(k); } else vorScan(k); } return; } //2 if (s[k].v == ' ') { worti = s[k].sl; if (worti == '[') { s[k].sl = new_; s[k].v = '"'; anbauRr(k, '1', '?', '['); } else if (worti == 191 && s[k].t2 == 's') vorScan(s[k].sr); return; } if (s[k].t1 == 's') vorScan(s[k].sl); if (s[k].t2 == 's') vorScan(s[k].sr); } //1 worti == long_ || worti == short_ kann nicht gecastet werden /*//2 if (s[k].v == ' ') { if (s[k].t1 == 's') { if (s[s[k].sl].v == '^') s[k].v = ''; } else { worti = s[k].sl; if (worti == char_ || worti == int_ || worti == double_ || worti == float_ || worti == uchar_ || worti == uint_) s[k].v = ''; //1 else if (worti == '[') { s[k].sl = new_; s[k].v = '"'; anbauRr(k, '1', '?', '['); } } return; } */ //vorScan -> void Baum::setEndl(int k) // endline-syntax { if (s[k].v == '.') { if (s[k].t1 == 's') setEndl(s[k].sl); else if (s[k].sl == 183) s[k].t1 = '!'; if (s[k].t2 == 's') setEndl(s[k].sr); else if (s[k].sr == 183) s[k].t2 = '!'; } } //gBaum -> void Baum::preCrement(int k) { int k1; if (s[k].v == 'f') k = s[k].sr; if (s[k].v == '(') { li = s[k].sl; typ = s[k].t1; re = s[k].sr; k1 = sBau(li, 1, typ, ':', *w[re].st); umbau(k, 'r', k1, 's'); s[k].v = '='; return; } if (s[k].t1 == 's') preCrement(s[k].sl); if (s[k].t2 == 's') preCrement(s[k].sr); } //gBaum -> void Baum::postCrement(int k) // siehe rcs h (postCrement i syntax) { int k1, wrzl; char t1; if (s[k].v == ')') { wrzl = s[k].h; if (s[wrzl].v == '.') { if (s[wrzl].sl == k) return; if (s[k].t2 == 's') postCrement(s[k].sr); return; } li = s[k].sl; t1 = s[k].t1; re = s[k].sr; k1 = sBau(li, 1, t1, ':', *w[re].st); k1 = sBau(li, k1, t1, 's', '='); if (s[wrzl].sl == k) umbau(wrzl, 'l', k1, 's'); else umbau(wrzl, 'r', k1, 's'); loop: holz = s[wrzl].h; if (! holz) anbauRr(wrzl, k1, 's', '.'); else if (s[holz].v == '.') { if (wrzl == s[holz].sl) { anbauLr(holz, k1, 's', '.'); s[wrzl].h = s[holz].sl; s[s[holz].sl].h = holz; } //1 else { anbauRr(holz, k1, 's', '.'); s[wrzl].h = s[holz].sr; s[s[holz].sr].h = holz; } } //1 else { wrzl = holz; goto loop; } return; } if (s[k].v == '"' && s[s[k].sr].v == 'f') k = s[s[k].sr].sr; if (s[k].t1 == 's') { li = s[k].sl; s[li].h = k; postCrement(li); } if (s[k].t2 == 's') { re = s[k].sr; s[re].h = k; postCrement(re); } } //1 wurde durch anbau(umbau) gel&#65533;cht //gBaum -> void Baum::nachScan(int k) { if (s[k].t1 == 's') { if (s[k].v == '=') { Ast = 0; nachScan1(s[k].sl); if (Ast) { m = 0; nachScan2(s[k].sl); holz = sBau(mint[0], s[k].sr, 's', s[k].t2, '='); holz = sBau(Ast, holz, 's', 's', '.'); if (k == s[wrzl].sl) umbau(wrzl, 'l', holz, 's'); else umbau(wrzl, 'r', holz, 's'); } return; } wrzl = k; nachScan(s[k].sl); } if (s[k].t2 == 's') { wrzl = k; nachScan(s[k].sr); } } //nachScan -> void Baum::nachScan1(int k) // setzt Ast { if (Ast) return; if (s[k].v == '=') { Ast = k; return; } if (s[k].t1 == 's') nachScan1(s[k].sl); if (s[k].t2 == 's') nachScan1(s[k].sr); } //nachScan -> void Baum::nachScan2(int k) // legt gleichung neu an (ohne r-wert von Ast) // benutzt mint u. mchar (index: m) { if (s[k].v == '=') { mint[m] = s[k].sl; mchar[m] = s[k].t1; ++m; return; } if (s[k].t1 == 's') nachScan2(s[k].sl); else { mint[m] = s[k].sl; mchar[m] = s[k].t1; ++m; } if (s[k].t2 == 's') nachScan2(s[k].sr); else { mint[m] = s[k].sr; mchar[m] = s[k].t2; ++m; } --m; sR = mint[m]; tR = mchar[m]; --m; sL = mint[m]; tL = mchar[m]; mint[m] = sBau(sL, sR, tL, tR, s[k].v); ++m; } //gBaum -> void Baum::paramScan(int k) { if (s[k].v == '.' || s[k].v == '') { paramScan(s[k].sl); paramScan(s[k].sr); } else { if (s[k].v == ' ' && s[k].t2 == 's' && s[s[k].sr].v == ':') //1 { wort0 = s[s[k].sr].sl; worti = s[s[k].sr].sr; refAbbau(s[iK].sr); abbauRr(k); } //2 varSBau(k); } } //1 referenz //2 iK = fAst (aufl&#65533;ung der demo-version) //paramScan -> void Baum::refAbbau(int k) // aufl&#65533;ung der demo-version { if (s[k].v == '"' && s[k].t2 == 's' && s[s[k].sr].v == 'f') return; if (s[k].t1 == 's') refAbbau(s[k].sl); else if (s[k].sl == worti) umbau(k, 'l', wort0, '?'); if (s[k].t2 == 's') refAbbau(s[k].sr); else if (s[k].sr == worti) umbau(k, 'r', wort0, '?'); } //paramScan -> void Baum::varSBau(int k) // erzeugt aus einer variablen_deklaration eine initialisierung { int k1, dim1, dim2; if (s[k].v == ' ') //1 { if (s[k].t1 == '?') { if (s[k].sl == ':') return; typScan(s[k].sl); if (gTyp) { s[k].v = ':'; if (s[k].t2 == '?') { s[k].sl = s[k].sr; s[k].t2 = gTyp; if (gTyp == 'd' || gTyp == 'f') { s[k].sr = gp; *((double*)gp) = 0.0; gp += 8; } else s[k].sr = 0; } else { iS = 0; varSBauRek(s[k].sr); varSSBau(); tlz(k, mintS[0], 's', 's'); } } else //1A { CntrlU(k); s[k].v = 's'; anbauLr(k, gp, '^', ':'); worti = s[k].sr; getAst(); umbau(k, 'r', Ast, 's'); dim1 = s[s[Ast].sr].sr; gp += dim1; } } } else if (s[k].v == '^') //2 { if (s[k].t1 == '?') { typScan(s[k].sl); if (s[k].t2 == '?') { CntrlU(k); anbauLr(k, 0, '^', ':'); if (gTyp) { s[k].v = ':'; umbau(k, 'r', gTyp, '?'); } else { s[k].v = 's'; worti = s[k].sr; getAst(); umbau(k, 'r', Ast, 's'); } } else { iS = 0; varZBauRek(s[k].sr); varSSBau(); tlz(k, mintS[0], 's', 's'); } } } else if (s[k].v == '"') //3 { s[k].v = ':'; k1 = s[k].sr; if (s[k1].v == '[') //4 { if (s[k1].t1 == '?') { typScan(s[k1].sl); if (gTyp) umbau(k1, 'l', gTyp, '?'); } else { typScan(s[s[k1].sl].sr); if (gTyp) umbau(s[k1].sl, 'r', gTyp, '?'); else gTyp = '^'; } if (gTyp) { anbauLr(k, gp, '^', ':'); umbau(k, 'r', s[k1].sl, s[k1].t1); getSize(gTyp); if (s[k1].t2 == '?') { dim1 = atoi(w[s[k1].sr].st); gp += (datLen * dim1); } else { k1 = s[k1].sr; dim1 = atoi(w[s[k1].sl].st); dim2 = atoi(w[s[k1].sr].st); *(int*)gp = dim2; gp += 4; gp += (datLen * dim1 * dim2); } } } } //5 structfeld else if (s[k].v == 'S') { sum = 0; compScan(s[k].sr); anbauRr(k, sum, ':', ':'); } } //1: z.b. S s //2: zeiger //3: label //4: array // mStruct[iStruct] = k; ++iStruct; /*//1A if (iStruct) { for (i = 0; i < iStruct; ++i) { if (s[k].sl == s[mStruct[i]].sl) { CntrlU(k); s[k].v = 's'; umbau(k, 'r', mStruct[i], 's'); anbauLr(k, gp, '^', ':'); k1 = s[mStruct[i]].sr; dim1 = s[k1].sr; gp += dim1; } } } */ /*//5 else { if (iStruct) { for (i = 0; i < iStruct; ++i) { if (s[k1].sl == s[mStruct[i]].sl) { s[k].v = 's'; dim1 = atoi(w[s[k1].sr].st); anbauLr(k, gp, '^', ':'); umbau(k, 'r', s[k1].sl, s[k1].t1); k1 = s[mStruct[i]].sr; dim2 = s[k1].sr; gp += (dim1 * dim2); return; } } } } */ void Baum::typScan(int i) // setzt gTyp { gTyp = 0; if (i == char_) gTyp = 'c'; else if (i == int_) gTyp = 'i'; else if (i == atom_) gTyp = 'A'; else if (i == knot_) gTyp = 'K'; else if (i == back_) gTyp = 'B'; else if (i == uchar_) gTyp = 'C'; else if (i == uint_) gTyp = 'I'; else if (i == long_) gTyp = 'l'; else if (i == ulong_) gTyp = 'L'; else if (i == float_) gTyp = 'f'; else if (i == double_) gTyp = 'd'; else if (i == '^') gTyp = '^'; } void Baum::getSize(int i) // setzt datLen { if (i == 'c' || i =='C') datLen = 1; else if (i == 'i' || i =='I' || i == 'l' || i =='L' || i == '^' || i == 'A' || i =='K' || i =='B') datLen = 4; else if (i == 'd' || i == 'f') datLen = 8; else datLen = 0; } void Baum::varSBauRek(int k) { if (s[k].t1 == 's') varSBauRek(s[k].sl); else { mintS[iS] = sBau(s[k].sl, 0, '?', gTyp, ':'); ++iS; } if (s[k].t2 == 's') varSBauRek(s[k].sr); else { mintS[iS] = sBau(s[k].sr, 0, '?', gTyp, ':'); ++iS; } } void Baum::varZBauRek(int k) { if (s[k].t1 == 's') varZBauRek(s[k].sl); else { ast = sBau(s[k].sl, 0, '?', '^', ':'); mintS[iS] = sBau(ast, gTyp, 's', '?', ':'); ++iS; } if (s[k].t2 == 's') varZBauRek(s[k].sr); else { ast = sBau(s[k].sr, 0, '?', '^', ':'); mintS[iS] = sBau(ast, gTyp, 's', '?', ':'); ++iS; } } void Baum::varSSBau() { int i; mintS[0] = sBau(mintS[0], mintS[1], 's', 's', '.'); for (i = 2; i < iS; ++i) { mintS[0] = sBau(mintS[0], mintS[i], 's', 's', '.'); } } void Baum::compScan(int k) // tr&#65533;t name, typ und komponenten(name, typ, offset) ein { int k1; if (s[k].v == '.') { compScan(s[k].sl); compScan(s[k].sr); return; } if (s[k].v == ' ') { s[k].v = ':'; typScan(s[k].sl); s[k].t2 = gTyp; s[k].sl = s[k].sr; s[k].sr = sum; getSize(gTyp); sum += datLen; } else //1 { s[k].v = ':'; k1 = s[k].sr; umbau(k, 'r', sum, ':'); if (s[k1].v == ' ') { sum += 4; if (s[k1].sr == char_ || s[k].sr == uchar_) s[k].t1 = 'p'; else if (s[k1].sr == float_) s[k].t1 = 'f'; else if (s[k1].sr == double_) s[k].t1 = 'D'; else s[k].t1 = 'P'; } else //2 { typScan(s[k1].sl); s[k].t1 = gTyp; getSize(gTyp); if (s[k1].t2 == '?') sum += (datLen * atoi(w[s[k1].sr].st)); else { k1 = s[k1].sr; sum += (datLen * atoi(w[s[k1].sl].st) * atoi(w[s[k1].sr].st)); } } } } //1: label_variable //2: array void Baum::eeScan(int k) // l&#65533;t += -= *= /= ... auf indem es ':' durch den l-wert ersetzt { int sl, sr; unsigned char t1, t2; sl = s[k].sl; sr = s[k].sr; t1 = s[k].t1; t2 = s[k].t2; if (s[k].v == '"' && t2 == 's' && s[sr].v == 'f') return; if (s[k].v == '=' && t2 == 's' && s[sr].t1 == '?' && s[sr].sl == ':') { umbau(sr, 'l', sl, t1); return; } if (t1 == 's') eeScan(sl); if (t2 == 's') eeScan(sr); } void Baum::fooScan(int k) // k = funktionsrumpf (-f->) // worti = name der structInstanz // locals zeigt an ob ein deklarationsAst vorhanden ist { int sl, sr, k1; char t1, t2, v; Ast = 0; sl = s[k].sl; sr = s[k].sr; t1 = s[k].t1; t2 = s[k].t2; v = s[k].v; if (v == '.' || v == ',' || v == '=' || v == '[' || v == '+' || v == '-' || v == '' || v == '') { if (t1 == 's') fooScan(sl); else if (t1 == '?') varScanL(k); if (t2 == 's') fooScan(sr); else if (t2 == '?') varScanR(k); } else if (v == '"') { if (sl == new_) newF(k); else { if (s[sr].v != 'f') fooScan(sr); } } else if (v == 'o') { if (t1 == '?') { worti = sl; getAst(); umbau(k, 'l', Ast, 's'); } else { if (s[sl].t2 == '?') varScanR(sl); worti = s[sl].sl; getAst(); if (!Ast) { err = k; cout << "fooScan-error" << endl; return; } umbau(sl, 'l', Ast, 's'); } } else if (v == ' ') { if (sl == '"') tlz(k, sr, 's', 't'); //1 else if (sl == '^' && t2 == '?') varScanR(k); //2 else if (sl == 176 || sl == '-' || sl == 191) { if( t2 == '?') varScanR(k); //3 else fooScan(sr); } else { castFall(k); //6 if (s[k].v == '') { if (t2 == 's') fooScan(sr); else { worti = sr; getAst(); umbau(k, 'r', Ast, 's'); } } } } else if (v == '#') //4 { if (t1 == 's') { k1 = k; while(s[k1].t1 == 's') k1 = s[k1].sl; worti = s[k1].sl; } else worti = sl; getAst(); if (t1 == '?') varScanL(k); else fooScan(sl); } else if (v == '^') //6 { castFall(k); if (t2 == 's') fooScan(sr); else { worti = sr; getAst(); umbau(k, 'r', Ast, 's'); } } else if (v == '!') //7 { if (t2 == 's') fooScan(sr); else if (t2 == '?') varScanR(k); } else { if (t1 == 's') fooScan(sl); else if (t1 == '?' && v != ':') varScanL(k); if (t2 == 's') fooScan(sr); else if (t2 == '?') varScanR(k); } } //1 stringkonstante //2 reine adresse //3 dereferenzierung * p //4 baumoperator # //5 referenz //6 cast //7 cout void Baum::newF(int k) // z.b. (S s) oder ([ sP) oder (sZ " ([ 400)) { k = s[k].sr; worti = s[k].sl; getAst(); umbau(k, 'l', s[Ast].sl, 's'); if (s[Ast].v == 's') { datLen = s[s[s[Ast].sr].sr].sr; } else getSize(s[Ast].sr); if (s[k].sr == '1') { s[k].sr = datLen; s[k].t2 = ':'; } else { sum = atoi(w[s[k].sr].st); i = sBau(datLen, sum, ':', ':', '*'); umbau(k, 'r', i, 's'); } } void Baum::varScanR(int k) // i : satz mit konstante oder variable { unsigned char t; worti = s[k].sr; txt0 = w[worti].st; t = isVal(); if (t) { if (strstr(txt0,".") && t == ':') { dd = atof(txt0); dop = (double*) gp; *dop = dd; s[k].sr = gp; s[k].t2 = 'd'; //1 gp += 8; } else { s[k].sr = strToVal(txt0); s[k].t2 = t; } } else { getAst(); if (Ast) umbau(k, 'r', Ast, 's'); else if (! noFct(worti)) { if (! isRek(k, 'r')) { if (s[k].v != '') { if (worti > cmdStart_ && worti < cmdEnd_) { s[k].t2 = 0xdf; s[k].sr = worti - cmdStart_ - 1; } } } } } } //1: gibt gTyp und gOff zurck void Baum::getAst() // setzt worti voraus. prft ob worti eine gltige variable ist (Ast) { Ast = 0; if (locals) varTest(locals);//w if (! Ast) { if (glob) varTest(glob); } }//w void Baum::varTest(int k) { if (! Ast) { v = s[k].v; if (v == ' ' && s[k].t1 == '?' && s[k].sl == ':') return; if (v == '.' || v == '') { varTest(s[k].sl); if (! Ast) varTest(s[k].sr); } else if (v == ':') { if (s[k].t1 == 's') { if (worti == s[s[k].sl].sl) Ast = k; } else if (worti == s[k].sl) Ast = k; } else if (v == 's') { if (worti == s[s[k].sl].sl) Ast = k; } else if (v == 'S') { if (worti == s[k].sl) Ast = k; } } } void Baum::varScanL(int k) // k : satz mit konstante oder variable { char t; worti = s[k].sl; txt0 = w[worti].st; t = isVal(); if (t) { if (strstr(txt0,".") && t == ':') { dd = atof(txt0); dop = (double*) gp; *dop = dd; s[k].sl = gp; s[k].t1 = 'd'; //1 gp += 8; } else { s[k].sl = strToVal(txt0); s[k].t1 = t; } } else { getAst(); { if (Ast) umbau(k, 'l', Ast, 's'); else if (! noFct(worti)) { if (! isRek(k, 'l')) { if (s[k].t1 == '?') { if (s[k].v != '') { if (worti > cmdStart_ && worti < cmdEnd_) { s[k].t1 = '&#65533;; s[k].sl = worti - cmdStart_ - 1; } } } } } } } } //1: gleitkommakonstante //2: gibt gTyp und gOff zurck char Baum::isVal() // test auf konstante { char c, d; c = *txt0; if (c == '\'') return '\''; //1 if (c >= '0' && c <= '9') return ':'; //2 d = *(txt0 + 1); if (c == '0' && d == 'x') return ':'; //3 return 0; } //1 '_' (zeichen) //2 dezimalzahl //3 hexadezimalzahl char Baum::noFct(int name) // prft, ob keine interne funktion { if (name == '_') return 1; if (name == '|') return 1; if (name == 183) return 1; //1 if (name == ':') return 1; if (name == '+') return 1; if (name == '-') return 1; if (name == '?') return 1; //2 if (name == '!') return 1; //2 if (name == 176) return 1; if (name == '^') return 1; typScan(name); if (gTyp) return 1; return 0; } //1 '' //2 '' char Baum::isRek(int k, char lr) // k ruft rekursion auf (als linker oder rechter ast) { int i, k1; txt0 = w[worti].st; if (*txt0 == ':') { worti = wortI(txt0 + 1); for (i = 0; i < iF; i += 2) { if (worti == mintF[i]) { k1 = mintF[i + 1]; if (lr == 'l') { s[k].sl = s[k1].sr; s[k].t1 = '@'; } //1 else { s[k].sr = s[k1].sr; s[k].t2 = '@'; } //1 return 1; } } } return 0; } //1 wird auf f_knoten der rekursion umgebogen void Baum::castFall(int k) { int k1; k1 = s[k].sl; if (s[k].v == '^') { if (k1 == char_) gTyp = 'p'; else if (k1 == int_) gTyp = 'P'; else gTyp = 'p'; } else typScan(k1); if (gTyp) { umbau(k, 'l', gTyp, '?'); s[k].v = ''; } } void Baum::runVersion(int k) // benutzt mint u. mchar (index: m) li re tLi tRe v . k = s[fAst].sr { char v; v = s[k].v; if (v == '.' || v == ',' || v == ';' || v == '_' || v == '~' || v == '' || v == '}' || v == '+' || v == '-' || v == '*' || v == '\\' || v == '<' || v == '>' || v == '' || v == '' || v == '?' || v == '' || v == '&' || v == '|') { if (s[k].t1 == 's') runVersion(s[k].sl); else { mint[m] = s[k].sl; mchar[m] = s[k].t1; ++m; } if (s[k].t2 == 's') runVersion(s[k].sr); else { mint[m] = s[k].sr; mchar[m] = s[k].t2; ++m; } } else if (v == '=') { adrScan(s[k].sl); if (err) return; if (s[k].t2 == 's') runVersion(s[k].sr); else { if (s[k].t2 == 't' && s[s[k].sl].t2 == 'A') s[k].t2 = 'A'; mint[m] = s[k].sr; mchar[m] = s[k].t2; ++m; } } else if (v == ':') { if (s[k].t1 == 's' && s[s[k].sl].v == ':') k = s[k].sl; mint[m] = k; mchar[m] = 's'; ++m; return; } else if (v == '[') { scanAr(k); return; } else if (v == 'o') { scanS(k); return; } else if (v == '"') { if (s[k].sl == new_) { mint[m] = k; mchar[m] = 's'; ++m; } else { mint[m] = s[k].sl; mchar[m] = '?'; ++m; if (s[k].t2 == 's') runVersion(s[k].sr); else { mint[m] = s[k].sr; mchar[m] = s[k].t2; ++m; } stackBau(s[k].v); } return; } else if (v == 'f' || v == '#') { mint[m] = k; mchar[m] = 's'; ++m; return; } else if (v == '') { adrScan(s[k].sl); if (err) return; scanB(k); if (err) return; } else if (v == '!' || v == '') { mint[m] = s[k].sl; mchar[m] = s[k].t1; ++m; if (s[k].t2 == 's') runVersion(s[k].sr); else { mint[m] = s[k].sr; mchar[m] = s[k].t2; ++m; } } else if (s[k].t1 == '?' && s[k].t2 == 's') { if (s[k].sl == 176) { scanP(s[k].sr); return; } else if (s[k].sl == '^') { k = sBauB(s[k].sr, '^', 's', '?', ':'); mint[m] = k; mchar[m] = 's'; ++m; return; } else { mint[m] = s[k].sl; mchar[m] = s[k].t1; ++m; runVersion(s[k].sr); } } else if (v == ' ') { mint[m] = s[k].sl; mchar[m] = s[k].t1; ++m; if (s[k].t2 == 's') runVersion(s[k].sr); else { mint[m] = s[k].sr; mchar[m] = s[k].t2; ++m; } } if (!(v == '.' || v == ',' || v == ';' || v == '_' || v == '~' || v == '' || v == '}' || v == '=' || v == '+' || v == '-' || v == '*' || v == '\\' || v == '<' || v == '>' || v == '' || v == '' || v == '?' || v == '' || v == '&' || v == '|' || v == '' || v == ' ' || v == '!' || v == '')) // v == '"' || v == 'f' || v == '#' || v == ':' || v == '[' || v == 'o' { err = k; cout << "runVersion: " << v << endl; return; } stackBau(v); } /*//0 runVersion(s[k].sl); if (s[k].t2 == 's') runVersion(s[k].sr); else { if (s[k].t2 == 't' && s[s[k].sl].t2 == 'A') s[k].t2 = 'A'; mint[m] = s[k].sr; mchar[m] = s[k].t2; ++m; } stackBau(s[k].v); } */ //runVersion -> void Baum::adrScan(int k) { while (s[k].t1 == 's') { sL = s[k].sl; s[sL].h = k; k = sL; } if (s[k].sl == 176) { scanP(s[k].sr); return; } sL = k; k = s[k].h; if (! k) { mint[m] = sL; mchar[m] = 's'; ++m; } else if (s[k].v == ':') { Ast = s[k].sr; k = s[k].h; if (k) { if (s[k].v == '[') { sR = s[k].sr; if (s[k].t2 == 's' && s[sR].v == '.') { sR = sBauB(s[sR].sl, s[sR].sr, s[sR].t1, s[sR].t2, '+'); n = *(int*)s[sL].sr; anbauLr(sR, n, ':', '*'); s[sR].v = '+'; } sL = sBauB(sL, sR, 's', s[k].t2, '+'); sL = sBau(sL, Ast, 's', '?', ':'); } else if (s[k].v == '+' || s[k].v == '-') { sR = s[k].sr; if (s[k].t2 == 's') { runVersion(sR); --m; sR = mint[m]; } else sR = s[k].sr; sL = sBauB(sL, sR, 's', s[k].t2, '+'); } } mint[m] = sL; mchar[m] = 's'; ++m; } else if (s[k].v == 's') { Ast = s[k].sr; loop: k = s[k].h; if (s[k].v == 'o') { worti = s[k].sr; compOff(s[s[Ast].sr].sl); sL = sBauB(sL, gOff, 's', ':', '+'); mint[m] = sL; mchar[m] = 's'; ++m; } else if (s[k].v == '[') { if (s[k].t2 == ':' && s[k].sr == 0) goto loop; datLen = s[s[Ast].sr].sr; sR = sBauB(datLen, s[k].sr, ':', s[k].t2, '*'); k = s[k].h; if (s[k].v == 'o') { worti = s[k].sr; compOff(s[s[Ast].sr].sl); sR = sBau(sR, gOff, 's', ':', '+'); } mint[m] = sBau(sL, sR, 's', 's', '+'); mchar[m] = 's'; ++m; } else { mint[m] = sL; mchar[m] = 's'; ++m; } } else { err = k; cout << "adrScan-error" << endl; } } //rumpelKammer ( runVersion -> scanC //runVersion|adrScan -> void Baum::scanP(int k) { int kS, kT; if (s[k].t1 == 's') { if (s[k].v == ':') { kT = k; k = s[kT].sl; if (s[k].t1 == '?' && (s[k].t2 == '^' || s[k].t2 == 'A')) { mint[m] = kT; mchar[m] = 's'; ++m; } } else if (s[k].v == '#') { k = sBauB(k, 'c', 's', '?', ':'); mint[m] = k; mchar[m] = 's'; ++m; } else { kS = k; kT = s[kS].sl; if (s[kT].t1 == 's') { k = s[kT].sl; if (s[k].t1 == '?' && s[k].t2 == '^') { kS = sBauB(k, s[kS].sr, 's', s[kS].t2, s[kS].v); runVersion(kS); --m; kS = mint[m]; k = sBauB(kS, s[kT].sr, 's', s[kT].t2, ':'); mint[m] = k; mchar[m] = 's'; ++m; } } } } } //runVersion -> void Baum::scanAr(int k) { int kL, kR, kLL, kLR; char tR; if (s[k].t1 == 's') { kL = s[k].sl; kR = s[k].sr; tR = s[k].t2; if (s[kL].t1 == 's' && s[kL].t2 == '?') { kLL = s[kL].sl; kLR = s[kL].sr; if (tR == 's') { if (s[kR].v == '.') { s[kR].v = '+'; n = *(int *)s[kLL].sr; anbauLr(kR, n, ':', '*'); } runVersion(kR); kR = mint[--m]; } getSize(kLR); if (datLen) { if (datLen > 1) { kR = sBau(kR, datLen, tR, ':', '*'); tR = 's'; } } kL = sBauB(kLL, kR, 's', tR, '[' ); k = sBauB(kL, kLR, 's', '?', ':'); } mint[m] = k; mchar[m] = 's'; ++m; } } //runVersion -> void Baum::scanS(int k) { while (s[k].t1 == 's') { sL = s[k].sl; s[sL].h = k; k = sL; } sL = k; k = s[k].h; Ast = s[k].sr; loop: k = s[k].h; if (s[k].v == 'o') { worti = s[k].sr; compOff(s[s[Ast].sr].sl); sL = sBauB(sL, gOff, 's', ':', '+'); } else { if (s[k].t2 == ':' && s[k].sr == 0) goto loop; datLen = s[s[Ast].sr].sr; sR = sBauB(datLen, s[k].sr, ':', s[k].t2, '*'); k = s[k].h; worti = s[k].sr; compOff(s[s[Ast].sr].sl); sR = sBauB(sR, gOff, 's', ':', '+'); sL = sBauB(sL, sR, 's', 's', '+'); } mint[m] = sBauB(sL, worti, 's', '?', ':'); mchar[m] = 's'; ++m; } //scanS -> void Baum::compOff(int k) // setzt gTyp und gOff { if (s[k].v == ':') { if (worti == s[k].sl) { gTyp = s[k].t2; gOff = s[k].sr; } } else { compOff(s[k].sl); compOff(s[k].sr); } } //runVersion -> void Baum::scanB(int k) { if (s[s[k].sr].v != '') { lenScan(s[k].sr); anbauRr(k, datLen, ':', ''); } adrScan(s[k].sr); sR = s[k].sr; mint[m] = s[sR].sr; mchar[m] = s[sR].t2; ++m; stackBau(''); } //scanB -> void Baum::lenScan(int k) { while (s[k].t1 == 's') { sL = s[k].sl; s[sL].h = k; k = sL; } k = s[k].h; if (s[k].v == 's') { Ast = s[k].sr; datLen = s[s[Ast].sr].sr; } else { datLen = 0; } } //runVersion -> void Baum::stackBau(char v) { --m; re = mint[m]; tRe = mchar[m]; --m; li = mint[m]; tLi = mchar[m]; mint[m] = sBauB(li, re, tLi, tRe, v); mchar[m] = 's'; ++m; } int Baum::sBauB(int sl, int sr, char t1, char t2, char v) { SBau(sl, sr, t1, t2, v); if (t1 == 's') { rzp = &(s[sl].b); neuRz(satz0); } if (t2 == 's') { rzp = &(s[sr].b); neuRz(satz0); } return satz0; } void Baum::refScan(int k) { if (s[k].v == '"' && s[k].t2 == 's' && s[s[k].sr].v == 'f') return; if (s[k].v == '}') { if (s[k].t2 == 's') { sL = s[k].sl; s[sL].h = 0; while (s[sL].v == '.') { wrzl = sL; sL = s[sL].sl; s[sL].h = wrzl; } iK = s[s[k].sr].sr; sR = s[iK].sl; s[sR].s = iK; //1 if (s[sR].v == '') { wrzl = sR; sR = s[sR].sl; s[sR].s = wrzl; if (s[sR].v == '') { wrzl = sR; sR = s[sR].sl; s[sR].s = wrzl; } } while (s[sR].v == '.') { wrzl = sR; sR = s[sR].sl; s[sR].s = wrzl; } loop: if (s[sR].sl == ':') { wort0 = s[sL].sl; worti = s[sR].sr; refAbbau(s[iK].sr); wrzl = s[sR].s; K = s[sL].h; if (sR == s[wrzl].sl) umbau(wrzl, 'l', sL, 's'); else umbau(wrzl, 'r', sL, 's'); s[sL].h = K; sR = sL; s[sR].s = wrzl; } loop1: wrzl = s[sL].h; if (wrzl) { sR = s[sR].s; if (sL == s[wrzl].sr) { sL = wrzl; goto loop1; } sL = s[wrzl].sr; s[sL].h = wrzl; wrzl = sR; sR = s[sR].sr; s[sR].s = wrzl; goto loop; } } return; } if (s[k].t1 == 's') refScan(s[k].sl); if (s[k].t2 == 's') refScan(s[k].sr); } //1 iK = fAst void Baum::sizeScan(int k) { int sl, sr; char t1, t2; sl = s[k].sl; sr = s[k].sr; t1 = s[k].t1; t2 = s[k].t2; if (s[k].v == '"' && t2 == 's' && s[sr].v == 'f') return; if (s[k].v == '[') { s[k].v = '+'; return; } if (t1 == 's') { if (s[k].v == '+' || s[k].v == '-') //1 { if (s[sl].v == ':' && s[sl].t1 == '?' && s[sl].t2 == '^') { if (s[k].s == 1) return; worti = s[sl].sl; getAst(); getSize(s[Ast].sr); if (datLen > 1) { if (s[k].t2 == ':' && s[k].sr == 1) umbau(k, 'r', datLen, ':'); else anbauRr(k, datLen, ':', '*'); } s[k].h = 1; return; } } sizeScan(sl); } if (t2 == 's') sizeScan(sr); } void Baum::doLoopScan(int k) { loop: stck0 = stack; doScan(k); if (stck0 > stack) goto loop; } void Baum::doScan(int k) { int sl, sr; char t1, t2; loop: sl = s[k].sl; sr = s[k].sr; t1 = s[k].t1; t2 = s[k].t2; if (t1 == '?' && t2 == '?') { if (s[k].v == ' ' && sl == do_) { ast = k; loop1: if (stck0 == stack) return; k = *--stck0; if (s[k].v == '"' && s[k].sl == sr) { s[ast].t2 = ':'; s[ast].sr = k; s[ast].v = '{'; return; } else goto loop1; } loop2: if (stck0 == stack) return; Ast = *--stck0; if (k == s[Ast].sl && k != s[Ast].sr) { if (s[Ast].t2 == 's') { *stck0++ = Ast; k = s[Ast].sr; goto loop; } } k = Ast; goto loop2; } if (t1 == 's') { *stck0++ = k; k = sl; goto loop; } if (t2 == 's' && s[sr].v != 'f') { *stck0++ = k; k = sr; goto loop; } goto loop2; } // setzt stck0 voraus; void Baum::gotoScan(int k) { loop: flag = 0; worti = 0; goRek(k); if (flag) { flag = 0; toRek(k); goto loop; } } void Baum::goRek(int k) { if (flag) return; if (s[k].v == ' ' && s[k].t1 == '?' && s[k].t2 == '?') { if(s[k].sl == do_ || s[k].sl == goto_) { worti = s[k].sr; ast = k; flag = 1; } return; } if (s[k].v == '"' && s[k].t2 == 's' && s[s[k].sr].v == 'f') return; if (s[k].t1 == 's') goRek(s[k].sl); if (s[k].t2 == 's') goRek(s[k].sr); } void Baum::toRek(int k) { if (flag) return; if (s[k].v == '"' && s[k].t2 == 's') { if (s[k].sl == worti) { s[ast].t2 = ':'; s[ast].sr = k; s[ast].v = '{'; flag = 1; return; } if (s[s[k].sr].v == 'f') return; } if (s[k].t1 == 's') toRek(s[k].sl); if (s[k].t2 == 's') toRek(s[k].sr); } void Baum::switchRek(int k) { if (s[k].v == '"') { if (s[k].t2 != 's') return; if (s[s[k].sr].v == 'f') return; if (s[k].sl == switch_) switch1(s[k].sr); } if (s[k].t1 == 's') switchRek(s[k].sl); if (s[k].t2 == 's') switchRek(s[k].sr); } void Baum::switch1(int k) { re = s[k].sr; typ = s[k].t2; if (typ == 's' && s[re].t1 == '?' && s[re].sl == then_) umbau(k, 'r', s[re].sr, s[re].t2); if (s[k].t1 == 's') switch1(s[k].sl); if (s[k].t2 == 's') switch1(s[k].sr); } void Baum::brCoScan(int k) { if (s[k].v == '{') return; if (s[k].v == '"') { if (s[k].t2 != 's') return; if (s[s[k].sr].v == 'f') return; if (s[k].sl == while_do || s[k].sl == do_while || s[k].sl == for_do) { Ast = k; brCo1(s[k].sr); } } if (s[k].t1 == 's') brCoScan(s[k].sl); if (s[k].t2 == 's') brCoScan(s[k].sr); } void Baum::brCo1(int k) { if (s[k].v == '"' && s[k].t2 == 's' && s[s[k].sr].v == 'f' || s[k].v == '{') return; if (s[k].t1 == 's') brCo1(s[k].sl); if (s[k].t2 == 's') brCo1(s[k].sr); else if (s[k].t2 == '?' && (s[k].sr == '|' || s[k].sr == '_')) anbauRr(k, Ast, ':','{'); } void Baum::retCScan(int k) { if (s[k].v == '"' && s[k].t2 == 's' && s[s[k].sr].v == 'f' || s[k].v == '{') return; if (s[k].t1 == 's') retCScan(s[k].sl); if (s[k].t2 == 's') retCScan(s[k].sr); else if (s[k].t2 == '?' && s[k].sr == 183) anbauRr(k, Ast, ':','{'); } void Baum::slotScan(int k) // baut addSlot bzw. delSlot um (eingebundenen funktionsknoten in konstante) { int sl, sr; unsigned char t1, t2; sl = s[k].sl; sr = s[k].sr; t1 = s[k].t1; t2 = s[k].t2; if (s[k].v == '}' && t2 == 0xdf) //1 { if (s[k].sr == (addSlot_ - cmdStart_ - 1) || s[k].sr == (delSlot_ - cmdStart_ - 1)) umbau(k, 'l', sr, ':'); } else { if (t1 == 's') slotScan(sl); if (t2 == 's') slotScan(sr); } }


back to baumC
There is no comment on this page. [Display comments/form]