The functions now provide a `:location' keyword argument, and use their
scanner argument as a default location if the keyword is omitted.
Nothing is currently using the optional arguments, but it might happen
later.
\begin{describe}{fun}{define-indicator @<indicator> @<description>}
\end{describe}
\begin{describe}{fun}{define-indicator @<indicator> @<description>}
\end{describe}
-\begin{describe}{fun}{syntax-error @<scanner> @<expected> \&key :continuep}
+\begin{describe}{fun}
+ {syntax-error @<scanner> @<expected> \&key :continuep :location}
\end{describe}
\begin{describe}{fun}
\end{describe}
\begin{describe}{fun}
- {lexer-error @<char-scanner> @<expected>}
+ {lexer-error @<char-scanner> @<expected> \&key :location}
\end{describe}
\begin{describe}{parseform}
\end{describe}
\begin{describe}{parseform}
indicator)
(export 'syntax-error)
indicator)
(export 'syntax-error)
-(defun syntax-error (scanner expected &key (continuep t))
+(defun syntax-error (scanner expected &key (continuep t) location)
"Signal a (maybe) continuable syntax error."
(labels ((show-token (type value)
(if (characterp type)
"Signal a (maybe) continuable syntax error."
(labels ((show-token (type value)
(if (characterp type)
((eq (car thing) :id)
(format nil "`~A'" (cadr thing)))
(t (format nil "<? ~S>" thing)))))
((eq (car thing) :id)
(format nil "`~A'" (cadr thing)))
(t (format nil "<? ~S>" thing)))))
- (funcall (if continuep #'cerror* #'error)
+ (funcall (if continuep #'cerror*-with-location #'error-with-location)
+ (or location scanner)
"Syntax error: ~
expected ~{~#[<bug>~;~A~;~A or ~A~:;~A, ~]~} ~
but found ~A"
"Syntax error: ~
expected ~{~#[<bug>~;~A~;~A or ~A~:;~A, ~]~} ~
but found ~A"
(show-token (token-type scanner) (token-value scanner)))))
(export 'lexer-error)
(show-token (token-type scanner) (token-value scanner)))))
(export 'lexer-error)
-(defun lexer-error (char-scanner expected)
+(defun lexer-error (char-scanner expected &key location)
"Signal a continuable lexical error."
"Signal a continuable lexical error."
- (cerror* "Lexical error: ~
- expected ~{~#[<bug>~;~A~;~A or ~A~:;~A, ~]~} ~
- but found ~/sod::show-char/"
+ (cerror*-with-location (or location char-scanner)
+ "Lexical error: ~
+ expected ~{~#[<bug>~;~A~;~A or ~A~:;~A, ~]~} ~
+ but found ~/sod::show-char/"
(mapcar (lambda (exp)
(typecase exp
(character (format nil "~/sod::show-char/" exp))
(mapcar (lambda (exp)
(typecase exp
(character (format nil "~/sod::show-char/" exp))