From a6043c0fc239c740945370370868371ea95fa091 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Sat, 25 Mar 2023 18:40:13 +0100 Subject: [PATCH] Work on pass3+ infrastructure. --- member-parser.scm | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/member-parser.scm b/member-parser.scm index 4257b51..8a9d37d 100644 --- a/member-parser.scm +++ b/member-parser.scm @@ -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!)