;;; Code stored as: {turing}<3-lisp.problem-sets>general-parser.3-lisp
;;; {phylum}<3-lisp>course>problem-sets>general-parser.3-lisp
;;; =======================================================================
;;;
;;; RECURSIVE DESCENT PARSER
;;;
;;; =======================================================================
;;; Similar to Recognizer, but returns the parse:
;;;
;;; Basic idea is to have all the parsing routines return a sequence of
;;; parse/word-sequence pairs, where the parse is the parse so far and
;;; the word-sequence is the postfix of the input sequence after the part
;;; that has been parsed so far.
(define PARSE
(lambda [expression start-symbol grammar]
(let [[good-parses
(filtered-map first
(compose null second)
(parse-symbol (lexical-analysis expression)
start-symbol
grammar))]]
(if (null good-parses)
"rejected"
good-parses))))
(define PARSE-SYMBOL
(lambda [expression symbol grammar]
(if (match symbol (first expression))
(singleton [[symbol (first expression)] (rest expression)])
(collect (lambda [rhs]
(parse-frontier symbol expression rhs grammar))
(rhsides symbol grammar)))))
;;; Other routines are as in GENERAL-RECOGNIZER.