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.