//datei-name: equal0.C (der syntax-check)
#include "baum.h"
void Baum::gBaum0(int k)
{ int i, fAst;
int sl, sr; char t1, t2, v;
sl = s[k].sl; sr = s[k].sr; t1 = s[k].t1; t2 = s[k].t2; v = s[k].v;
glob = iF = 0;
if (v != '"' || t2 != 's' || s[sr].v != 'f')
{ err = k; cout << "gBaum0"; return; }
equalBaum(k); equalBaumClr(k);
shadow0(k);
if (err) return;
{ for (i = iF - 1; i >= 0; --i)
{ k = mintF[i]; fAst = s[k].sr; //1
locals = 0;
if (s[fAst].t1 == 's')
{ k = s[fAst].sl;
if (s[k].v == '}') umbau(fAst, 'l', s[k].sl, s[k].t1); } //2
if (s[fAst].t1 == 'w')
{ if (s[fAst].sl != 183)
{ err = fAst; cout << "gBaum0: \err"; return; } }
else
{ iStruct = 0; k = s[fAst].sl;
paramScan0(k);
if (err) return;
locals = k; //3
if (i == iF - 1) glob = locals; }
k = s[fAst].sr; //4
fooScan0(k); } } }
//1 funktion aus tabelle holen (s[fAst].v : 'f')
//2 verwirft rckgabeTyp
//3 locals : deklarationsAst fr lokale (im mainFall globale) variablen
//4 k : funktionsRumpf
void Baum::shadow0(int k)
//listet (rekursiv) vorhandene funktionen auf.
{ int sl, sr; 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 == '"')
{ if (t2 != 's')
{ err = k; cout << "shadow0: err/"; return; }
if (s[sr].v == 'f')
{ if (s[sr].t2 != 's')
{ err = k; cout << "shadow0: err"; return; }
for (i = 0; i < iF; ++i)
{ if (k == mintF[i]) return; }
shadow0(s[sr].sr);
mintF[iF] = k; ++iF; return; } } //:
if (t1 == 's') shadow0(sl);
if (t2 == 's') shadow0(sr); }
void Baum::paramScan0(int k)
{ if (s[k].v == '.' || s[k].v == '')
{ if (s[k].t1 == 'w')
{ err = k; cout << "paramScan0: \err"; return; }
paramScan0(s[k].sl);
if (s[k].t2 == 'w')
{ err = k; cout << "paramScan0: err/"; return; }
paramScan0(s[k].sr); }
else varSBau0(k); }
void Baum::varSBau0(int k)
//prft variablen-deklaration
{ int i, k1, dim1, dim2;
int sl, sr; 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 == ':')
{ if (t1 == 's' || t2 == 's')
{ err = k; cout << "varSBau0: refSyntax"; } } //1
else if (v == ' ' || v == '^') //2
{ if (t1 == 's')
{ err = k; cout << "varSBau0: \err"; return; }
if (sl == ':')
{ if (v != ' ')
{ err = k; cout << "varSBau0: refSyntax"; } //1
return; }
if (typScan0(sl))
{ if (t2 == 's') varSBauRek0(sr);
return; }
if (t2 == 's')
{ err = k; cout << "varSBau0: typSyntax"; return; }
if (iStruct)
{ for (i = 0; i < iStruct; ++i)
{ if (sl == s[mStruct[i]].sl) return; } }
err = k; cout << "varSBau0: err"; }
else if (v == '"') //3
{ if (s[sr].v != '[') //4
{ err = k; cout << "varSBau0: '[' exspected in /"; return; }
if (s[sr].t1 == 'w')
{ if (typScan0(s[sr].sl)) return; }
cout << "varSBau0: typ in *" << sr << "\\";
if (s[sr].t2 == 'w')
{ dim1 = atoi(w[s[sr].sr].st);
if (! dim1)
{ err = sr; cout << "varSBau0: int exspected in /"; } }
else
{ k1 = s[sr].sr;
if (!(s[k1].v == '.' && s[k1].t1 == 'w' && s[k1].t2 == 'w'))
{ err = sr; cout << "varSBau0: / geht leider nicht"; return; }
dim1 = atoi(w[s[k1].sl].st); dim2 = atoi(w[s[k1].sr].st);
if (!(dim1 && dim2))
{ err = sr; cout << "varSBau0: / geht leider nicht"; } } }
else
{ if (v == 'S') //5
{ if (t2 == 'w')
{ err = k; cout << "varSBau0: err"; return; }
paramScan0(sr);
if (err) return;
mStruct[iStruct] = k; ++iStruct; } } }
//1 unterscheidet zwischen lokalReferenz (ri : i) und paramReferenz (: ref)
//2: z.b. int i char ^ p S s
//3: label //4: array //5: struct
char Baum::typScan0(int e)
{ if (e == char_ || e == int_ || e == atom_ || e == knot_ || e == back_ ||
e == long_ || e == float_ || e == double_ || e == uchar_ || e == uint_ || e == ulong_)
return 1;
else return 0; }
void Baum::varSBauRek0(int k)
{ if (s[k].v != '.' && s[k].v != ':')
{ err = k; cout << "varSBauRek0: v-err"; return; }
if (s[k].t1 == 's') varSBauRek0(s[k].sl);
if (s[k].t2 == 's') varSBauRek0(s[k].sr); }
void Baum::fooScan0(int k)
{ int sl, sr; char t1, t2, v; Ast = 0;
if (err) return;
sl = s[k].sl; sr = s[k].sr; t1 = s[k].t1; t2 = s[k].t2; v = s[k].v;
if (t1 == 'w')
{ if (sl == '!' || sl == '?')
{ if (v != ' ' && v != '"')
{ err = k; cout << "fooScan0: v-err"; }
else if (t2 == 's') fooScan0(sr);
else if (sl != 183) varScanR0(k);
return; }
if (punkt0(sl))
{ if (v != ' ')
{ err = k; cout << "fooScan0: v-err"; return; } } }
if (v == ' ') blankScan0(k);
else if (v == '"')
{ if (s[sr].v == 'f') return;
if (s[sr].v == ' ' && s[sr].t2 == 'w' && s[sr].sr == '}')
{ if (s[sr].t1 == 's') fooScan0(s[sr].sl);
else varScanL0(sr);
return; }
labScan0(k);
if (err) return;
fooScan0(sr); }
else if (v == 'o') structScan0(k);
else if (v == '#') knotScan0(k); //1
// else if (v == '') castScan0(k);//2
else if (v == '(')
{ if (t2 == 'w')
{ if (t1 != 'w')
{ err = k; cout << "fooScan0: crementSyntax"; } } }
else if (v == ')')
{ if (t2 == 'w' && !(sr == '+' || sr == '-'))
{ err = k; cout << "fooScan0: crementSyntax"; } }
else if (v == ':')
{ err = k; cout << "fooScan0: v-err"; }
else if (v == '@')
{ err = k; cout << "fooScan0: v-err"; }
else if (v == '^')
{ if (! typScan0(sl))
{ err = k; cout << "fooScan0: castSyntax"; } }
else
{ if (t1 == 's') fooScan0(sl);
else varScanL0(k);
if (t2 == 's') fooScan0(sr);
else varScanR0(k); } }
//k = funktionsrumpf (-f->)
//f locals zeigt an ob ein deklarationsAst vorhanden ist
//1 baumOperator #
//2 castOperator
void Baum::labScan0(int k)
{ char t2; int sl, sr;
t2 = s[k].t2; sl = s[k].sl; sr = s[k].sr;
if (sl == if_then)
{ if (s[sr].v != ',')
{ err = sr; cout << "labScan0: ',' expected"; } }
else if (sl == do_while)
{ if (s[sr].v != ';')
{ err = sr; cout << "labScan0: ';' expected"; } }
else if (sl == while_do)
{ if (s[sr].v != '_')
{ err = sr; cout << "labScan0: '_' expected"; } }
else if (sl == for_do)
{ if (s[sr].v != '~')
{ err = sr; cout << "labScan0: '~' expected"; }
else if (s[s[sr].sl].v != '&')
{ err = s[sr].sl; cout << "labScan0: '&' expected"; }
else if (s[s[s[sr].sl].sl].v != '|')
{ err = s[s[sr].sl].sl; cout << "labScan0: '|' expected"; } }
else if (s[sr].v == ' ')
{ if (s[sr].sl == '[')
{ worti = sl; getAst0();
if (! Ast)
{ err = sr; cout << "labScan0: var expected in '\'"; }
betrag = atoi(w[s[sr].sr].st);
if (!betrag)
{ err = sr; cout << "labScan0: int expected in '/'"; } }
else if (s[sr].sl == '!') fooScan(sr);
else
{ err = k; cout << "labScan0: err"; } } }
char Baum::punkt0(int e)
{ if (e == '"' || e == '^' || e == 176 || e == 191 || e == '[' || e == goto_ || e == do_)
return 1; //1
return 0; }
//1 176 = '' . 191 = ''
void Baum::getAst0()
//setzt worti voraus . prft, ob worti eine gltige variable ist (Ast)
{ Ast = 0;
if (locals) varTest0(locals);
if (! Ast)
{ if (glob && glob != locals) varTest0(glob); } }
void Baum::varTest0(int k)
{ if (! Ast)
{ if (s[k].v == '.' || s[k].v == '')
{ varTest0(s[k].sl);
if (! Ast) varTest0(s[k].sr); }
else if (s[k].v == ' ' || s[k].v == '^')
{ if (s[k].t2 == 'w')
{ if (worti == s[k].sr) Ast = k; }
else
{ varTestRek0(s[k].sr);
if (Ast) Ast = k; } }
else if (s[k].v == '"')
{ if (worti == s[k].sl) Ast = s[k].sr; }
else if (s[k].v == 'S')
{ if (worti == s[k].sl) Ast = s[k].sr; }
else if (s[k].v == 'r')
{ if (worti == s[k].sl) Ast = s[k].sr; } } }
void Baum::varTestRek0(int k)
{ if (s[k].t1 == 's') varTestRek0(s[k].sl);
else if (worti == s[k].sl) Ast = 1;
if (s[k].t2 == 's') varTestRek0(s[k].sr);
else if (worti == s[k].sr) Ast = 1; }
void Baum::structScan0(int k)
{ flag = 0; holz = s[k].sr;
if (s[k].t1 == 's')
{ k = s[k].sl;
if (s[k].v != '[')
{ err = k; cout << "structScan0: err"; return; }
if (s[k].t1 != 'w')
{ err = k; cout << "structScan0: err"; return; } }
worti = s[k].sl; getAst0();
if (! Ast)
{ err = k; cout << "structScan0: err"; return; }
worti = s[Ast].sl; getAst0();
compScan0(Ast);
if (! flag)
{ err = k; cout << "structScan0: err"; return; } }
//1 wird nicht weiter getestet
void Baum::compScan0(int k)
{ if (s[k].sl == holz) flag = 1;
else if (s[k].t1 == 's') compScan0(s[k].sl);
if (s[k].sr == holz) flag = 1;
else if (s[k].t2 == 's') compScan0(s[k].sr); }
void Baum::blankScan0(int k)
{ char t1, t2; int sl, sr;
t1 = s[k].t1; t2 = s[k].t2; sl = s[k].sl; sr = s[k].sr;
if (t1 == 's')
{ err = k; cout << "blankScan0: atom expected or v-err"; }
else if (sl == 176 || sl == '-' || sl == 191) //1
{ if (t2 == 'w') varScanR0(k);
else fooScan0(sr); }
else if (typScan0(sl))
{ if (t2 == 's') fooScan0(sr); }
else if (t2 == 's')
{ err = k; cout << "blankScan0: /-err"; } //2
else if (sl == '^') varScanR0(k); //3
else if (! punkt0(sl))
{ err = k; cout << "blankScan0: \\-err"; } }
//1 176: (dereferenzierung * p) a 191:
//2 stringkonstante
//3 reine adresse
void Baum::knotScan0(int k)
{ int k1;
if (s[k].t1 == 's')
{ k1 = k;
while(s[k1].t1 == 's')
{ k1 = s[k1].sl;
if (s[k1].v != '#')
{ err = k1; cout << "knotScan0: kein #"; return; } }
worti = s[k1].sl; }
else worti = s[k].sl;
getAst0();
if (Ast)
{ if (s[Ast].sl != knot_ && s[Ast].sl != atom_ && s[Ast].sl != back_)
{ err = k1; cout << "knotScan0: kein gltiges baumElement"; } } }
// die structKomponenten sind noch ungeprft
void Baum::castScan0(int k)
{ int k1;
k1 = s[k].sl;
if (s[k].t1 == 's') k1 = s[k1].sr;
if (typScan0(k1))
{ if (s[k].t2 == 's') fooScan0(s[k].sr);
else
{ worti = s[k].sr;
getAst0();
if (! Ast)
{ err = k; cout << "castScan0: err"; } } } }
/*
void Baum::castScan0(int k)
{ int k1;
k1 = s[k].sl;
if (s[k].t1 == 's') k1 = s[k1].sr;
if (typScan0(k1))
{ if (s[k].t2 == 's') fooScan0(s[k].sr);
else
{ worti = s[k].sr;
getAst0();
if (! Ast)
{ err = k; cout << "castScan0: err"; } } } }
*/
void Baum::varScanL0(int k)
{ char t;
worti = s[k].sl;
txt0 = w[worti].st;
t = isVal();
if (! t)
{ getAst0();
if (! Ast)
{ if (! noFct(worti))
{ if (*w[worti].st != ':')
// { if (s[k].v != '')
{ if (!(worti > cmdStart_ && worti < cmdEnd_))
{ err = k; cout << "varScanL0: \\"; } } } } } }
void Baum::varScanR0(int k)
{ char t;
worti = s[k].sr;
txt0 = w[worti].st;
t = isVal();
if (! t)
{ getAst0();
if (! Ast)
{ if (! noFct(worti))
{ if (*w[worti].st != ':')
// { if (s[k].v != '')
{ if (!(worti > cmdStart_ && worti < cmdEnd_))
{ err = k; cout << "varScanR0: /"; } } } } } }
back to
baumC