Assignment 3 solutions
Part of
the homework for 22C:50, Spring 2003
|
BOOLEAN compare( char * s, int i )
/* compare string with symbol in string pool
given s, pointer to first char of string
given i, index of first char of string in pool
returns true if the two strings are equal
*/
{
char ch;
for (;;) {
ch = *s;
if (ch != pool[i]) break;
if (ch == marker) return TRUE;
i++;
s++;
}
return FALSE;
}
int hash( char *s )
{
int j = 0;
char ch;
while ( (ch = *s++) != 0 ) {
j = ( 5*(j + ch) ) % (tablim + 1);
}
return j;
}
a) Assembled by hand or by machine gives this:
2 0000: 0002 |ROOT: W FATHER
3 0002: 0006 |FATHER: W SON1
4 0004: 000A | W SON2
5 0006: 0000 |SON1: W NIL
6 0008: 0000 | W NIL
7 |; ----------------------
8 000A: 000E |SON2: W GRANDSON
9 000C: 0000 | W NIL
10 000E: 0000 |GRANDSON:W NIL
11 0010: 0000 | W NIL
12 |NIL = 0
b) The symbol table at the line of dashes in each of 2 passes:
-- at line 7 during pass 1 (in order of occurance):
ROOT = #0000
FATHER = #0002
SON1 = #0006
SON2 = undefined
NIL = undefined
GRANDSON= not yet encountered, so not in the table
-- at line 7 during pass 2 (in order of occurance):
ROOT = #0000
FATHER = #0002
SON1 = #0006
SON2 = #000A
NIL = #0000
GRANDSON= #000E
c) The symbol table and memory using chaining:
-- at line 7 (in order of occurance):
ROOT = #0000, defined
FATHER = #0002, defined
SON1 = #0006, defined
SON2 = #0004, undefined (head of chain)
NIL = #0008, undefined (head of chain)
2 0000: 0002 |ROOT: W FATHER
3 0002: 0006 |FATHER: W SON1
4 0004: 0004 | W SON2 -- end of chain
5 0006: 0006 |SON1: W NIL -- end of chain
6 0008: 0006 | W NIL -- mid-chain
7 |; ----------------------
Here's what happens when EAL assembles example I, where there are plenty of forward references, but everything is defined by the start of pass 2:
1 |. = #200
2 0200: 0204 | W A
3 |C:
4 |. = A
5 0204: 0202 | W B
6 |. = C
7 0202: 0204 |B: W A
8 |A:
Here's what happens when EAL assembles example II, where there are plenty of forward references, but not everything is defined by the start of pass 2; comments elaborate on this:
1 |. = #200
2 0200: ???? | W B ; B was undefined during pass 2!
3 |C:
4 |. = A ; because on pass 1, A was undefined here
5 0204: 0204 |B: W B ; so on pass 1, B could not be defined here
6 |. = C
7 0202: 0204 | W A
8 |A: