;;; Code stored as: {turing}<3-lisp.problem-sets>general-transducer.3-lisp
;;; {phylum}<3-lisp>course>problem-sets>general-transducer.3-lisp
;;; =======================================================================
;;;
;;; RECURSIVE DESCENT TRANSDUCER with AUGMENTS
;;;
;;; =======================================================================
;;; Modified version takes functional augments and applies them to constituents
;;; as they are found.
;;; An analysis is a rail of the form: [transduction tail]
;;; A transduction is a function to be applied to the transductions
;;; of the remaining constituents to be found, or (in the base case)
;;; any 3-LISP entity. The transductions are obtained from the grammar.
;;; The grammar format is a rail of rules, each rule of the form:
;;;
;;; [lhs transduction rhs]
(define TRANS
(lambda [string start-symbol grammar]
(let [[good-transductions
(filtered-map first
(compose null second)
(trans-symbol id
(lexical-analysis string)
start-symbol
grammar))]]
(if (null good-transductions)
"rejected"
good-transductions))))
(define TRANS-SYMBOL
(lambda [transer tail symbol grammar]
(if (match symbol (first tail)) ; If direct match, single
(singleton [(transer (first tail)) (rest tail)]) ; good transduction
(map (lambda [analysis]
[(transer (first analysis))
(second analysis)])
(collect (lambda [rhs] ; otherwise trans analyses
(trans-frontier (first rhs) ; obtainable by the recursive
tail ; parsing calls
(rest rhs)
grammar))
(rhsides symbol grammar))))))
(define TRANS-FRONTIER
(lambda [transer tail frontier grammar]
(cond [(null frontier) (singleton [transer tail])]
[(null tail) (nothing)]
[$true (collect (lambda [analysis]
(trans-frontier (first analysis)
(second analysis)
(rest frontier)
grammar))
(trans-symbol transer tail (first frontier) grammar))])))