Input: A sentence Q and a grammar G.
Assume:
rdParser(in S: sentence; G: grammar; L: lexicon;
out P: set of parse trees)
{ var T: partially complete tree;
T = a tree with one node marked "S";
P = null set;
rdParser1(S,G,L,T,P)
}
rdParser1(in S: sentence; G: grammar; L: lexicon, T: partial parse tree;
out P: set of parse trees)
{ /* Base cases of the recursion */
if (every leaf of T is connected to a word in S)
/* Note: If it reaches here, then every word in S is connected to T */
then { add copy(T) to P;
return;
}
if (every leaf of T is connected to a word of S, but there are words in
S not connected to T)
then return;
if (there are more leaves in T than words in S) then return;
/* Recursive case */
N = the leftmost leaf of T not connected to a word in S;
if (N is a part of speech (terminal symbol))
then { W = the leftmost unattached word in S;
if (L marks N as a possible p.o.s for W)
then { attach W to N in T);
rdParser1(S,G,L,T,P);
}
else return;
}
else /* N is a non-terminal */
for each rule N -> S1 ... Sk in G
{ make S1 ... Sk the children of N in T
rdParser1(S,G,L,T,P)
}
}
Grammar:
S -> NP VP
NP -> Name
NP -> Noun
VP -> VG
VP -> VG NP
VG -> Verb
VG -> Modal Verb
Lexicon:
ate -- Verb
can -- Modal, Verb, Noun
fish -- Noun, Verb
John -- Name.
Sentence: John ate fish.