Programmieraufgabenn
Id: gcc.tex,v 1.2 2004/01/14 10:48:34 joe Exp
Hashing in gcc: http://www.imn.htwk-leipzig.de/~waldmann/ws03/compilerbau/programme/gcc-3.3.2/gcc/
Ein Scanner soll alle Bezeichner
(der Form Buchstabe (Buchstabe + Ziffer)^*
)
des Eingabestroms in die Symboltabelle eintragen
(und alle anderen Zeichen ignorieren),
und schließlich alle Bezeichner ausgeben, die öfter als 5 mal vorkamen.
(Die genaue Anzahl ist mit auszugeben.)
gmake
), ausprobieren (cat README
./scanner)
$ gdb scanner (gdb) break ht_lookup (gdb) run < READMEweitere gdb-Kommandos:
print hash2
,
in Ausdrücken sind auch Funktionsaufrufe möglich)
$ export PATH=/home/waldmann/built/bin:$PATH $ export LD_LIBRARY_PATH=/home/waldmann/built/lib:$LD_LIBRARY_PATH $ export MANPATH=/home/waldmann/built/man:$MANPATH(das ist bash-Syntax. für (t)csh
setenv
benutzen)
$ gdb scanner (gdb) break main (gdb) run (gdb) p calc_hash ("AB", 2)
ht_identifier
auch der Hash-Wert gespeichert?
(Wann wird dieser Wert gelesen?)
hashtable.[ch]
enthalten die hashnode
s
(im wesentlichen) nur einen String.
Wo stehen die Zusatzinformationen (gcc: Knoten des Syntaxbaums, unser Scanner: Anzahl der Vorkommen)?
Warum muß man in C so programmieren (welches Ausdrucksmittel fehlt)?
hash2
in hashtable.c
,
Vorsicht, kommt mehrfach vor) zu hash2 = 1;
,
vergleichen Sie die Resultate, erklären Sie.
hash2
aus hash
berechnet wird?
Schlagen Sie eine bessere Variante vor und testen Sie diese.