X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/1d8cc67a3f4ded443f5efc673a616883cbae9c50..caa6f4b99a79f95d15a6cc1e5b8dd27ea48b4d03:/src/lexer-proto.lisp diff --git a/src/lexer-proto.lisp b/src/lexer-proto.lisp index d2181e1..1850326 100644 --- a/src/lexer-proto.lisp +++ b/src/lexer-proto.lisp @@ -7,7 +7,7 @@ ;;;----- 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 @@ -82,7 +82,7 @@ (defun lexer-error (char-scanner expected consumedp) "Signal a continuable lexical error." (cerror* "Lexical error: ~ - expected ~{~#[~;~A~;~A or ~A~;:~A, ~]~} ~ + expected ~{~#[~;~A~;~A or ~A~:;~A, ~]~} ~ but found ~/sod::show-char/~ ~@[ at ~A~]" (mapcar (lambda (exp) @@ -99,6 +99,7 @@ (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) @@ -113,8 +114,10 @@ :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 @@ -124,14 +127,20 @@ 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.