BLUESTACK.ORG : datei6

HomePage :: PageIndex :: RecentChanges :: RecentlyCommented :: UserSettings :: You are 38.103.63.60
//datei-name: equal.C #include "baum.h" /* Typ 1 : durch semikolon abgeschlossener ausdruck Typ 2 : funktion oder Block Typ 3 : struct Typ 4 : klasse Typ 5 : funktionskopf Typ 6 : funktionsrumpf Typ 7 : structkopf Typ 8 : structrumpf Typ 9 : structtail Typ 10 : klassenkopf Typ 11 : klassenrumpf Typ 12 : klassentail Typ 13 : parameter Typ 14 : ifkopf Typ 15 : elsekopf Typ 16 : whilekopf Typ 17 : dokopf Typ 18 : forkopf Typ 19 : switchkopf Typ 20 : blockinhalt */ void Baum::lexan() // kopiert text { int i, j; ERR1 = 1; ERR2 = 2; ERR3 = 3; ERR4 = 4; err = 0; if (*baumDat) { lex(); token(); *stck0 = 0; if (err) { errMes(); return; } if (*stack) { pars(); i = srIndex(0); if (err) { errMes(); return; } rTyp = 's'; root = sBau(0, Typ, 'i', 'i', 't'); if (i) { if (! cstack[i] && stack[i] == ';') ++i; root = sBau(root, i, 's', 'i', '.'); loop: i = srIndex(i); if (err) { errMes(); return; } if (i) { if (! cstack[i] && stack[i] == ';') ++i; j = sBau(s[root].sr, Typ, 'i', 'i', 't'); umbau(root, 'r', j, 's'); root = sBau(root, i, 's', 'i', '.'); goto loop; } j = sBau(s[root].sr, Typ, 'i', 'i', 't'); umbau(root, 'r', j, 's'); } parsA(root); ast = Ast = 0; parsA1(root); if (Ast) root = sBau(Ast, ast, 's', 's', '.'); else root = ast; iN = 0; aufAb(root); structBaum(root); iiBaum(root); hashRek(root); castRek(root); varBaum(root); copyTree(root); k1Del(root); s[root].lc = STDLOC; equalBaum(root); equalBaumClr(root); switchBaum(root); if (iN) structUmbau(); zeigerUmbau(root); newUmbau(root); retUmbau(root); AltB(root, '.'); root = Ast; } else mes = 2; } } void Baum::lex() { char a1, a2, b, c, d; char* p1; char* p2; p1 = p2 = baumDat; while (*p2 == ' ') p2++; //1 while ((c = *p2++)) { if ((c == '\'') || (c == '"')) //2 { d = c; *p1++ = c; loop: *p1++ = c = *p2++; if (c == -62) --p1; if (c == '\\') { *p1++ = c = *p2++; goto loop; } if (c != d ) goto loop; continue; } if (c == -62) c = *p2++; //3 if (c == '/') { if (*p2 == '*') //4 { p2++; do { c = *p2++; if (c) d = *p2; else break; } while (c != '*' || d != '/'); p2++; continue; } if (*p2 == '/') { while (*(p1 - 1) == ' ') p1--; while (*p2 != '\n') p2++; continue; } } if (c == 'e') //5 { if (*p2 == 'x') if (*(p2 + 1) == 't') if (*(p2 + 2) == 'e') if (*(p2 + 3) == 'r') if (*(p2 + 4) == 'n') if (*(p2 + 5) == ' ') { p2 += 6; while (*p2 != '\n') p2++; continue; } } else { if (c == '#' && *p2 == 'i') //6 { while (*p2 != '\n') p2++; continue; } if (c == '\t') continue; //7 if (c == '\n') //8 { a1 = a2 = 0; b = *(p2 - 2); if (bScan(b)) a1 = 1; while (*p2 == ' ') p2++; //9 b = *p2; if (bScan(b)) a2 = 1; if (a1 && a2) *p1++ = ' '; continue; } if (c == ' ') { while (*p2 == ' ') p2++; a1 = a2 = 1; b = *(p1 - 1); d = *p2; if (bScan(b)) a1 = 0; if (bScan(d)) a2 = 0; if (a1 || a2) continue; } } //10 *p1++ = c; } *p1 = 0; } //1 ohne spaces am anfang //2 '_' "___" //3 editor-fehler //4 ohne kommentare //5 ohne extern_deklaration //6 #include entfernen //7 ohne tabulatorzeichen //8wort \n wort ~> wort ' ' wort //9 ohne führende spaces //10 ' ' schlucken oder einbauen char Baum::bScan(char c) // stellt fest ob das zeichen zum bezeichner gehört { if (((c >= '0') && (c <= '9')) || ((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z')) || (c == '\'') || (c == '_')) return 1; return 0; } void Baum::token() // setzt baumDat, stck0, cstck0 voraus { char c1, c2, t1, t2; loc = TOKLOC; txt0 = tex; txt1 = baumDat; loop: c1 = *txt1++; if (c1) { if (c1 == ' ') goto loop; if (c1 == '"') { parsString(); goto loop; } if (c1 == '\'') { txt0 = tex; *txt0++ = c1; if (*txt1 == '\\') *txt0++ = *txt1++; *txt0++ = *txt1++; *txt0++ = *txt1++; *txt0 = 0; txt0 = tex; *stck0++ = wortI(txt0); *cstck0++ = 'w'; goto loop; } t1 = bScan(c1); loop1: c2 = *txt1; if (c2) { t2 = bScan(c2); if (t1 && t2) { *txt0++ = c1; c1 = c2; ++txt1; goto loop1; } if (t1 && ! t2) { *txt0++ = c1; *txt0 = 0; txt0 = tex; *stck0++ = wortI(txt0); *cstck0++ = 'w'; goto loop; } if (! t1 && t2) { *stck0++ = c1; *cstck0++ = 0; txt0 = tex; goto loop; } if (! t1 && ! t2) { if (c1 == c2) { if (c1 == '=') { *stck0++ = '?'; *cstck0++ = 0; ++txt1; goto loop; } if (c1 == '|') { *stck0++ = '|'; *cstck0++ = 0; ++txt1; goto loop; } if (c1 == '&') { *stck0++ = '&'; *cstck0++ = 0; ++txt1; goto loop; } if (c1 == '+') { *stck0++ = pp_; *cstck0++ = 'w'; ++txt1; goto loop; } if (c1 == '-') { *stck0++ = mm_; *cstck0++ = 'w'; ++txt1; goto loop; } if (c1 == ':') { *stck0++ = 176; *cstck0++ = 0; ++txt1; goto loop; } if (c1 == '<') { *stck0++ = 'C'; *cstck0++ = 0; ++txt1; goto loop; } if (c1 == '>') { *stck0++ = 'C'; *cstck0++ = 0; ++txt1; goto loop; } if (c1 == '*') { txt0 = tex; *txt0++ = '^'; while (*txt1++ == '*') *txt0++ = '^'; *txt0 = 0; txt0 = tex; txt1--; *stck0++ = wortI(txt0); *cstck0++ = 'w'; goto loop; } } if (c1 == '!' && c2 == '=') { *stck0++ = 191; *cstck0++ = 0; ++txt1; goto loop; } if (c1 == '<' && c2 == '=') { *stck0++ = 171; *cstck0++ = 0; ++txt1; goto loop; } if (c1 == '>' && c2 == '=') { *stck0++ = 187; *cstck0++ = 0; ++txt1; goto loop; } if (c1 == '-' && c2 == '>') { *stck0++ = '^'; *cstck0++ = 0; ++txt1; goto loop; } if (c1 == '(' && c2 == ')') { *stck0++ = k1_; *cstck0++ = 'w'; ++txt1; goto loop; } if (c1 == ']' && c2 == '[') { *stck0++ = ','; *cstck0++ = 0; ++txt1; goto loop; } if (c1 == '[' && c2 == ']') { if (*(stck0 - 1) != delete_) { *stck0++ = k2_; *cstck0++ = 'w'; } ++txt1; goto loop; } if (c1 == '+' && c2 == '=') { *stck0++ = '='; *cstck0++ = 0; *stck0++ = ':'; *cstck0++ = 'w'; *stck0++ = '+'; *cstck0++ = 0; ++txt1; goto loop; } if (c1 == '-' && c2 == '=') { *stck0++ = '='; *cstck0++ = 0; *stck0++ = ':'; *cstck0++ = 'w'; *stck0++ = '-'; *cstck0++ = 0; ++txt1; goto loop; } if (c1 == '*' && c2 == '=') { *stck0++ = '='; *cstck0++ = 0; *stck0++ = ':'; *cstck0++ = 'w'; *stck0++ = '*'; *cstck0++ = 0; ++txt1; goto loop; } if (c1 == '/' && c2 == '=') { *stck0++ = '='; *cstck0++ = 0; *stck0++ = ':'; *cstck0++ = 'w'; *stck0++ = '/'; *cstck0++ = 0; ++txt1; goto loop; } if (c1 == '%' && c2 == '=') { *stck0++ = '='; *cstck0++ = 0; *stck0++ = ':'; *cstck0++ = 'w'; *stck0++ = '%'; *cstck0++ = 0; ++txt1; goto loop; } if (c1 == -73) { err = ERR1; return; } *stck0++ = c1; *cstck0++ = 0; txt0 = tex; goto loop; } } *stck0++ = c1; *cstck0++ = 0; } } void Baum::parsString() // weist jeder stringKonstante einen satzknoten zu { char c; char* tex1; tex1 = tex; loop: c = *txt1++; if (c == '\\') { *tex1++ = c; *tex1++ = *txt1++; goto loop; } if (c != '"') { *tex1++ = c; goto loop; } *tex1 = 0; *stck0++ = sBau(c, wortI(tex), 'w', 'w', ' '); *cstck0++ = 's'; } void Baum::pars() { stck0 = stck1 = stack; cstck0 = cstck1 = cstack; i = 0; while(stack[i]) { tok = stack[i]; if (tok == '!') { stack[i] = 191; cstack[i] = 'w'; } // '¿' else if (tok == return_) stack[i] = 183; else if (tok == break_) stack[i] = '|'; else if (tok == continue_) stack[i] = '_'; else if (tok == cin_) stack[i] = '?'; else if (tok == cout_) stack[i] = '!'; else if (tok == endl_) stack[i] = 183; // '·' ++i; } if (*(stack + 1)) { parsRef(); parsFloat(); *stck1 = 0; stckrset(); stck1 = stck0; cstck1 = cstck0; parsStack(); *stck1 = 0; } } void Baum::parsRef() { int i, j, k, tok, vorTok, kNr; char t, vorT; i = k = 0; iStruct = 0; vorTok = 0; vorT = 0; while(stack[i]) { tok = stack[i]; t = cstack[i]; if ((tok == struct_ || tok == class_ ) && t == 'w' && cstack[i + 1] == 'w') //1 { mStruct[iStruct] = stack[i + 1]; ++iStruct; } else if (t != 's') { if (i) { vorTok = stack[i - 1]; vorT = cstack[i - 1]; } switch (tok) { case '*': if (vorT) { if (datenTyp(vorTok)) { kNr = sBau('^', vorTok, 'w', 'w', ' '); --k; stack[k] = kNr; cstack[k] = 's'; ++k; i++; continue; } //2 else if (vorTok == '}' || vorTok == else_ || vorTok == mm_ || vorTok == pp_ || vorTok == do_) { tok = 176; t = 'w'; } else if ((vorTok == 191 || vorTok == '-') && vorT == 'w') { tok = 176; t = 'w'; } } else if (vorTok == ')') { j = k - 2; j = klammerAuf(j, '(', ')'); if (cstack[j] == 'w') { j = stack[j]; if (j == if_ || j == while_ || j == for_ || j == do_) { tok = 176; t = 'w'; } } } //3 else if (vorTok != ']' && ! vorT) // array-multiplikation { tok = 176; t = 'w'; } //3 break; case '&': if (vorT) { if (datenTyp(vorTok)) { kNr = sBau( 176, vorTok, 'w', 'w', ' '); --k; stack[k] = kNr; cstack[k] = 's'; ++k; i++; continue; } //2 else if (vorTok == '}' || vorTok == else_) { tok = '^'; t = 'w'; } } else if (vorTok == ')' ) { if (datenTyp(stack[i - 2])) { tok = '^'; t = 'w'; } } else if (! vorT && vorTok != ']' && vorTok != ')') { tok = '^'; t = 'w'; } //5 break; case '-': if (! vorT && vorTok != ')' && vorTok != ']') t = 'w'; else if (vorTok == 191 && vorT == 'w') t = 'w'; else if (vorTok == '}') t = 'w'; break; } } stack[k] = tok; cstack[k] = t; ++i; ++k; } stack[k] = 0; } //1: structnamen sammeln //2 zeiger-deklaration //3: dereferenzierung //4: referenz-deklaration //5: adresse char Baum::datenTyp(int t) { int i; i = 0; if (t == char_ || t == int_ || t == long_ || t == float_ || t == double_ || t == atom_ || t == knot_ || t == back_ || t == uchar_ || t == uint_ || t == ulong_ || t == FILE_) return 1; if (iStruct) { while (i < iStruct) { if (t == mStruct[i]) return 1; ++i; } } return 0; } int Baum::klammerAuf(int i, char auf, char zu) { int k; char c; k = 1; loop: while (cstack[i]) --i; c = char(stack[i]); --i; if (c == zu) ++k; if (c == auf) { --k; if (! k) return i; } goto loop; } void Baum::parsFloat() // sucht alle worte deren nachfolger ein '.' ist und stellt fest ob das wort eine dezimalzahl ist // gefolgt von einem dezimalstellen_teil gefolgt von (e|E(+|-)opt. und zahl)opt. // bzw. sucht punkt gefolgt von einem dezimalstellen_teil gefolgt von (e|E(+|-)opt. und zahl)opt. // und fasst dann diese teile zu einer floatKonstante zusammen { int a, b, c, d, e; char ta, tb, tc, td, te; loop: a = *stck0++; if (! a) return; ta = *cstck0++; if (ta == 'w' && zScan(w[a].st)) { b = *stck0++; if (! b) { *stck1++ = a; *cstck1++ = 'w'; return; } tb = *cstck0++; if (! tb) { if (b == '.') { if (zScan(w[a].st)) { c = *stck0++; if (! c) { *stck1++ = a; *cstck1++ = 'w'; *stck1++ = b; *cstck1++ = 0; return; } tc = *cstck0++; if (tc == 'w') { d = *stck0++; if (! d) { *stck1++ = a; *cstck1++ = 'w'; *stck1++ = b; *cstck1++ = 0; *stck1++ = c; *cstck1++ = 'w'; return; } td = *cstck0++; if (! td) { if (d == '+' || d == '-') { e = *stck0++; if (! e) { *stck1++ = a; *cstck1++ = 'w'; *stck1++ = b; *cstck1++ = 0; *stck1++ = c; *cstck1++ = 'w'; *stck1++ = d; *cstck1++ = 'w'; return; } te = *cstck0++; if (te == 'w') { if (zScan(w[a].st)) { txt0 = tex; txt1 = w[a].st; while (*txt1) *txt0++ = *txt1++; *txt0++ = '.'; txt1 = w[c].st; while (*txt1) *txt0++ = *txt1++; txt1 = w[d].st; *txt0++ = *txt1++; txt1 = w[e].st; while (*txt1) *txt0++ = *txt1++; *txt0 = 0; txt0 = tex; *stck1++ = wortI(txt0); *cstck1++ = 'w'; *cstck3++ = 3; goto loop; } } stck0 -= 2; cstck0 -= 2; txt0 = tex; txt1 = w[a].st; while (*txt1) *txt0++ = *txt1++; *txt0++ = '.'; txt1 = w[c].st; while (*txt1) *txt0++ = *txt1++; *txt0 = 0; txt0 = tex; *stck1++ = wortI(txt0); *cstck1++ = 'w'; *cstck3++ = 3; goto loop; } } stck0--; cstck0--; txt0 = tex; txt1 = w[a].st; while (*txt1) *txt0++ = *txt1++; *txt0++ = '.'; txt1 = w[c].st; while (*txt1) *txt0++ = *txt1++; *txt0 = 0; txt0 = tex; *stck1++ = wortI(txt0); *cstck1++ = 'w'; *cstck3++ = 3; goto loop; } stck0--; cstck0--; txt0 = tex; txt1 = w[a].st; while (*txt1) *txt0++ = *txt1++; *txt0++ = '.'; *txt0 = 0; txt0 = tex; *stck1++ = wortI(txt0); *cstck1++ = 'w'; *cstck3++ = 3; goto loop; } } } *stck1++ = a; *cstck1++ = ta; *stck1++ = b; *cstck1++ = tb; goto loop; } *stck1++ = a; *cstck1++ = ta; goto loop; } char Baum::zScan(char* txt) // stellt fest ob die zeichenfolge eine dezimalzahl ist { char c; loop: c = *txt++; if (! c) return 1; if ((c >= '0') && (c <= '9')) goto loop; return 0; } void Baum::parsStack() // stack verkürzen { int a; char t; loop: a = *stck0++; if (! a) { *stck1 = 0; return; } t = *cstck0++; if (! t) { if (a != ' ') { if (a == 176) { if (*stck0 == '~') { a = sBau(*(stck0 - 2), delete_,'w', 'w', '°'); t = 's'; stck0 += 2; cstck0 += 2; --stck1; --cstck1; } else if (*(stck0 - 2) == *stck0) { a = sBau(*(stck0 - 2), new_,'w', 'w', '°'); t = 's'; ++stck0; ++cstck0; --stck1; --cstck1; } else { a = sBau(*(stck0 - 2), *stck0,'w', 'w', '°'); t = 's'; ++stck0; ++cstck0; --stck1; --cstck1; } *stck1++ = a; *cstck1++ = t; goto loop; } if (a == '(' && *stck0 == void_ && *(stck0 + 1) == ')') { *stck1++ = k1_; *cstck1++ = 'w'; stck0 += 2; cstck0 += 2; } else { *stck1++ = a; *cstck1++ = 0; } } goto loop; } else { if (a == unsigned_) { a = *stck0++; t = *cstck0++; if (a == char_) a = uchar_; else if (a == int_) a = uint_; else if (a == long_) a = ulong_; } else if (a == const_ || a == inline_ || a == register_ || a == static_ || a == virtual_) goto loop; } *stck1++ = a; *cstck1++ = t; goto loop; } int Baum::srIndex(int i) // gibt das nächste tok zurück { char c; loop: while (cstack[i]) ++i; c = char(stack[i]); ++i; if (c == ';') { Typ = 1; stack[i - 1] = 0; if (! stack[i]) return 0; return i; } if (c == '{') { i = klammerZu(i, '{', '}'); Typ = 2; if (err) return 0; c = char(stack[i]); if (! c) return 0; else return i; } if (c == '}') { err = ERR2; return 0; } if (! c) { err = ERR1; return 0; } goto loop; } int Baum::klammerZu(int i, char auf, char zu) { int k; char c; k = 1; loop: while (cstack[i]) ++i; c = char(stack[i]); ++i; if (! c) { err = ERR2; return 0; } if (c == zu) { --k; if (! k) return i; } if (c == auf) ++k; goto loop; } // i : erstes zeichen nach '{' void Baum::errMes() { switch(err) { case 1: cout << "kein parsbarer code!" << endl; break; case 2: cout << "block falsch geklammert!" << endl; break; case 3: cout << "array falsch deklariert!" << endl; break; case 4: cout << "deklarations-liste fehlerhaft!" << endl; } } void Baum::parsA(int i) { if(s[i].v == 't') { if (s[i].sr == 2) { nr = s[i].sl; nr = stack[nr]; if (nr == struct_) s[i].sr = 3; else if (nr == class_) s[i].sr = 4; } return; } parsA(s[i].sl); parsA(s[i].sr); } void Baum::parsA1(int i) { if(s[i].v == 't') { if (s[i].sr == 2) { if (ast) ast = sBau(ast, i, 's', 's', '.'); else ast = i; } else { if (Ast) Ast = sBau(Ast, i, 's', 's', '.'); else Ast = i; } return; } parsA1(s[i].sl); parsA1(s[i].sr); } void Baum::aufAb(int i) { if (s[i].v == 't') typSwitch(i); else { aufAb(s[i].sl); aufAb(s[i].sr); } } void Baum::typSwitch(int i) { int t; t = s[i].sr; switch(t) { case 1: typ1Bau(i); break; case 2: typ2Bau(i); typ5Bau(i); if (s[i].v == '°') i = s[i].sr; i = s[i].sr; typ6Bau(i); break; case 3: typ3Bau(i); if (s[i].v == ';') { typ9Bau(i); i = s[i].sl; } typ7Bau(i); typ8Bau(i); break; case 4: typ4Bau(i); if (s[i].v == ';') { typ9Bau(i); i = s[i].sl; } typ10Bau(i); typ11Bau(i); break; } } void Baum::typ1Bau(int i) { int tok, tEnd; tok = tEnd = s[i].sl; while (stack[tEnd]) ++tEnd; s[i].sr = tEnd; s[i].v = ','; } void Baum::typ2Bau(int i) { int i1, i2; i1 = s[i].sl; i2 = typ2Scan(i1); i1 = sBau(i1, 5, 'i', 'i', 't'); i2 = sBau(i2, 6, 'i', 'i', 't'); umbau(i, 'l', i1, 's'); umbau(i, 'r', i2, 's'); s[i].v = 'f'; } int Baum::typ2Scan(int i) { char c; int j; do { while (cstack[i]) ++i; c = char(stack[i]); ++i; } while (c != '{'); stack[i - 1] = 0; j = klammerZu(i, '{', '}'); stack[j - 1] = 0; return i; } void Baum::typ3Bau(int i) { int i1, i2, tailStart, tail; i1 = s[i].sl; i2 = typ3Scan(i1); stack[i2] = 0; ++i2; tail = klammerZu(i2, '{', '}'); stack[tail - 1] = 0; i1 = sBau(i1, 7, 'i', 'i', 't'); i2 = sBau(i2, 8, 'i', 'i', 't'); umbau(i, 'l', i1, 's'); umbau(i, 'r', i2, 's'); s[i].v = 's'; tailStart = tail; while (!(! cstack[tail] && stack[tail] == ';')) ++tail; stack[tail] = 0; if (tailStart != tail) { tail = sBau(tail, 9, 'i', 'i', 't'); umbau(i, 'r', tail, 's'); s[i].v = ';'; s[i2].lc = STDLOC; anbauLr(i, i2, 's', 's'); } } int Baum::typ3Scan(int i) { char c; do { while (cstack[i]) ++i; c = char(stack[i]); ++i; } while (c != '{'); return i - 1; } void Baum::typ4Bau(int i) { int i1, i2, i2merker, tail; i1 = s[i].sl; i2 = typ3Scan(i1); tail = i2merker = i2; i1 = sBau(i1, 10, 'i', 'i', 't'); i2 = sBau(i2, 11, 'i', 'i', 't'); umbau(i, 'l', i1, 's'); umbau(i, 'r', i2, 's'); s[i].v = 'c'; while (stack[tail]) ++tail; --tail; if (!cstack[tail] && stack[tail] == '}') { stack[tail] = 0; tail = 0; } else { do --tail; while (!cstack[tail] && stack[tail] != '}'); stack[tail] = 0; ++tail; } stack[i2merker] = 0; s[i2].sl = i2merker + 1; if (tail) { tail = sBau(tail, 12, 'i', 'i', 't'); umbau(i, 'r', tail, 's'); s[i].v = ';'; s[i2].lc = STDLOC; anbauLr(i, i2, 's', 'c'); } } void Baum::typ5Bau(int i) { int iL, tok, k, cName, fName, ret, param; char fTyp, rTyp; iL = s[i].sl; tok = s[iL].sl; while (stack[tok]) ++tok; --tok; if(stack[tok] == k1_) param = 0; else { stack[tok] = 0; --tok; while (stack[tok] != '(' || cstack[tok]) --tok; stack[tok] = 0; param = paramBau(tok + 1); } --tok; fName = stack[tok]; fTyp = cstack[tok]; --tok; if (tok < s[iL].sl) { ret = void_; rTyp = 'w'; } else if(cstack[tok] == 's') { ret = stack[tok]; rTyp = 's'; } // char* char& else { ret = stack[tok]; rTyp = 'w'; } if ((ret == void_ || ret == slot_) && rTyp == 'w') { if (param) k = sBau(param, s[i].sr, 's', 's', 'f'); else k = sBau(183, s[i].sr, 'w', 's', 'f'); } else { if (param) { k = sBau(param, ret, 's', rTyp, '}'); k = sBau(k, s[i].sr, 's', 's', 'f'); } else { k = sBau(183, ret, 'w', rTyp, '}'); k = sBau(k, s[i].sr, 's', 's', 'f'); } } if (fTyp == 's') { s[fName].lc = OUTLOC; cName = s[fName].sl; fName = s[fName].sr; k = sBau(fName, k, 'w', 's', '"'); umbau(i, 'l', cName, 'w'); s[i].v = '°'; } else { umbau(i, 'l', fName, 'w'); s[i].v = '"'; } umbau(i, 'r', k, 's'); } int Baum::paramBau(int tok) { int tok0, k, k1; char c; k1 = 0; tok0 = tok; loop: while (cstack[tok]) ++tok; c = char(stack[tok]); if (c) { if (c != ',') { ++tok; goto loop; } } k = sBau(tok0, tok, 'i', 'i', ','); if (k1) k1 = sBau(k1, k , 's', 's', '.'); else k1 = k; if (c) { stack[tok] = 0; ++tok; tok0 = tok; goto loop; } return k1; } void Baum::typ6Bau(int i) { int k, tEnd; k = s[i].sr; tok = tEnd = s[k].sl; stack[--tok] = '{'; while (stack[tEnd]) ++tEnd; stack[tEnd]='}'; k = typ6Scan(); umbau(i, 'r', k, 's'); } int Baum::typ6Scan() // setzt tok voraus { int k, kNr, kLoop, tEnd; if (stack[tok] == '{') { kNr = 0; ++tok; tEnd = klammerZu(tok,'{','}'); while (tok < tEnd) { k = typ6Rek(); if (k) { if (s[k].v == 's') { mintN[iN] = k; ++iN; } else { if (kNr) kNr = sBau(kNr, k, 's', 's', '.'); else kNr = k; } if (stack[tok] == ';') ++tok; if (stack[tok] == '}' && ! cstack[tok]) ++tok; } else { k = stack[tok]; ++tok; stack[tok] = '{'; kLoop = typ6Scan(); k = sBau(k, kLoop, 'w', 's', '"'); if (kNr) kNr = sBau(kNr, k, 's', 's', '.'); else kNr = k; } } } else kNr = typ6Rek(); return kNr; } int Baum::typ6Rek() // setzt tok voraus { int tPos, k, kNr; if (stack[tok] == if_) { ++tok; k = ifBau(); if (stack[tok] == else_) { ++tok; kNr = elseBau(); k = sBau(k, kNr, 's', 's', '·'); } } else if (stack[tok] == switch_) { ++tok; k = switchBau(); } else if (stack[tok] == do_) { ++tok; k = doBau(); } else if (stack[tok] == while_) { ++tok; k = whileBau(); } else if (stack[tok] == for_) { ++tok; k = forBau(); } else if (stack[tok] == struct_ && stack[tok + 2] == '{') k = structBau(); else if (stack[tok + 1] == ':' && ! cstack[tok + 1]) return 0; else { tPos = tok; while(stack[tok] != ';') ++tok; k = sBau(tPos, tok, 'i', 'i', ','); // anweisung ++tok; } return k; } int Baum::structBau() // setzt tok voraus { int k, i1, tail; i1 = typ3Scan(tok); tail = klammerZu(i1 + 1, '{', '}'); while (stack[tail] != ';') tail++; k = sBau(tok, 3, 'i', 'i', 't'); typ3Bau(k); if (s[k].v == ';') { typ9Bau(k); k = s[k].sl; } typ7Bau(k); typ8Bau(k); tok = tail + 1; return k; } int Baum::ifBau() // setzt tok voraus { int tPos, kopf, rumpf, k; tPos = tok; tok = klammerZu(tPos + 1, '(', ')'); kopf = sBau(tPos, tok - 1, 'i', 'i', ','); rumpf = typ6Scan(); k = sBau(kopf, rumpf, 's', 's', ','); k = sBau(if_then, k, 'w', 's', '"'); return k; } int Baum::elseBau() { int rumpf, k; rumpf = typ6Scan(); k = sBau(else_, rumpf, 'w', 's', '"'); return k; } int Baum::switchBau() // setzt tok voraus { int tPos, tEnd, kopf, rumpf, k; char kopfTyp; ++tok; exprScan(')', kopf, kopfTyp); tEnd = klammerZu(tok, '{', '}'); tPos = tok; while (tPos < tEnd) { if ((stack[tPos] == switch_) && cstack[tPos] == 'w') { while (stack[tPos] != '{') ++tPos; ++tPos; tPos = klammerZu(tPos, '{', '}'); } if (stack[tPos] == ':' && !cstack[tPos]) stack[tPos] = '{'; else if ((stack[tPos] == case_ || stack[tPos] == default_) && cstack[tPos] == 'w') { stack[tPos] = '}'; cstack[tPos] = 0; } ++tPos; } ++ tok; rumpf = switchScan(tEnd); k = sBau(kopf, rumpf, kopfTyp, 's', ','); k = sBau(switch_, k, 'w', 's', '"'); return k; } void Baum::exprScan(char c, int& kopf, char& kopfTyp) { int tEnd; if (c == ')') tEnd = klammerZu(tok, '(', ')') - 1; if (tEnd - tok == 1) { kopf = stack[tok]; kopfTyp = cstack[tok]; tok += 3; } else { kopf = sBau(tok, tEnd, 'i', 'i', ','); kopfTyp = 's'; tok = tEnd + 2; } } int Baum::switchScan(int tEnd) { int kNr, k, kopf, koepfe, rumpf; char kopfTyp, koepfeTyp; kNr = 0; caseBau: kopf = stack[tok]; kopfTyp = cstack[tok]; while (stack[tok + 1] == '{' && stack[tok + 2] == '}') { tok += 3; koepfe = stack[tok]; koepfeTyp = cstack[tok]; kopf = sBau(kopf, koepfe, kopfTyp, koepfeTyp, '.'); kopfTyp = 's'; } ++tok; rumpf = typ6Scan(); while(stack[tok] == '}' || stack[tok] == ';') ++tok; k = sBau(then_, rumpf, 'w', 's', '"'); k = sBau(kopf, k, kopfTyp, 's', ','); if (! kNr) kNr = k; else kNr = sBau(kNr, k, 's', 's', '.'); if (tok < tEnd) { if (cstack[tok]) goto caseBau; kNr = sBau(case_, kNr, 'w', 's', '"'); if (stack[tok] == '{') // default { k = typ6Scan(); kNr = sBau(kNr, k, 's', 's', '.'); } } else kNr = sBau(case_, kNr, 'w', 's', '"'); return (kNr); } int Baum::doBau() // setzt tok voraus { int tPos, kopf, rumpf, k; tPos = tok; rumpf = typ6Scan(); tPos = tok + 2; tok = klammerZu(tPos, '(', ')'); kopf = sBau(tPos, tok - 1, 'i', 'i', ','); k = sBau(rumpf, kopf, 's', 's', ';'); k = sBau(do_while, k, 'w', 's', '"'); return k; } int Baum::whileBau() // setzt tok voraus { int tPos, kopf, rumpf, k; tPos = tok; tok = klammerZu(tPos + 1, '(', ')'); kopf = sBau(tPos, tok - 1, 'i', 'i', ','); rumpf = typ6Scan(); k = sBau(kopf, rumpf, 's', 's', '_'); k = sBau(while_do, k, 'w', 's', '"'); return k; } int Baum::forBau() // setzt tok voraus { int tPos, kopf, rumpf, k; tPos = tok; tok = klammerZu(tPos + 1, '(', ')'); kopf = forKopf(tPos); rumpf = typ6Scan(); k = sBau(kopf, rumpf, 's', 's', '~'); k = sBau(for_do, k, 'w', 's', '"'); return k; } int Baum::forKopf(int tok) { int tPos, k, k1, k2, k3; ++tok; tPos = tok; while (cstack[tPos] || stack[tPos] != ';') ++tPos; k1 = sBau(tok, tPos, 'i', 'i', '.'); tok = ++tPos; while (cstack[tPos] || stack[tPos] != ';') ++tPos; k2 = sBau(tok, tPos, 'i', 'i', '.'); tok = ++tPos; while (cstack[tPos] || stack[tPos] != ')') ++tPos; k3 = sBau(tok, tPos, 'i', 'i', '.'); k = sBau(k1, k3, 's', 's', '|'); k = sBau(k, k2, 's', 's', '&'); return k; } void Baum::typ7Bau(int i) { int j, j1; j = s[i].sl; j1 = s[j].sl; stack[j1] = 0; ++j1; if (!stack[j1]) umbau(i, 'l', struct_, 'w'); else { umbau(i, 'l', stack[j1], 'w'); } s[i].v = 's'; } void Baum::typ8Bau(int i) { int tok, tPos, k, k1; char c; tok = s[i].sr; tok = tPos = s[tok].sl; k = 0; loop: while (cstack[tPos]) ++tPos; c = char(stack[tPos]); ++tPos; if (c != ';') goto loop; stack[tPos - 1] = 0; k1 = sBau(tok, 1, 'i', 'i', 't'); typ1Bau(k1); if (! k) k = k1; else k = sBau(k, k1, 's', 's', '.'); tok = tPos; if (stack[tPos]) goto loop; umbau(i, 'r', k, 's'); } void Baum::typ9Bau(int i) { int j, i1, i2; char t; t = 'w'; j = s[i].sr; j = s[j].sl; i1 = stack[j]; loop: ++j; i2 = stack[j]; if (i2) { ++j; i2 = stack[j]; i1 = sBau(i1, i2, t, 'w', '.'); t = 's'; goto loop; } umbau(i, 'r', i1, t); s[i].v = ';'; } void Baum::typ10Bau(int i) { int tok, tPos, k; tok = s[s[i].sl].sl; stack[tok] = 0; ++tok; if (!stack[tok]) umbau(i, 'l', class_, 'w'); else if (!stack[tok + 1]) umbau(i, 'l', stack[tok], 'w'); else { tPos = tok + 2; if (stack[tPos] == public_) ++tPos; k = sBau(stack[tok], stack[tPos], 'w', 'w', ':'); loop: ++tPos; if (stack[tPos]) { ++tPos; if (stack[tPos] == public_) ++tPos; anbauRr(k, stack[tPos], 'w', '.'); goto loop; } umbau(i, 'l', k, 's'); } s[i].v = 'c'; } void Baum::typ11Bau(int i) //klassenrumpf { int t, tok, iM, k, k1; tok = s[i].sr; tok = s[tok].sl; t = stack[tok]; if(cstack[tok] == 'w' && (t == public_ || t == protected_ || t == private_)) { stack[tok] = 0; tok += 2; mintM[0] = sBau(t, tok, 'w', 'i', ':'); } else { t = private_; mintM[0] = sBau(t, tok, 'w', 'i', ':'); } iM = 1; while(stack[tok]) { t = stack[tok]; if(cstack[tok] == 'w' && (t == public_ || t == protected_ || t == private_)) { stack[tok] = 0; tok +=2; mintM[iM++] = sBau(t, tok, 'w', 'i', ':'); --tok; } ++tok; } mintM[iM] = 0; while (iM) { k = mintM[--iM]; tok = s[k].sr; k1 = scan11Bau(tok); umbau(k, 'r', k1, 's'); } while (mintM[++iM]) mintM[0] = sBau(mintM[0], mintM[iM], 's', 's', '.'); umbau(i, 'r', mintM[0], 's'); } int Baum::scan11Bau(int tok) { int k, kNr, k1; iW = 0; while (stack[tok]) { mintW[iW++] = tok; while (!(!cstack[tok] && stack[tok] == ';')) ++tok; stack[tok] = 0; ++tok; } protoScan(0, mintW[0]); kNr = protoBau(0, mintW[0]); if (! kNr) kNr = sBau(mintW[0], 1, 'i', 'i', 't'); for (k = 1; k < iW; ++k) { protoScan(k, mintW[k]); k1 = protoBau(k, mintW[k]); kNr = sBau(kNr, k1, 's', 's', '.'); } return kNr; } void Baum::protoScan(int k, int tok) // deklaration { int tPos, tDif; tPos = tok; while (stack[tPos]) { if (stack[tPos] == k1_) { if (stack[tok] == '~') mintS[k] = 10; // destruktor else { tDif = tPos - tok; if (tDif == 1) mintS[k] = 1; // konstruktor else if (tDif == 2) mintS[k] = 2; // standard-function else mintS[k] = 3; } // funktion mit zeiger- oder referenz-rückgabe return; } if (stack[tPos] == '(') { if (stack[tok] == '~') mintS[k] = 11; // destruktor mit parametern else { tDif = tPos - tok; if (tDif == 1) mintS[k] = 4; // konstruktor mit parametern else if (tDif == 2) mintS[k] = 5; // standard-function mit parametern else mintS[k] = 6; } // funktion mit parametern und mit zeiger- oder referenz-rückgabe return; } ++tPos; } mintS[k] = 0; } int Baum::protoBau(int kNr, int tok) { int k, k1; switch (mintS[kNr]) { case 0: k = sBau(tok, 1, 'i', 'i', 't'); typ1Bau(k); return k; case 1: k = sBau(stack[tok], ')', 'w', 'w', 'F'); return k; case 2: k = sBau(stack[tok + 1], ')', 'w', 'w', '('); k = sBau(stack[tok], k, 'w', 's', 'F'); return k; case 3: if (stack[tok + 1] == '*') k = sBau('^', stack[tok], 'w', 'w', ' '); else if (stack[tok + 1] == 185) k = sBau('&', stack[tok], 'w', 'w', ' '); k1 = sBau(stack[tok + 2], ')', 'w', 'w', '('); k = sBau(k, k1, 's', 's', 'F'); return k; case 4: k = fProtoScan(tok + 2); if (! k) { k = sBau(stack[tok], stack[tok + 2], 'w', 'w', 'F'); return k; } else { k = sBau(stack[tok], k, 'w', 's', 'F'); return k; } case 5: k = fProtoScan(tok + 3); if (! k) { k = sBau(stack[tok + 1], stack[tok + 3], 'w', 'w', '('); k = sBau(stack[tok], k, 'w', 's', 'F'); return k; } else { k = sBau(stack[tok + 1], k, 'w', 's', '('); k = sBau(stack[tok], k, 'w', 's', 'F'); return k; } case 6: k = fProtoScan(tok + 4); if (stack[tok + 1] == '*') k = sBau('^', stack[tok], 'w', 'w', ' '); else if (stack[tok + 1] == 185) k = sBau('&', stack[tok], 'w', 'w', ' '); if (! k) { k1 = sBau(stack[tok + 2], stack[tok + 4], 'w', 'w', '('); k = sBau(k, k1, 's', 's', 'F'); return k; } else { k1 = sBau(stack[tok + 2], k, 'w', 'w', '('); k = sBau(k, k1, 's', 's', 'F'); return k; } case 10: k = sBau('~', stack[tok + 1], 'w', 'w', ' '); k = sBau(k, ')', 's', 'w', 'F'); return k; case 11: k = fProtoScan(tok + 3); if (! k) { k1 = sBau('~', stack[tok + 1], 'w', 'w', ' '); k = sBau(k1, stack[tok + 3], 's', 'w', 'F'); return k; } else { k1 = sBau('~', stack[tok + 1], 'w', 's', ' '); k = sBau(k1, k, 's', 'w', 'F'); return k; } } return 0; } int Baum::fProtoScan(int tok) { int tPos; int iF; int param[25]; char paramTyp[25]; tPos = tok; iF = 0; while (stack[tPos] != ')') ++tPos; stack[tPos] = 0; if (! stack[tok + 1]) return 0; loop: tPos = tok + 1; if (stack[tPos] == ',') { param[iF] = stack[tok]; paramTyp[iF++] = 'w'; tok = ++tPos; goto loop; } else if (stack[tPos] == '*') { param[iF] = sBau('^', stack[tok], 'w', 'w', ' '); paramTyp[iF++] = 's'; if (stack[++tPos] == ',') { tok = ++tPos; goto loop; } } else if (stack[tPos] == 185) { param[iF] = sBau('&', stack[tok], 'w', 'w', ' '); paramTyp[iF++] = 's'; if (stack[++tPos] == ',') { tok = ++tPos; goto loop; } } else { param[iF] = stack[tok]; paramTyp[iF++] = 'w'; } param[iF] = 0; iF = 1; while (param[iF]) { param[0] = sBau(param[0], param[iF], paramTyp[0], paramTyp[iF], '.'); ++iF; paramTyp[0] = 's'; } return param[0]; } void Baum::structBaum(int k) { int i, worti; if (iN) //1 { for (i = 1; i < iN; ++i) { mintN[0] = sBau(mintN[0], mintN[i], 's' , 's', '.'); } while (s[k].t1 == 's') k = s[k].sl; if (s[k].v == '"') // 2 { worti = wortI("main"); if (s[k].sl != worti) k = vLSatz(worti); if (k) { k = s[k].sr; if (s[k].v == 'f') { iN = mintN[0]; mintN[0] = k; anbauRl(k, iN, 's', '.'); return; } } } cout << "kein structEinBau möglich, main fehlt !" << endl; } } //1 iN : anzahl der strukte //2 suche main hauptprogramm, strukte werden dort eingehängt void Baum::iiBaum(int k) { int k1; if (s[k].v == '"') { if (s[k].t2 == 's') { k1 = s[k].sr; if (s[k1].v == 'f') { fNr = s[k].sl; iiBaum(k1); stckrset(); stck1 = stack; mountRek(s[k1].sr); *stck1 = 0; if (*stack) mountTree(); return; } } } if (iiFall(s[k].sl, s[k].t1, k, 'l')) iiBaum(s[k].sl); if (iiFall(s[k].sr, s[k].t2, k, 'r')) iiBaum(s[k].sr); } void Baum::mountRek(int k) // arbeitet eine funktion ab { if (s[k].v == 'ß') *stck1++ = k; else { if (s[k].t1 == 's') mountRek(s[k].sl); if (s[k].t2 == 's') mountRek(s[k].sr); } } void Baum::mountTree() { int k, fName; stck2 = stck1 = stack; while (*stck1) { k = *stck1++; txt1 = tex; *txt1++ = ':'; txt2 = w[fNr].st; while (*txt2) *txt1++ = *txt2++; *txt1 = 0; fName = wortI(tex); umbau(k, 'r', fName, 'w'); s[k].v = '}'; } } char Baum::iiFall(int k, char t, int wrzl, char lr) { if (t == 's') { if (s[k].t1 == 'i' && s[k].t2 == 'i') { if (lr == 'l') { k = iiBau(k, t); umbau(wrzl, 'l', k, t); return 0; } else { k = iiBau(k, t); umbau(wrzl, 'r', k, t); return 0; } } return 1; } return 0; } int Baum::iiBau(int k, char& t) { int tEnd; tok = s[k].sl; tEnd = s[k].sr; k = iiRek(tEnd, t); return k; } int Baum::iiRek(int tEnd, char& t) { int tPos, tok0, kL, kR, k; char tL; if (! cstack[tok] && stack[tok] == '(') { ++tok; tPos = klammerZu(tok, '(', ')'); if (tPos - tok == 2) { t = cstack[tok]; k = stack[tok]; } else k = iiRek(tPos - 1, t); if (tPos < tEnd) { if (castFall(k, t)) { kL = k; tL = t; tok = tPos; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '§'); t = 's'; return k; } stack[tPos - 1] = k; cstack[tPos - 1] = t; tok = tPos - 1; } else return k; } if (! cstack[tok] && stack[tok] == '[') { ++tok; tPos = klammerZu(tok, '[', ']'); k = iiRek(tPos - 1, t); if (tPos < tEnd) { stack[tPos - 1] = k; cstack[tPos - 1] = t; tok = tPos - 1; } else return k; } if (cstack[tok] == 's') { k = stack[tok]; if (s[k].sl == '^') { kL = k; tL = 's'; ++tok; kR = iiRek(tEnd, t); if (t == 'w') { k = sBau(kR, kL, 'w', 's', '"'); t = 's'; } else { iS = 0; nachBauZ(kL , kR); nachBauZ1(kL); k = mintS[0]; t = 's'; } return k; } } if (tEnd - tok == 2) { if (cstack[tok] && cstack[tok + 1]) { k = sBau(stack[tok], stack[tok + 1], cstack[tok], cstack[tok + 1], ' '); k = nachBau(k); t = 's'; return k; } } tPos = tok; if (tEnd - tok <= 1) { k = stack[tok]; t = cstack[tok]; return k; } if (cstack[tPos] == 'w' && stack[tPos] == '}') { kL = '}'; ++tok; kR = iiRek(tEnd, t); k = sBau(kR, kL, t, 'w', ' '); t = 's'; return k; } if (cstack[tPos] && cstack[tPos + 1]) { if (cstack[tok] == 'w' && datenTyp(stack[tok])) { kL = stack[tok]; tL = cstack[tok]; ++tok; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, ' '); k = nachBau(k); t = 's'; return k; } } while (tPos < tEnd) { if (! cstack[tPos] && stack[tPos] == '(') { tPos = klammerZu(tPos + 1, '(',')'); continue; } if (! cstack[tPos] && stack[tPos] == '[') { tPos = klammerZu(tPos + 1, '[',']'); continue; } if (! cstack[tPos]) { if (stack[tPos] == ',') { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '.'); t = 's'; return k; } } ++tPos; } tPos = tok; while (tPos < tEnd) { if (! cstack[tPos] && stack[tPos] == '(') { tPos = klammerZu(tPos + 1, '(',')'); continue; } if (! cstack[tPos] && stack[tPos] == '[') { tPos = klammerZu(tPos + 1, '[',']'); continue; } if (! cstack[tPos]) { if (stack[tPos] == '=') { kL = iiRek(tPos, t); tL = t; if (! kL) { kL = mintM[iM - 1]; tL = s[kL].t2; kL = s[kL].sr; } tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '='); t = 's'; return k; } } ++tPos; } tPos = tok; while (tPos < tEnd) { if (! cstack[tPos] && stack[tPos] == '(') { tPos = klammerZu(tPos + 1, '(',')'); continue; } if (! cstack[tPos] && stack[tPos] == '[') { tPos = klammerZu(tPos + 1, '[',']'); continue; } if (! cstack[tPos]) { if (stack[tPos] == 'C') { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '.'); if (tL == 'w' && (kL == '!' || kL == '?')) s[k].v = ' '; t = 's'; return k; } } ++tPos; } tPos = tok; while (tPos < tEnd) { if (! cstack[tPos] && stack[tPos] == '(') { tPos = klammerZu(tPos + 1, '(',')'); continue; } if (! cstack[tPos] && stack[tPos] == '[') { tPos = klammerZu(tPos + 1, '[',']'); continue; } if (! cstack[tPos]) { if (stack[tPos] == '|') { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '|'); t = 's'; return k; } } ++tPos; } tPos = tok; while (tPos < tEnd) { if (! cstack[tPos] && stack[tPos] == '(') { tPos = klammerZu(tPos + 1, '(',')'); continue; } if (! cstack[tPos] && stack[tPos] == '[') { tPos = klammerZu(tPos + 1, '[',']'); continue; } if (! cstack[tPos]) { if (stack[tPos] == '&') { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '&'); t = 's'; return k; } } ++tPos; } tPos = tok; while (tPos < tEnd) { if (! cstack[tPos] && stack[tPos] == '(') { tPos = klammerZu(tPos + 1, '(',')'); continue; } if (! cstack[tPos] && stack[tPos] == '[') { tPos = klammerZu(tPos + 1, '[',']'); continue; } if (! cstack[tPos]) { if (stack[tPos] == '?') { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '?'); t = 's'; return k; } if (stack[tPos] == 191) { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '¿' ); t = 's'; return k; } } ++tPos; } tPos = tok; while (tPos < tEnd) { if (! cstack[tPos] && stack[tPos] == '(') { tPos = klammerZu(tPos + 1, '(',')'); continue; } if (! cstack[tPos] && stack[tPos] == '[') { tPos = klammerZu(tPos + 1, '[',']'); continue; } if (! cstack[tPos]) { if (stack[tPos] == '<') { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '<'); t = 's'; return k; } if (stack[tPos] == '>') { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '>' ); t = 's'; return k; } if (stack[tPos] == 171) { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '«'); t = 's'; return k; } if (stack[tPos] == 187) { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '»' ); t = 's'; return k; } } ++tPos; } tPos = tok; while (tPos < tEnd) { if (! cstack[tPos] && stack[tPos] == '(') { tPos = klammerZu(tPos + 1, '(',')'); continue; } if (! cstack[tPos] && stack[tPos] == '[') { tPos = klammerZu(tPos + 1, '[',']'); continue; } if (! cstack[tPos]) { if (stack[tPos] == '+') { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '+'); t = 's'; return k; } if (stack[tPos] == '-') { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '-' ); t = 's'; return k; } } ++tPos; } tPos = tok; while (tPos < tEnd) { if (! cstack[tPos] && stack[tPos] == '(') { tPos = klammerZu(tPos + 1, '(',')'); continue; } if (! cstack[tPos] && stack[tPos] == '[') { tPos = klammerZu(tPos + 1, '[',']'); continue; } if (! cstack[tPos]) { if (stack[tPos] == '*') { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '*'); t = 's'; return k; } if (stack[tPos] == '/') { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '/' ); t = 's'; return k; } if (stack[tPos] == '%') { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '%'); t = 's'; return k; } } ++tPos; } tPos = tok; while (tPos < tEnd) { if (! cstack[tPos] && stack[tPos] == '(') { tPos = klammerZu(tPos + 1, '(',')'); continue; } if (! cstack[tPos] && stack[tPos] == '[') { tPos = klammerZu(tPos + 1, '[',']'); continue; } if (cstack[tPos] == 'w') { if (stack[tPos] == 176 || stack[tPos] == '-' || stack[tPos] == 191 || stack[tPos] == '^') { if (tok == tPos) { tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(stack[tPos], kR, 'w', t, ' '); } else { kL = iiRek(tPos, t); tL = t; tok = tPos; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, ' '); } t = 's'; return k; } } ++tPos; } tPos = tok; // foo(), *(..), --(..) while (tPos < tEnd) { if (! cstack[tPos] && stack[tPos] == '[') { tPos = klammerZu(tPos + 1, '[',']'); continue; } if (! cstack[tPos] && stack[tPos] == '(') { tok0 = tok; tok = tPos; kR = iiRek(tEnd, t); --tPos; if (stack[tPos] != fNr) { if (stack[tPos] == 176 || stack[tPos] == '-' || stack[tPos] == 191 || stack[tPos] == '^') k = sBau(stack[tPos], kR, 'w' , t, ' '); else if (stack[tPos] == pp_) k = sBau(kR, '+', t, 'w', '('); else if (stack[tPos] == mm_) k = sBau(kR, '-', t, 'w', '('); else k = sBau(kR, stack[tPos], t, cstack[tPos], '}'); } else k = sBau(kR,stack[tPos], t, cstack[tPos], 'ß'); if (tPos - tok0) { stack[tPos] = k; cstack[tPos] = 's'; tok = tok0; k = iiRek(tPos + 1, t); } t = 's'; return k; } ++tPos; } tPos = tok; // -> while (tPos < tEnd) { if (! cstack[tPos] && stack[tPos] == '(') { tPos = klammerZu(tPos + 1, '(',')'); continue; } if (! cstack[tPos] && stack[tPos] == '[') { tPos = klammerZu(tPos + 1, '[',']'); continue; } if (! cstack[tPos]) { if (stack[tPos] == '^') { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '^'); t = 's'; return k; } } ++tPos; } tPos = tok; // . while (tPos < tEnd) { if (! cstack[tPos] && stack[tPos] == '(') { tPos = klammerZu(tPos + 1, '(',')'); continue; } if (! cstack[tPos] && stack[tPos] == '[') { tPos = klammerZu(tPos + 1, '[',']'); continue; } if (! cstack[tPos]) { if (stack[tPos] == '.') { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, 'o'); t = 's'; return k; } } ++tPos; } tPos = tok; // # while (tPos < tEnd) { if (! cstack[tPos] && stack[tPos] == '(') { tPos = klammerZu(tPos + 1, '(',')'); continue; } if (! cstack[tPos] && stack[tPos] == '[') { tPos = klammerZu(tPos + 1, '[',']'); continue; } if (! cstack[tPos]) { if (stack[tPos] == '#') { kL = iiRek(tPos, t); tL = t; tok = tPos + 1; kR = iiRek(tEnd, t); k = sBau(kL, kR, tL, t, '#'); t = 's'; return k; } } ++tPos; } tPos = tok; // array[] while (tPos < tEnd) { if (! cstack[tPos] && stack[tPos] == '(') { tPos = klammerZu(tPos + 1, '(',')'); continue; } if (! cstack[tPos] && stack[tPos] == '[') { tok0 = tok; tok = tPos; kR = iiRek(tEnd, t); --tPos; k = sBau(stack[tPos], kR, cstack[tPos], t, '['); if (tPos - tok0) { stack[tPos] = k; cstack[tPos] = 's'; tok = tok0; k = iiRek(tPos + 1, t); } t = 's'; return k; } ++tPos; } t = 'w'; return auto_; } char Baum::castFall(int k, char t) { if (t == 'w') return datenTyp(k); if (s[k].v == ' ' && s[k].sl == '^' && s[k].t2 == 'w') return datenTyp(s[k].sr); return 0; } int Baum::nachBau(int k) { int sl, sr, t1, t2; char v; sl = s[k].sl; sr = s[k].sr; t1 = s[k].t1; t2 = s[k].t2; if (t2 == 'w') { if (sr == pp_ ) { s[k].lc = OUTLOC; k = sBau(sl, '+', t1, 'w', ')'); return k; } if (sr == mm_) { s[k].lc = OUTLOC; k = sBau(sl, '-', t1, 'w', ')'); return k; } } if (t1 == 'w') { if (sl == pp_) { s[k].lc = OUTLOC; k = sBau(sr, '+', t2, 'w', '('); return k; } if (sl == mm_) { s[k].lc = OUTLOC; k = sBau(sr, '-', t2, 'w', '('); return k; } if (sl == new_) { v = s[k].v = '"'; return k; } if (sl == delete_ || sl == '}') { s[k].v = ' '; return k; } } if (t2 == 'w' && s[k].sr == k1_) { CntrlU(k); if (fNr == s[k].sr) s[k].v = 'ß'; else s[k].v = '}'; return k; } if (s[k].v == ' ') { if (t2 == 'w') { if (t1 == 's') { if (s[sl].t1 == 'w') { if (s[sl].sl == '^') { s[k].v = '^'; abbauLl(k); } else if (s[sl].sl == 176) { s[k].v = 'r'; abbauLl(k); } } } } else if (t2 == 's' && s[sr].v == '[') { if (t1 == 'w' && (sl == 176 || sl == '^' || sl == 191 || sl == '-')) return k; umbau(k, 'l', s[sr].sl, s[sr].t1); umbau(sr, 'l', sl, t1); s[k].v = '"'; } } return k; } void Baum::nachBauZ(int kL, int k) { if (s[k].v == '[') { mintS[iS] = sBau(kL, s[k].sr, 's', s[k].t2, '['); mintS[iS] = sBau(s[k].sl, mintS[iS], 'w', 's', '"'); ++iS; mintS[iS] = 's'; ++iS; return; } if (s[k].t1 == 's') { if (s[s[k].sl].v == '.') nachBauZ(kL, s[k].sl); else if (s[s[k].sl].v == ' ') { if (s[s[k].sl].t2 == 's') nachBauZ(kL, s[s[k].sl].sr); else { mintS[iS] = s[s[k].sl].sr; ++iS; mintS[iS] = 'w'; ++iS; } } else if (s[s[k].sl].v == '[') nachBauZ(kL, s[k].sl); } else { mintS[iS] = s[k].sl; ++iS; mintS[iS] = 'w'; ++iS; } if (s[k].t2 == 's') { if (s[s[k].sr].v == '.') nachBauZ(kL, s[k].sr); else if (s[s[k].sr].v == ' ') { if (s[s[k].sr].t2 == 's') nachBauZ(kL, s[s[k].sr].sr); else { mintS[iS] = s[s[k].sr].sr; ++iS; mintS[iS] = 'w'; ++iS; } } } else { mintS[iS] = s[k].sr; ++iS; mintS[iS] = 'w'; ++iS; } } void Baum::nachBauZ1(int k) { int i; if (mintS[1] == 'w') mintS[0] = sBau(mintS[0], k, 'w', 's', '"'); for (i = 2; i < iS; i+= 2) { if (mintS[i+1] == 'w') mintS[i] = sBau(mintS[i], k, 'w', 's', '"'); mintS[0] = sBau(mintS[0], mintS[i], 's', 's', '.'); } } void Baum::hashRek(int k) { int sl, sr; if (s[k].v == '#') { hashBau(k); return; } sl = s[k].sl; sr = s[k].sr; if (s[k].t1 == 's') hashRek(sl); if (s[k].t2 == 's') hashRek(sr); } void Baum::hashBau(int kNr) { int k; while (s[kNr].t2 == 's' && s[s[kNr].sr].v == '#') { k = s[s[kNr].sr].sl; abbauRl(kNr); anbauLr(kNr, k, 'w', '#'); } } void Baum::castRek(int k) { int sl, sr; if (s[k].v == 'f') k = s[k].sr; sl = s[k].sl; sr = s[k].sr; if (s[k].v == '}') { if (s[k].t2 == 'w') { if (datenTyp(sr)) { CntrlU(k); s[k].v = '§'; return; } } else if (s[sr].t1 == 'w' && s[sr].sl == '^') { CntrlU(k); s[k].v = '§'; return; } } if (s[k].t1 == 's') castRek(sl); if (s[k].t2 == 's') castRek(sr); } void Baum::varBaum(int kNr) { int k; if (s[kNr].v == '"') { if (s[kNr].t2 == 's') { k = s[kNr].sr; if (s[k].v == 'f') { iM = 0; eqClr(s[k].sr); declClr(k); varBau(k); return; } } } if (s[kNr].t1 == 's') varBaum(s[kNr].sl); if (s[kNr].t2 == 's') varBaum(s[kNr].sr); } void Baum::eqClr(int k) { if (s[k].v == '=') { if (s[k].t1 == 's') { ast = s[k].sl; if (s[ast].v == ' ') { if (s[ast].t1 == 'w') { if (datenTyp(s[ast].sl)) { mintM[iM] = ast; ++iM; umbau(k, 'l', s[ast].sr, s[ast].t2); } } else { li = s[ast].sl; if (s[li].sl == '^' || s[li].sl == 176) { mintM[iM] = ast; ++iM; umbau(k, 'l', s[ast].sr, s[ast].t2); } } } } return; } if (s[k].t1 == 's') eqClr(s[k].sl); if (s[k].t2 == 's') eqClr(s[k].sr); } void Baum::declClr(int k) { int sL, sR; sL = 0; sR = 0; if (s[k].v == ' ') { ast = s[k].sl; if (s[k].t1 == 'w') { if (datenTyp(ast)) { mintM[iM] = k; ++iM; s[k].lc = 1; } } else if (s[ast].sl == '^' || s[ast].sl == 176) { mintM[iM] = k; ++iM; s[k].lc = 1; } return; } if (s[k].v == '"') { ast = s[k].sr; if (s[k].t2 == 's') { if (s[ast].v == ' ' || s[ast].v == '[') { mintM[iM] = k; ++iM; s[k].lc = 1; } } return; } if (s[k].v != '.' && s[k].v != 'f') return; if (s[k].v == '.') { if (s[k].t1 == 's') { sL = s[k].sl; declClr(sL); if (s[sL].lc == 2) { umbau(k, 'l', s[sL].sr, s[sL].t2); } else if (s[sL].lc == 3) { umbau(k, 'l', s[sL].sl, s[sL].t1); } } } if (s[k].t2 == 's') { sR = s[k].sr; declClr(sR); if (s[sR].lc == 2) { umbau(k, 'r', s[sR].sr, s[sR].t2); } else if (s[sR].lc == 3) { umbau(k, 'r', s[sR].sl, s[sR].t1); } } if (sL) { if (s[sL].lc == 1) { if (sR) { if (s[sR].lc == 1) { s[k].lc = 1; return; } } s[k].lc = 2; return; } } if (sR) { if (s[sR].lc == 1) { s[k].lc = 3; } } } void Baum::varBau(int kNr) { int i, k, kk; i = k = 0; while (i < iM) { kk = mintM[i]; ++i; if (! k) k = kk; else k = sBau(k, kk, 's', 's', '.'); } if (i) { if (s[kNr].t1 == 's') { kk = s[kNr].sl; if (s[kk].v == '}') { k = sBau(s[kk].sl, k, s[kk].t1, 's', '·'); k = sBau(k, s[kk].sr, 's', s[kk].t2, '}'); } else k = sBau(kk, k, 's', 's', '·'); umbau(kNr, 'l', k, 's'); } else umbau(kNr, 'l', k, 's'); } } void Baum::equalBaum(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 == 'f') { if (t1 == 's') { iM = 0; eqBaumRek(sl); if (iM) { sl = mintM[0]; nr = 1; while (nr < iM) { sr = mintM[nr]; sl = sBau(sl, sr, 's', 's', ' '); s[sl].v = '.'; ++nr; } anbauRl(k, sl, 's', '.'); k = s[k].sr; } } equalBaum(s[k].sr); } else { if (t1 == 's') equalBaum(sl); if (t2 == 's') equalBaum(sr); } } void Baum::eqBaumRek(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 (t1 == 's') { if (s[sl].v == '=') { mintM[iM] = sl; ++iM; } else eqBaumRek(sl); } if (t2 == 's') { if (s[sr].v == '=') { mintM[iM] = sr; ++iM; } else eqBaumRek(sr); } } void Baum::equalBaumClr(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 == 'f') { if (t1 == 's') eqBaumClrRek(sl); } else { if (t1 == 's') equalBaumClr(sl); if (t2 == 's') equalBaumClr(sr); } } void Baum::eqBaumClrRek(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 (t1 == 's') { if (s[sl].v == '=') abbauLr(k); else eqBaumClrRek(sl); } if (t2 == 's') { if (s[sr].v == '=') abbauRr(k); else eqBaumClrRek(sr); } } void Baum::switchBaum(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 != '"') { if (t1 == 's') switchBaum(sl); if (t2 == 's') switchBaum(sr); } else { if (sl != case_) { if (t2 == 's') switchBaum(sr); } else caseBaum(sr); } } void Baum::caseBaum(int k) { if (s[k].v == ',') caseDel(k); else { caseBaum(s[k].sl); caseBaum(s[k].sr); } } void Baum::caseDel(int kNr) { int k[50]; int kI; k[0] = kNr; kI = 1; while (s[kNr].t2 == 's') { k[kI] = kNr = s[kNr].sr; ++kI; } if (s[kNr].sr == break_) { kNr = k[kI - 2]; abbauRr(kNr); } } void Baum::copyTree(int kNr) { int k, kk, kf, i; iM = 0; mainList(root); loc = STDLOC; k = 0; for (i = 0; i < iM; ++i) { kk = mintM[i]; iF = 0; kf = copyTreeRek(s[kk].sr); if (kf != s[kk].sr) kk = sBau(s[kk].sl, kf, 'w', 's', '"'); if (! k) k = kk; else k = sBau(k, kk, 's', 's', '.'); } root = k; baumLoc(kNr); if (! s[root].b) s[kNr].lc = OUTLOC; } void Baum::mainList(int k) { if (s[k].v == '"' && s[k].t2 == 's') { ast = s[k].sr; if (s[ast].v == 'f') { fNr = s[k].sl; if (! vSatz(fNr, 'w', '}')) { mintM[iM] = k; ++iM; } return; } } if (s[k].t1 == 's') mainList(s[k].sl); if (s[k].t2 == 's') mainList(s[k].sr); } int Baum::copyTreeRek(int k) { int sl, sr, sL, sR; char tL, tR; sl = s[k].sl; sr = s[k].sr; if (s[k].v == 'f') { sL = sl; tL = s[k].t1; sR = copyTreeRek(sr); tR = 's'; if (sR == sr) return k; else return sBau(sL, sR, tL, tR, 'f'); } if (s[k].t1 == 'w') { sL = sl; tL = 'w'; } else { sL = copyTreeRek(sl); tL = 's'; } if (s[k].v == '}') { if (s[k].t2 == 'w') { if (inRekList(sr)) { txt1 = w[sr].st; txt2 = tex; *txt2++ = ':'; while (*txt1) *txt2++ = *txt1++; *txt2 = 0; sR = wortI(tex); tR = 'w'; } else { if (vSatz(sr, 'w', '"')) { mintF[iF] = sr; ++iF; sR = copyTreeRek(rSatz); tR = 's'; --iF; } //1 else { sR = sr; tR = 'w'; } } } else { sR = sr; tR = 's'; } if (sL == sl && sR == sr && tL == s[k].t1 && tR == s[k].t2) return k; else return sBau(sL, sR, tL, tR, '}'); } if (s[k].t2 == 'w') { if (sL == sl && tL == s[k].t1) { s[k].lc = STDLOC; return k; } return sBau(sL, sr, tL, 'w', s[k].v); } sR = copyTreeRek(sr); tR = 's'; if (sL == sl && sR == sr && tL == s[k].t1 && tR == s[k].t2) { s[k].lc = STDLOC; return k; } return sBau(sL, sR, tL, tR, s[k].v); } //1: rSatz : erstes glied der rückzeigerkette char Baum::inRekList(int fName) { int i; for (i = 0; i < iF; ++i) { if (fName == mintF[i]) return 1; } return 0; } void Baum::k1Del(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 (t1 == 's' && s[sl].v == '}') { if (s[sl].t1 == 'w' && s[sl].sl == k1_) { umbau(k, 'l', s[sl].sr, s[sl].t2); sl = s[k].sl; t1 = s[k].t1; } } if (t1 == 's') k1Del(sl); if (s[k].v == '"' && t2 == 's') k = sr; if (t2 == 's' && s[sr].v == '}') { if (s[sr].t1 == 'w' && s[sr].sl == k1_) { umbau(k, 'r', s[sr].sr, s[sr].t2); sr = s[k].sr; t2 = s[k].t2; } } if (t2 == 's') k1Del(sr); } void Baum::structUmbau() { int k; k = mintN[0]; abbauRl(k); if (s[k].t1 == 's') { k = s[k].sl; if (s[k].v == '}') { if (s[k].t1 == 's') k = s[k].sl; else cout << "kein structEinBau möglich!" << endl; } if (s[k].v == '·') anbauRl(k, iN, 's', '.'); return; } cout << "kein structEinBau möglich!" << endl; } //1 iN : structBaum void Baum::zeigerUmbau(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].sl == '^') { s[k].v = '^'; CntrlU(k); umbau(k, 'l', s[sr].sr, 'w'); return; } if (s[k].v == 'r') //1 { wrzl = s[k].h; if (s[wrzl].v != '=') { umbau(k, 'l', ':', 'w'); s[k].v = ' '; return; } umbau(wrzl, 'l', sr, 'w'); s[wrzl].v = ':'; CntrlU(wrzl); Ast = wrzl; ast = s[wrzl].sl; satzi = wrzl = s[Ast].h; while (s[wrzl].v != 'f') wrzl = s[wrzl].h; refUmbau(s[wrzl].sl); wrzl = s[satzi].h; if (Ast == s[satzi].sl) { if (satzi == s[wrzl].sl) umbau(wrzl, 'l', s[satzi].sr, s[satzi].t2); else umbau(wrzl, 'l', s[satzi].sl, s[satzi].t1); } else { if (satzi == s[wrzl].sl) umbau(wrzl, 'r', s[satzi].sr, s[satzi].t2); else umbau(wrzl, 'r', s[satzi].sl, s[satzi].t1); } return; } if (t1 == 's') { s[sl].h = k; zeigerUmbau(sl); } if (t2 == 's') { s[sr].h = k; zeigerUmbau(sr); } } //1 referenz void Baum::refUmbau(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 (t1 == 's') refUmbau(sl); else if (s[k].sl == ast) umbau(k, 'l', Ast, 's'); if (t2 == 's') refUmbau(sr); else if (s[k].sr == ast) umbau(k, 'r', Ast, 's'); } void Baum::newUmbau(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].sl == new_) { if (s[sr].t2 == 's') { s[k].v = '"'; sr = sBau('[', s[s[sr].sr].sr, 'w', s[s[sr].sr].t2, ' '); umbau(k, 'r', sr, 's'); } else { s[k].v = ' '; umbau(k, 'l', '[', 'w'); umbau(k, 'r', sl, t1); } return; } else if (s[k].v == ' ' && t2 == 's') { if (sl == mm_) { umbau(k, 'l', '-', 'w'); s[k].v = '('; CntrlU(k); } else if (sl == pp_) { umbau(k, 'l', '+', 'w'); s[k].v = '('; CntrlU(k); } return; } if (t1 == 's') newUmbau(sl); if (t2 == 's') newUmbau(sr); } void Baum::retUmbau(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 == '§') { if (t1 == 's') // && s[sl].v == ' ' && s[sl].t1 == 'w' && s[sl].sl == '^' && s[sl].t2 == 'w') { umbau(k, 'l', s[sl].sr, 'w'); s[k].v = '^'; } else s[k].v = ' '; } if (t1 == 's') retUmbau(sl); else if (s[k].sl == 183 && s[k].v == ' ') { CntrlU(k); s[k].v = '}'; } if (t2 == 's') retUmbau(sr); }


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