Index: trunk/csv.lisp
===================================================================
--- trunk/csv.lisp	(revision trunk,12)
+++ trunk/csv.lisp	(revision trunk,26)
@@ -1,11 +1,9 @@
+;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp -*-
+
 (require '#:dso-lex)
-(require '#:parse)
-(require '#:cl-ppcre)
-(require '#:local-time)
+(require '#:dso-parse)
 (use-package '#:dso-lex)
-(import 'parse::substring)
-(import 'parse::with-gensyms)
-(import 'cl-ppcre:scan)
-(load "lisp/parse/parse3")
+(use-package '#:dso-parse)
+(import 'dso-parse::substring)
 
 
@@ -19,14 +17,21 @@
 (deflexer lex-csv
   ("," comma)
-  ("\\n|\\r|\\r\\n" newline)
+  ("\\r\\n?|\\n" newline)
   ("'(?:[^']|'')*'" value un-squote)
   ("\"(?:[^\"]|\"\")*\"" value un-dquote)
-  ("[^,'\"\\n\\r]+" value))
+  ("[^,'\"\\n\\r]+" value)
+  ("." illegal))
 
 (defun lex-all-csv (input &optional tokens)
+  (format t "~&Lexing '~A...'~%" (subseq input 0 40))
   (multiple-value-bind (class image left) (lex-csv input)
-    (if class
-	(lex-all-csv left (cons (list class image) tokens))
-	(nreverse tokens))))
+    (cond
+      ((and class (eq class 'illegal))
+       (princ "oops")
+       (error "Illegal input"))
+      (class
+       (lex-all-csv left (cons (list class image) tokens)))
+      (t
+       (nreverse tokens)))))
 
 (defmacro defmatcher (class)
@@ -42,22 +47,12 @@
 (defmatcher value)
 
-(defmacro defparser (name rule &optional filter)
-  (with-gensyms (input next match)
-    `(defun ,name (,input)
-      (if-matches ,input ,rule (,next ,match)
-	(values t ,next (cons ',name ,(if filter `(,filter ,match) match)))))))
 
-(defmacro defgrammar (&body definitions)
-  (flet ((x (definition)
-	   (destructuring-bind (name rule &optional filter) definition
-	     `(defparser ,name ,rule ,filter))))
-    `(progv () ,@(mapcar #'x definitions))))
 
-(defgrammar
-    (file (+ row))
+(defgrammar ()
+  (file (+ row))
   (row (t-value (* row-rest) (= t-newline))
        (lambda (row)
 	 (mapcar #'car (cons (first row) (mapcar #'second (second row))))))
-  (row-rest ((= t-comma) t-value) cdr))
+  (row-rest ((= t-comma) t-value) car))
 
 ;;; (defparser test (* (#\a #\b))) doesn't grab the match.
