Compare commits

...

3 Commits

Author SHA1 Message Date
Oliver Payne 789e726ea9 Testing: modify parse to just take a verb phrase
This was done to test the alternative parse-verb-phrase.
2024-01-04 22:59:53 +00:00
Oliver Payne ab12eb11cc Add more logging 2024-01-04 22:59:53 +00:00
Oliver Payne 9350a46f0c Add lots of logging to understand how the interpreter works 2024-01-04 22:59:53 +00:00
1 changed files with 64 additions and 44 deletions

View File

@ -1,75 +1,95 @@
(define nouns '(noun student professor cat class))
(define verbs '(verb studies lectures eats sleeps))
(define articles '(article the a))
(define prepositions '(prep for to in by with))
;; output of parse
'(sentence (noun-phrase (article the) (noun cat))
(verb eats))
(define (log message level)
(define (output message level)
(if (= level 0) message
(cons '_ (output message (- level 1)))))
(display (output message level))
(newline))
(define (parse-sentence)
(list 'sentence
(parse-noun-phrase)
(parse-word verbs)))
(define (parse-noun-phrase)
(list 'noun-phrase
(parse-word articles)
(parse-word nouns)))
(define (parse-word word-list)
(define (parse-word word-list level)
(log (list 'word-list word-list '*unparsed* *unparsed*) level)
(require (not (null? *unparsed*)))
(require (memq (car *unparsed*) (cdr word-list)))
(let ((found-word (car *unparsed*)))
(set! *unparsed* (cdr *unparsed*))
(log (list (car word-list) found-word) level)
(list (car word-list) found-word)))
(define *unparsed* '())
(define (parse input)
(set! *unparsed* input)
(let ((sent (parse-sentence)))
(let ((sent (parse-verb-phrase 0)))
(require (null? *unparsed*))
sent))
;: (parse '(the cat eats))
;; output of parse
'(sentence (noun-phrase (article the) (noun cat)) (verb eats))
(define prepositions '(prep for to in by with))
(define (parse-prepositional-phrase)
(list 'prep-phrase
(parse-word prepositions)
(parse-noun-phrase)))
(define (parse-sentence)
(list 'sentence
(parse-noun-phrase)
(parse-verb-phrase)))
;;(parse-noun-phrase)
(parse-verb-phrase 0)))
(define (parse-verb-phrase)
(define (parse-noun-phrase level)
(define (maybe-extend noun-phrase)
(log '(maybe-extend-noun) level)
(amb (begin
(log '(amb-noun-phrase) level)
noun-phrase)
(begin
(log '(amb-maybe-extend-noun) level)
(maybe-extend (list 'noun-phrase
noun-phrase
(parse-prepositional-phrase level))))))
(log '(parse-noun-phrase) level)
(maybe-extend (parse-simple-noun-phrase (+ level 1))))
;; Note maybe-extend is tail recursive
(define (parse-verb-phrase level)
(define (maybe-extend verb-phrase)
(log '(maybe-extend-verb-phrase) level)
(amb verb-phrase
(maybe-extend (list 'verb-phrase
verb-phrase
(parse-prepositional-phrase)))))
(maybe-extend (parse-word verbs)))
(parse-prepositional-phrase level)))))
(log '(parse-verb-phrase) level)
(maybe-extend (parse-word verbs level)))
(define (parse-simple-noun-phrase)
(define (parse-simple-noun-phrase level)
(log '(parse-simple-noun) level)
(list 'simple-noun-phrase
(parse-word articles)
(parse-word nouns)))
(parse-word articles level)
(parse-word nouns level)))
(define (parse-prepositional-phrase level)
(log '(parse-prep) level)
(list 'prep-phrase
(parse-word prepositions level)
(parse-noun-phrase level)))
;; Note: not tail recursive
(define (parse-verb-phrase level)
(log '(parse-verb-phrase) level)
(amb (begin
(log '(amb-parse-verbs) level)
(parse-word verbs level))
(begin
(log '(amb-verb-prep) level)
(list 'verb-phrase
(parse-verb-phrase (+ level 1))
(parse-prepositional-phrase level)))))
(define (parse-noun-phrase)
(define (maybe-extend noun-phrase)
(amb noun-phrase
(maybe-extend (list 'noun-phrase
noun-phrase
(parse-prepositional-phrase)))))
(maybe-extend (parse-simple-noun-phrase)))
;; Exercise 4.45: Output of (parse '(the professor lectures to the student in the class with the cat))