;;;----- Licensing notice ---------------------------------------------------
;;;
-;;; This file is part of the Sensble Object Design, an object system for C.
+;;; This file is part of the Sensible Object Design, an object system for C.
;;;
;;; SOD is free software; you can redistribute it and/or modify
;;; it under the terms of the GNU General Public License as published by
(defun lexer-error (char-scanner expected consumedp)
"Signal a continuable lexical error."
(cerror* "Lexical error: ~
- expected ~{~#[<bug>~;~A~;~A or ~A~;:~A, ~]~} ~
+ expected ~{~#[<bug>~;~A~;~A or ~A~:;~A, ~]~} ~
but found ~/sod::show-char/~
~@[ at ~A~]"
(mapcar (lambda (exp)
(scanner-current-char char-scanner))
(and consumedp (file-location char-scanner))))
+(export 'skip-until)
(defparse skip-until (:context (context token-scanner-context)
(&key (keep-end nil keep-end-p))
&rest token-types)
:keep-end ,(if keep-end-p keep-end
(> (length token-types) 1))))
+(export 'error)
(defparse error (:context (context token-scanner-context)
- (&key) sub &optional (recover t))
+ (&key ignore-unconsumed)
+ sub &optional (recover t))
"Try to parse SUB; if it fails then report an error, and parse RECOVER.
This is the main way to recover from errors and continue parsing. Even
were never here. Otherwise, try to recover in a sensible way so we can
continue parsing. The details of this recovery are subject to change, but
the final action is generally to invoke the RECOVER parser and return its
- result."
+ result.
+
+ If IGNORE-UNCONSUMED evaluates non-nil, then just propagate a failure of
+ SUB if it didn't consume input. (This makes it suitable for use where the
+ parser containing `error' might be optional.)"
`(parse-error-recover ,(parser-scanner context)
(parser () ,sub)
- (parser () ,recover)))
+ (parser () ,recover)
+ :ignore-unconsumed ,ignore-unconsumed))
;;;--------------------------------------------------------------------------
;;; Lexical analysis utilities.
+(export 'scan-comment)
(defun scan-comment (char-scanner)
"Scan a comment (either `/* ... */' or `// ...') from CHAR-SCANNER.