Changeset trunk,26


Ignore:
Timestamp:
06/25/2007 07:37:42 PM (19 years ago)
Author:
dsowen
revision id:
svn-v3-trunk0:2948df59-2b31-0410-8e06-c40c0b09d5b6:trunk:28
Message:

Cleaning up CSV parser.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/csv.lisp

    r12 r26  
     1;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp -*-
     2
    13(require '#:dso-lex)
    2 (require '#:parse)
    3 (require '#:cl-ppcre)
    4 (require '#:local-time)
     4(require '#:dso-parse)
    55(use-package '#:dso-lex)
    6 (import 'parse::substring)
    7 (import 'parse::with-gensyms)
    8 (import 'cl-ppcre:scan)
    9 (load "lisp/parse/parse3")
     6(use-package '#:dso-parse)
     7(import 'dso-parse::substring)
    108
    119
     
    1917(deflexer lex-csv
    2018  ("," comma)
    21   ("\\n|\\r|\\r\\n" newline)
     19  ("\\r\\n?|\\n" newline)
    2220  ("'(?:[^']|'')*'" value un-squote)
    2321  ("\"(?:[^\"]|\"\")*\"" value un-dquote)
    24   ("[^,'\"\\n\\r]+" value))
     22  ("[^,'\"\\n\\r]+" value)
     23  ("." illegal))
    2524
    2625(defun lex-all-csv (input &optional tokens)
     26  (format t "~&Lexing '~A...'~%" (subseq input 0 40))
    2727  (multiple-value-bind (class image left) (lex-csv input)
    28     (if class
    29         (lex-all-csv left (cons (list class image) tokens))
    30         (nreverse tokens))))
     28    (cond
     29      ((and class (eq class 'illegal))
     30       (princ "oops")
     31       (error "Illegal input"))
     32      (class
     33       (lex-all-csv left (cons (list class image) tokens)))
     34      (t
     35       (nreverse tokens)))))
    3136
    3237(defmacro defmatcher (class)
     
    4247(defmatcher value)
    4348
    44 (defmacro defparser (name rule &optional filter)
    45   (with-gensyms (input next match)
    46     `(defun ,name (,input)
    47       (if-matches ,input ,rule (,next ,match)
    48         (values t ,next (cons ',name ,(if filter `(,filter ,match) match)))))))
    4949
    50 (defmacro defgrammar (&body definitions)
    51   (flet ((x (definition)
    52            (destructuring-bind (name rule &optional filter) definition
    53              `(defparser ,name ,rule ,filter))))
    54     `(progv () ,@(mapcar #'x definitions))))
    5550
    56 (defgrammar
    57     (file (+ row))
     51(defgrammar ()
     52  (file (+ row))
    5853  (row (t-value (* row-rest) (= t-newline))
    5954       (lambda (row)
    6055         (mapcar #'car (cons (first row) (mapcar #'second (second row))))))
    61   (row-rest ((= t-comma) t-value) cdr))
     56  (row-rest ((= t-comma) t-value) car))
    6257
    6358;;; (defparser test (* (#\a #\b))) doesn't grab the match.
Note: See TracChangeset for help on using the changeset viewer.