;------------------------------------------------------------ ; File: clay.l of clay of clos of lisp of ai ;------------------------------------------------------------ ; Enter clos ; ( in-package "pcl" ) ;------------------------------------------------------------ ; Classes ( defclass scanner () ( ( token-line :accessor scanner-token-line :initarg :token-line ) ( token :accessor scanner-token :initarg :token ) ( index :accessor scanner-index :initarg :index :initform 0 ) ) ) ( defclass parser () ( ( scanner :accessor parser-scanner :initarg :scanner :initform ( make-instance 'scanner ) ) ( parse-tree :accessor parser-parse-tree :initarg :parse-tree :initform '() ) ) ) ( defclass processor () ( ( parser :accessor processor-parser :initarg :parser :initform NIL ) ( result :accessor processor-result :initarg :result :initform NIL ) ) ) ( defclass token () ( ( name :accessor token-name :initarg :name ) ( type :accessor token-type :initarg :type ) ) ) ;------------------------------------------------------------ ; The Token ( defmethod display-token ( (os t ) ( x token ) ) ( princ "TOKEN... " os ) ( princ "name = " os ) ( prin1 ( token-name x ) os ) ( princ "; " os ) ( princ "type = " os ) ( prin1 ( token-type x ) os ) ( terpri os ) ) ;------------------------------------------------------------ ; The Scanner ( defmethod display-scanner ( (os t )( s scanner ) ) ( write-string ">>>scanner ... " os ) ( terpri os ) ( format t "token-line = ~A" ( scanner-token-line s ) os ) ( terpri os ) ( display-scanner ( scanner-token s ) os ) ( format t "index = ~A" ( scanner-index s ) ) ( terpri os ) ( write-string "<<= ( scanner-index s ) ( length ( scanner-token-line s ) ) ) ( setf token ( make-instance 'token :type 'end-of-stream ) ) ) ( t ( setf token ( elt ( scanner-token-line s ) ( scanner-index s ) ) ) ( setf ( scanner-index s ) ( + ( scanner-index s ) 1 ) ) ) ) ( setf ( scanner-token s ) token ) ( if parser-monitor-flag ( display-token os ( current-token s ) ) ) ) ( defmethod current-token-type ( (s scanner) ) ( token-type ( scanner-token s ) ) ) ( defmethod current-token-name ( (s scanner)) ( token-name ( scanner-token s ) ) ) ( defmethod current-token ( (s scanner)) ( scanner-token s ) ) ( defmethod reset-scanner (&aux s) ( setf s ( clay-scanner *clay* ) ) ( setf ( scanner-index s ) 0 ) ) ;------------------------------------------------------------ ; The Parser ( defmethod display-parser ( (os t) ( p parser ) ) ( write-string ">>>parser ... " os ) ( terpri os ) ( display-scanner os ( parser-scanner p ) ) ( display-parse-tree os p ) ( princ "<<>>processor ... " os ) ( terpri os ) ( display-parser os ( processor-parser p ) ) ( format t "result = ~A" ( processor-result p ) os ) ( terpri os ) ( princ "<< n 0 ) ( let () ( princ "| " os ) ( print-prefix os ( - n 1 ) ) ) ) )