Changeset trunk,26
- Timestamp:
- 06/25/2007 07:37:42 PM (19 years ago)
- revision id:
- svn-v3-trunk0:2948df59-2b31-0410-8e06-c40c0b09d5b6:trunk:28
- File:
-
- 1 edited
-
trunk/csv.lisp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/csv.lisp
r12 r26 1 ;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp -*- 2 1 3 (require '#:dso-lex) 2 (require '#:parse) 3 (require '#:cl-ppcre) 4 (require '#:local-time) 4 (require '#:dso-parse) 5 5 (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) 10 8 11 9 … … 19 17 (deflexer lex-csv 20 18 ("," comma) 21 ("\\ n|\\r|\\r\\n" newline)19 ("\\r\\n?|\\n" newline) 22 20 ("'(?:[^']|'')*'" value un-squote) 23 21 ("\"(?:[^\"]|\"\")*\"" value un-dquote) 24 ("[^,'\"\\n\\r]+" value)) 22 ("[^,'\"\\n\\r]+" value) 23 ("." illegal)) 25 24 26 25 (defun lex-all-csv (input &optional tokens) 26 (format t "~&Lexing '~A...'~%" (subseq input 0 40)) 27 27 (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))))) 31 36 32 37 (defmacro defmatcher (class) … … 42 47 (defmatcher value) 43 48 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)))))))49 49 50 (defmacro defgrammar (&body definitions)51 (flet ((x (definition)52 (destructuring-bind (name rule &optional filter) definition53 `(defparser ,name ,rule ,filter))))54 `(progv () ,@(mapcar #'x definitions))))55 50 56 (defgrammar 57 (file (+ row))51 (defgrammar () 52 (file (+ row)) 58 53 (row (t-value (* row-rest) (= t-newline)) 59 54 (lambda (row) 60 55 (mapcar #'car (cons (first row) (mapcar #'second (second row)))))) 61 (row-rest ((= t-comma) t-value) c dr))56 (row-rest ((= t-comma) t-value) car)) 62 57 63 58 ;;; (defparser test (* (#\a #\b))) doesn't grab the match.
Note: See TracChangeset
for help on using the changeset viewer.
