chiark / gitweb /
src/method-proto.lisp: Use new `definst' private-slot-name feature.
[sod] / src / pset-parse.lisp
index 6619e1bfef599b8979044ef2f6eb170795a52a31..a2199b69e50513562e46b199fa9f84b3f0344703 100644 (file)
@@ -73,7 +73,7 @@     (defun parse-expression (scanner)
       "Parse and evaluate a simple expression.
 
    The result is a pair (TYPE . VALUE).  Currently, type types are `:id',
       "Parse and evaluate a simple expression.
 
    The result is a pair (TYPE . VALUE).  Currently, type types are `:id',
-   `:int', `:string', and `:char'.  If an error prevented a sane value from
+   `:int', `:string', `:char', `:fragment', `:type'.  If an error prevented a sane value from
    being produced, the type `:invalid' is returned.
 
    The syntax of expressions is rather limited at the moment, but more may be
    being produced, the type `:invalid' is returned.
 
    The syntax of expressions is rather limited at the moment, but more may be
@@ -100,7 +100,8 @@     (defun parse-expression (scanner)
                                   (sexp (read stream t)))
                              (scanner-step scanner)
                              (multiple-value-bind (type value)
                                   (sexp (read stream t)))
                              (scanner-step scanner)
                              (multiple-value-bind (type value)
-                                 (decode-property sexp)
+                                 (restart-case (decode-property (eval sexp))
+                                   (continue () (values :invalid nil)))
                                (values (cons type value) t t))))
                           (#\{
                            (values (cons :fragment
                                (values (cons type value) t t))))
                           (#\{
                            (values (cons :fragment
@@ -119,7 +120,7 @@     (defun parse-expression (scanner)
                                     (values (cons :type (car dc))
                                             t t))))
                           (t
                                     (values (cons :type (car dc))
                                             t t))))
                           (t
-                           (values (list :int :id :char :string #\?)
+                           (values (list :int :id :char :string #\? #\{ #\<)
                                    nil nil)))))
                 (or (seq (#\+) add)
                     (seq (#\-) sub)
                                    nil nil)))))
                 (or (seq (#\+) add)
                     (seq (#\-) sub)