An actual running implementation, which makes code that compiles.
[sod] / src / pset-parse.lisp
index 0bc4680..f81ce92 100644 (file)
@@ -98,8 +98,9 @@
                            (let* ((stream (make-scanner-stream scanner))
                                   (sexp (read stream t)))
                              (scanner-step scanner)
-                             (values (cons (property-type sexp) sexp)
-                                     t t)))
+                             (multiple-value-bind (type value)
+                                 (decode-property sexp)
+                               (values (cons type value) t t))))
                           (t
                            (values (list :int :id :char :string #\?)
                                    nil nil)))))
 (export 'parse-property-set)
 (defun parse-property-set (scanner)
   "Parse an optional property set from the SCANNER and return it."
-  ;; property-set ::= `[' property-list `]'
+  ;; property-set ::= [`[' property-list `]']
   (with-parser-context (token-scanner-context :scanner scanner)
-    (parse (seq (#\[
-                (pset (many (pset (make-property-set) pset)
-                        (parse-property scanner pset)
-                        #\,))
-                #\])
-            pset))))
+    (parse (? (seq (#\[
+                   (pset (many (pset (make-property-set) pset)
+                           (error ()
+                             (parse-property scanner pset)
+                             (skip-until () #\, #\]))
+                           #\,))
+                   #\])
+               pset)))))
 
 ;;;----- That's all, folks --------------------------------------------------