home *** CD-ROM | disk | FTP | other *** search
- ;;;; This file contains an ATT language-understanding program.
-
- ;;; This section contains the procedures that set up the ATTs.
-
- (DEFMACRO RECORD X
- (LET* ((NAME (FIRST X)) (TREE (SECOND X))
- (VARIABLES (GET-SUBTREE-NAMES TREE)))
- `(DEFUN ,NAME (REMAINING-WORDS)
- ;(PROCLAIM '(SPECIAL ,@VARIABLES)) reinstate when lexical!!
- (LET ,(MAPCAR #'(LAMBDA (VARIABLE) (LIST VARIABLE NIL))
- VARIABLES)
- (INTERPRET-ATT REMAINING-WORDS ',TREE)))))
-
- (DEFUN GET-SUBTREE-NAMES (X)
- (REMOVE-DUPLICATES (GET-SUBTREE-NAMES1 X)))
-
- (DEFUN GET-SUBTREE-NAMES1 (X)
- (COND ((NULL X) NIL)
- ((ATOM X) NIL)
- ((AND (EQUAL (CAR X) 'PARSE) ;Detect PARSE expression.
- (CDR X)
- (NOT (CDDR X)))
- (LIST (CADR X)))
- (T (MAPCAN 'GET-SUBTREE-NAMES1 X))))
-
- ;;; This section contains the guts of the ATT interpreter.
-
- (DEFUN INTERPRET-ATT (REMAINING-WORDS TREE)
- (COND ((NULL TREE)
- (LIST T REMAINING-WORDS))
- ((ATOM (CAR TREE))
- (COND ((EQUAL (CAR REMAINING-WORDS) (CAR TREE))
- (INTERPRET-ATT (CDR REMAINING-WORDS) (CDR TREE)))
- (T NIL)))
- ((EQUAL (INSTRUCTION-NAME TREE) 'PARSE)
- (LET ((RESULT (FUNCALL (SUBTREE-NAME TREE) REMAINING-WORDS)))
- (COND (RESULT
- (SET (SUBTREE-NAME TREE) (CAR RESULT))
- (INTERPRET-ATT (CADR RESULT) (CDR TREE)))
- (T NIL))))
- ((EQUAL (INSTRUCTION-NAME TREE) 'BRANCH)
- (INTERPRET-BRANCHES REMAINING-WORDS (CDAR TREE)))
- ((EQUAL (INSTRUCTION-NAME TREE) 'PARSE-RESULT)
- (LIST (CAR (LAST (MAPCAR 'EVAL (CDAR TREE))))
- REMAINING-WORDS))
- ((EQUAL (INSTRUCTION-NAME TREE) 'PARSE-RESULT-IF-END)
- (COND ((NULL REMAINING-WORDS)
- (LIST (CAR (LAST (MAPCAR 'EVAL (CDAR TREE))))
- NIL))
- (T NIL)))))
-
- (DEFUN INTERPRET-BRANCHES (REMAINING-WORDS BRANCHES)
- (COND ((NULL BRANCHES) NIL)
- ((INTERPRET-ATT REMAINING-WORDS (CAR BRANCHES)))
- (T (INTERPRET-BRANCHES REMAINING-WORDS (CDR BRANCHES)))))
-
- ;;; This section contains selector procedures for getting at
- ;;; parts of the results returned by PARSE.
-
- (DEFUN INSTRUCTION-NAME (TREE) (CAAR TREE))
-
- (DEFUN SUBTREE-NAME (TREE) (CADAR TREE))
-
- ;;; This section contains a Common LISP primitive that is not yet
- ;;; in GC LISP.
-
- (DEFUN REMOVE-DUPLICATES (L)
- (IF (NULL L) NIL
- (IF (MEMBER (FIRST L) (REST L))
- (REMOVE-DUPLICATES (REST L))
- (CONS (FIRST L) (REMOVE-DUPLICATES (REST L))))))
-