Work on pass3+ infrastructure.

This commit is contained in:
Dominik Pantůček 2023-03-25 18:40:13 +01:00
parent fb7f6bf67e
commit a6043c0fc2

View file

@ -40,10 +40,19 @@
testing
dictionary)
;; TODO: move to separate schema module
;; Pass 2: known keys and multikeys
(define member-schema-known-keys '(nick mail phone name born joined destroyed))
(define member-schema-known-multikeys '(card desfire credit studentstart studentstop suspendstart suspendstop))
;; Pass 3: Interpreter passes
(define member-schema-interpreters
`((pass-markers
,(lambda (mr acc key value)
mr))
(info
,(lambda (mr acc key value)
mr))))
;; Pass 0: Removes any comments and removes any leading and trailing
;; whitespace.
(define (preprocess-member-line line)
@ -124,12 +133,34 @@
(member-record-add-highlight mr number "Unknown key" 2 'warning)
processed)))))))
;; Pass 3+: Single interpreter pass
(define (interpreter-pass mr output-name input pass-proc)
(dict-set mr output-name '()))
;; Pass 3+: Interpreter passes
(define (interpret-member-file mr . starts)
(let ((input-name (if (null? starts)
'processed
(car starts))))
(let loop ((passes member-schema-interpreters)
(prev-name input-name)
(mr mr))
(if (null? passes)
mr
(let* ((pass (car passes))
(pass-name (car pass))
(pass-proc (cadr pass)))
(loop (cdr passes)
(caar passes)
(interpreter-pass mr pass-name (dict-ref mr prev-name) pass-proc)))))))
;; Loads member file source. Performs passes 0, 1 and 2.
(define (load-member-file mr)
(let* ((mrif (member-record-input-file mr))
(source (read-lines mrif))
(mrp (parse-member-lines mr source)))
(process-member-file mrp)))
(interpret-member-file
(process-member-file mrp))))
;; Performs self-tests of the member-parser module.
(define (member-parser-tests!)