mirror of
https://github.com/dimitri/pgloader.git
synced 2026-05-05 02:46:10 +02:00
Move sexp parsing into its own file.
After all, it's shared between the CSV command parsing and the Cast Rules parsing. src/parsers/command-csv.lisp still contains lots of facilities shared between the file based sources, will need another series of splits.
This commit is contained in:
parent
f1df6ee89a
commit
7b9b8a32e7
@ -98,6 +98,7 @@
|
||||
(:file "command-source")
|
||||
(:file "command-options")
|
||||
(:file "command-sql-block")
|
||||
(:file "command-sexp")
|
||||
(:file "command-csv")
|
||||
(:file "command-ixf")
|
||||
(:file "command-fixed")
|
||||
|
||||
@ -253,48 +253,6 @@
|
||||
(defrule column-name csv-field-name) ; same rules here
|
||||
(defrule column-type csv-field-name) ; again, same rules, names only
|
||||
|
||||
(defun not-doublequote (char)
|
||||
(not (eql #\" char)))
|
||||
|
||||
(defun symbol-character-p (character)
|
||||
(not (member character '(#\Space #\( #\)))))
|
||||
|
||||
(defun symbol-first-character-p (character)
|
||||
(and (symbol-character-p character)
|
||||
(not (member character '(#\+ #\-)))))
|
||||
|
||||
(defrule sexp-symbol (and (symbol-first-character-p character)
|
||||
(* (symbol-character-p character)))
|
||||
(:lambda (schars)
|
||||
(pgloader.transforms:intern-symbol
|
||||
(text schars)
|
||||
'(("nil" . cl:nil)
|
||||
("precision" . pgloader.transforms::precision)
|
||||
("scale" . pgloader.transforms::scale)))))
|
||||
|
||||
(defrule sexp-string-char (or (not-doublequote character) (and #\\ #\")))
|
||||
|
||||
(defrule sexp-string (and #\" (* sexp-string-char) #\")
|
||||
(:destructure (q1 string q2)
|
||||
(declare (ignore q1 q2))
|
||||
(text string)))
|
||||
|
||||
(defrule sexp-integer (+ (or "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"))
|
||||
(:lambda (list)
|
||||
(parse-integer (text list) :radix 10)))
|
||||
|
||||
(defrule sexp-list (and open-paren sexp (* sexp) close-paren)
|
||||
(:destructure (open car cdr close)
|
||||
(declare (ignore open close))
|
||||
(cons car cdr)))
|
||||
|
||||
(defrule sexp-atom (and ignore-whitespace
|
||||
(or sexp-string sexp-integer sexp-symbol))
|
||||
(:lambda (atom)
|
||||
(bind (((_ a) atom)) a)))
|
||||
|
||||
(defrule sexp (or sexp-atom sexp-list))
|
||||
|
||||
(defrule column-expression (and kw-using sexp)
|
||||
(:lambda (expr)
|
||||
(bind (((_ sexp) expr)) sexp)))
|
||||
|
||||
48
src/parsers/command-sexp.lisp
Normal file
48
src/parsers/command-sexp.lisp
Normal file
@ -0,0 +1,48 @@
|
||||
;;;
|
||||
;;; Parse user given s-expressions in commands
|
||||
;;;
|
||||
|
||||
(in-package #:pgloader.parser)
|
||||
|
||||
(defun not-doublequote (char)
|
||||
(not (eql #\" char)))
|
||||
|
||||
(defun symbol-character-p (character)
|
||||
(not (member character '(#\Space #\( #\)))))
|
||||
|
||||
(defun symbol-first-character-p (character)
|
||||
(and (symbol-character-p character)
|
||||
(not (member character '(#\+ #\-)))))
|
||||
|
||||
(defrule sexp-symbol (and (symbol-first-character-p character)
|
||||
(* (symbol-character-p character)))
|
||||
(:lambda (schars)
|
||||
(pgloader.transforms:intern-symbol
|
||||
(text schars)
|
||||
'(("nil" . cl:nil)
|
||||
("precision" . pgloader.transforms::precision)
|
||||
("scale" . pgloader.transforms::scale)))))
|
||||
|
||||
(defrule sexp-string-char (or (not-doublequote character) (and #\\ #\")))
|
||||
|
||||
(defrule sexp-string (and #\" (* sexp-string-char) #\")
|
||||
(:destructure (q1 string q2)
|
||||
(declare (ignore q1 q2))
|
||||
(text string)))
|
||||
|
||||
(defrule sexp-integer (+ (or "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"))
|
||||
(:lambda (list)
|
||||
(parse-integer (text list) :radix 10)))
|
||||
|
||||
(defrule sexp-list (and open-paren sexp (* sexp) close-paren)
|
||||
(:destructure (open car cdr close)
|
||||
(declare (ignore open close))
|
||||
(cons car cdr)))
|
||||
|
||||
(defrule sexp-atom (and ignore-whitespace
|
||||
(or sexp-string sexp-integer sexp-symbol))
|
||||
(:lambda (atom)
|
||||
(bind (((_ a) atom)) a)))
|
||||
|
||||
(defrule sexp (or sexp-atom sexp-list))
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user