home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-09-27 | 2.5 KB | 80 lines | [TEXT/CCL2] |
- ;;; This contains parser error handlers. They, in turn, call the
- ;;; system error handlers.
-
- (define (lexer-error id . msgs)
- (parser-error/common id 'recoverable msgs '#t)
- `#\?)
-
- (define (parser-error id . msgs)
- (parser-error/common id 'phase msgs '#f)
- (if (null? *layout-stack*)
- (abort-compilation)
- (recover-to-next-decl *token-stream*)))
-
- (define (parser-error/recoverable id . args)
- (parser-error/common id 'recoverable args '#f))
-
- (define (parser-error/common id type msgs in-lexer?)
- (let ((place
- (if in-lexer?
- (if (< *current-line* 0)
- (list "Parse error in `~A'" *current-file*)
- (list "Parse error at in file ~A at line ~A, column ~A."
- *current-file* *current-line* *current-col*))
- (let ((tok (cond ((null? *token-args*)
- *token*)
- ((null? (cdr *token-args*))
- (car *token-args*))
- (else *token-args*)))) ; could be better
- (if (< *current-line* 0)
- (list "Parse error at token ~A in `~A'"
- tok *current-file*)
- (list "Parse error at in file ~A at line ~A, token ~A."
- *current-file* *current-line* tok))))))
- (haskell-error id type (list place msgs))))
-
- (define (recover-to-next-decl tokens)
- (cond ((null? tokens)
- (abort-compilation))
- ((eq? (car (car tokens)) 'line)
- (search-layout-stack *layout-stack* tokens (caddr (car tokens))))
- (else (recover-to-next-decl (cdr tokens)))))
-
- (define (search-layout-stack layouts tokens column)
- (cond ((null? layouts)
- (abort-compilation))
- ((> column (layout-col (car layouts)))
- (recover-to-next-decl (cdr tokens)))
- ((= column (layout-col (car layouts)))
- (setf *current-col* column)
- (setf *current-line* (cadr (car tokens)))
- (setf *token-stream* (cdr tokens))
- (advance-token) ; loads up *token*
- ;; *** layout-recovery-fn is not defined anywhere!
- (funcall (layout-recovery-fn (car layouts))))
- (else
- (setf *layout-stack* (cdr *layout-stack*))
- (search-layout-stack (cdr layouts) tokens column))))
-
-
- ;;; Here are some very commonly used signalling functions.
- ;;; Other (more specific) signalling functions are defined near
- ;;; the places where they are called.
-
-
- ;;; This is used when a particular token isn't found.
-
- (define (signal-missing-token what where)
- (parser-error 'missing-token
- "Missing ~a in ~a." what where))
-
-
- ;;; This is used to signal more complicated parse failures involving
- ;;; failure to match a nonterminal.
-
- (define (signal-invalid-syntax where)
- (parser-error 'invalid-syntax
- "Invalid syntax appears where ~a is expected." where))
-
-
-