Rearrange parser code.
It fits on a page now and reads well top-to-bottom.
This commit is contained in:
parent
4bb47c6b15
commit
961d84173f
|
|
@ -126,6 +126,9 @@
|
||||||
(define (pop-int stack) (pop-kind stack number? "Not an integer."))
|
(define (pop-int stack) (pop-kind stack number? "Not an integer."))
|
||||||
(define (pop-bool stack) (pop-kind stack boolean? "Not a Boolean value."))
|
(define (pop-bool stack) (pop-kind stack boolean? "Not a Boolean value."))
|
||||||
|
|
||||||
|
(define (string-replace str from to)
|
||||||
|
(string-intersperse (string-split str from #t) to))
|
||||||
|
|
||||||
|
|
||||||
; ██████╗ ██████╗ ██████╗ ███████╗ ██╗ ██╗ ██████╗ ██████╗ ██████╗ ███████╗
|
; ██████╗ ██████╗ ██████╗ ███████╗ ██╗ ██╗ ██████╗ ██████╗ ██████╗ ███████╗
|
||||||
;██╔════╝██╔═══██╗██╔══██╗██╔════╝ ██║ ██║██╔═══██╗██╔══██╗██╔══██╗██╔════╝
|
;██╔════╝██╔═══██╗██╔══██╗██╔════╝ ██║ ██║██╔═══██╗██╔══██╗██╔══██╗██╔════╝
|
||||||
|
|
@ -223,22 +226,27 @@
|
||||||
;╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚═╝
|
;╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚═╝
|
||||||
;Parser
|
;Parser
|
||||||
|
|
||||||
(define (string-replace str from to)
|
(define (text->expression text) (parse (tokenize text)))
|
||||||
(string-intersperse (string-split str from #t) to))
|
|
||||||
|
|
||||||
(define (tokenize str)
|
(define (tokenize str) ; Let's do the simple trick.
|
||||||
(string-split
|
(string-split (string-replace (string-replace str "]" " ] ") "[" " [ ")))
|
||||||
(string-replace (string-replace str "]" " ] ") "[" " [ ")))
|
|
||||||
|
|
||||||
(define (tokenator token)
|
(define (parse tokens) (parse0 tokens '()))
|
||||||
(cond ((string->number token) (string->number token))
|
|
||||||
((string=? token "true") #t)
|
(define (parse0 tokens acc)
|
||||||
((string=? token "false") #f)
|
(if (null? tokens) acc
|
||||||
(else (string->symbol token))))
|
(receive (term rest_of_tokens)
|
||||||
|
(one-token-lookahead (car tokens) (cdr tokens))
|
||||||
|
(cons term (parse0 rest_of_tokens acc)))))
|
||||||
|
|
||||||
|
(define (one-token-lookahead token tokens)
|
||||||
|
(match token
|
||||||
|
("]" (abort "Extra closing bracket."))
|
||||||
|
("[" (expect-right-bracket tokens '()))
|
||||||
|
(_ (values (tokenator token) tokens))))
|
||||||
|
|
||||||
(define (expect-right-bracket tokens0 acc)
|
(define (expect-right-bracket tokens0 acc)
|
||||||
(if (null? tokens0)
|
(if (null? tokens0) (abort "Missing closing bracket.")
|
||||||
(abort "Missing closing bracket.")
|
|
||||||
(receive (token tokens) (car+cdr tokens0)
|
(receive (token tokens) (car+cdr tokens0)
|
||||||
(match token
|
(match token
|
||||||
("]" (values acc tokens))
|
("]" (values acc tokens))
|
||||||
|
|
@ -248,22 +256,11 @@
|
||||||
(_ (receive (el rest) (expect-right-bracket tokens acc)
|
(_ (receive (el rest) (expect-right-bracket tokens acc)
|
||||||
(values (cons (tokenator token) el) rest)))))))
|
(values (cons (tokenator token) el) rest)))))))
|
||||||
|
|
||||||
(define (one-token-lookahead token tokens)
|
(define (tokenator token)
|
||||||
(match token
|
(cond ((string->number token) (string->number token))
|
||||||
("]" (abort "Extra closing bracket."))
|
((string=? token "true") #t)
|
||||||
("[" (expect-right-bracket tokens '()))
|
((string=? token "false") #f)
|
||||||
(_ (values (tokenator token) tokens))))
|
(else (string->symbol token))))
|
||||||
|
|
||||||
(define (parse0 tokens acc)
|
|
||||||
(if (null? tokens)
|
|
||||||
acc
|
|
||||||
(receive (term rest_of_tokens)
|
|
||||||
(one-token-lookahead (car tokens) (cdr tokens))
|
|
||||||
(cons term (parse0 rest_of_tokens acc)))))
|
|
||||||
|
|
||||||
(define (parse tokens) (parse0 tokens '()))
|
|
||||||
|
|
||||||
(define (text->expression text) (parse (tokenize text)))
|
|
||||||
|
|
||||||
|
|
||||||
;██████╗ ██████╗ ██╗███╗ ██╗████████╗███████╗██████╗
|
;██████╗ ██████╗ ██╗███╗ ██╗████████╗███████╗██████╗
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue