chiark / gitweb /
doc/syntax.tex: Delete (wrong) duplicate rule for <argument-declarator>.
[sod] / src / lexer-proto.lisp
index d2181e10eda5774f5b03bdbf7f42f5a02c03c3c4..1850326747a8982cdf7981f2330f9c1d26467117 100644 (file)
@@ -7,7 +7,7 @@
 
 ;;;----- Licensing notice ---------------------------------------------------
 ;;;
 
 ;;;----- 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
 ;;;
 ;;; 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 @@ (export 'lexer-error)
 (defun lexer-error (char-scanner expected consumedp)
   "Signal a continuable lexical error."
   (cerror* "Lexical error: ~
 (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)
            but found ~/sod::show-char/~
            ~@[ at ~A~]"
           (mapcar (lambda (exp)
@@ -99,6 +99,7 @@ (defun lexer-error (char-scanner expected consumedp)
                (scanner-current-char char-scanner))
           (and consumedp (file-location char-scanner))))
 
                (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)
 (defparse skip-until (:context (context token-scanner-context)
                      (&key (keep-end nil keep-end-p))
                      &rest token-types)
@@ -113,8 +114,10 @@ (defparse skip-until (:context (context token-scanner-context)
               :keep-end ,(if keep-end-p keep-end
                              (> (length token-types) 1))))
 
               :keep-end ,(if keep-end-p keep-end
                              (> (length token-types) 1))))
 
+(export 'error)
 (defparse error (:context (context token-scanner-context)
 (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
   "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 @@ (defparse error (:context (context token-scanner-context)
    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
    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)
   `(parse-error-recover ,(parser-scanner context)
                        (parser () ,sub)
-                       (parser () ,recover)))
+                       (parser () ,recover)
+                       :ignore-unconsumed ,ignore-unconsumed))
 
 ;;;--------------------------------------------------------------------------
 ;;; Lexical analysis utilities.
 
 
 ;;;--------------------------------------------------------------------------
 ;;; Lexical analysis utilities.
 
+(export 'scan-comment)
 (defun scan-comment (char-scanner)
   "Scan a comment (either `/* ... */' or `// ...') from CHAR-SCANNER.
 
 (defun scan-comment (char-scanner)
   "Scan a comment (either `/* ... */' or `// ...') from CHAR-SCANNER.