beautiful-racket/beautiful-racket/br/demo/jsonic/reader.rkt
Matthew Butterick 2c6d8a781a more
2016-09-23 21:58:15 -07:00

32 lines
1.1 KiB
Racket

#lang at-exp br/quicklang
(require "parser.rkt")
(define (read-syntax path port)
(define parse-tree (parse path (tokenize port)))
(define module-datum `(module bf-mod br/demo/jsonic/expander
,parse-tree))
(datum->syntax #f module-datum))
(provide read-syntax)
(require parser-tools/lex parser-tools/lex-sre brag/support)
(define (tokenize port)
(define (next-token)
(define our-lexer
(lexer
[(eof) eof]
[(or whitespace
(seq "//" (complement (seq any-string "\n" any-string)) "\n")) (next-token)]
[(char-set ",:[]{}") lexeme]
[(seq "@" "(" any-string ")") (token 'S-EXP (string-trim lexeme "@"))]
[(seq (repetition 0 1 "-") (+ numeric) (repetition 0 1 (seq "." (* numeric))))
(token 'NUMBER lexeme)] ;; Q: what is grammar for a JS number?
[(seq "\"" (complement (seq any-string "\"" any-string)) "\"") (token 'STRING (string-trim lexeme "\""))]))
(our-lexer port))
next-token)
(define (test-tokenize str)
(define ip (open-input-string str))
(define token-producer (tokenize ip))
(for/list ([token (in-producer token-producer eof)])
token))