1 2 3 4 5 6 7 8 | #lang br (require brag/support) (define basic-lexer (lexer-srcloc ···)) (provide basic-lexer) |
1 2 3 4 5 6 7 8 9 | #lang br (require brag/support) (define basic-lexer (lexer-srcloc ["\n" (token 'NEWLINE lexeme)] [whitespace (token lexeme #:skip? #t)])) (provide basic-lexer) |
1 2 3 4 5 6 7 8 9 10 | #lang br (require brag/support) (define basic-lexer (lexer-srcloc ["\n" (token 'NEWLINE lexeme)] [whitespace (token lexeme #:skip? #t)] [(from/stop-before "rem" "\n") (token 'REM lexeme)])) (provide basic-lexer) |
1 2 3 4 5 6 7 8 9 10 11 12 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #lang br (require brag/support) (define-lex-abbrev digits (:+ (char-set "0123456789"))) (define basic-lexer (lexer-srcloc ["\n" (token 'NEWLINE lexeme)] [whitespace (token lexeme #:skip? #t)] [(from/stop-before "rem" "\n") (token 'REM lexeme)] [(:or "print" "goto" "end" "+" ":" ";") (token lexeme lexeme)])) (provide basic-lexer) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #lang br (require brag/support) (define-lex-abbrev digits (:+ (char-set "0123456789"))) (define basic-lexer (lexer-srcloc ["\n" (token 'LINE-SEP)] [whitespace (token lexeme #:skip? #t)] [(from/stop-before "rem" "\n") (token 'REM lexeme)] [(:or "print" "goto" "end" "+" ":" ";") (token lexeme lexeme)] [digits (token 'INTEGER (string->number lexeme))] [(:or (:seq (:? digits) "." digits) (:seq digits ".")) (token 'DECIMAL (string->number lexeme))])) (provide basic-lexer) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #lang br (require brag/support) (define-lex-abbrev digits (:+ (char-set "0123456789"))) (define basic-lexer (lexer-srcloc ["\n" (token 'NEWLINE lexeme)] [whitespace (token lexeme #:skip? #t)] [(from/stop-before "rem" "\n") (token 'REM lexeme)] [(:or "print" "goto" "end" "+" ":" ";") (token lexeme lexeme)] [digits (token 'INTEGER (string->number lexeme))] [(:or (:seq (:? digits) "." digits) (:seq digits ".")) (token 'DECIMAL (string->number lexeme))] [(:or (from/to "\"" "\"") (from/to "'" "'")) (token 'STRING (substring lexeme 1 (sub1 (string-length lexeme))))])) (provide basic-lexer) |
1 2 3 4 5 6 7 | #lang br (require "lexer.rkt" brag/support rackunit) (define (lex str) (apply-port-proc basic-lexer str)) ··· |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #lang br (require "lexer.rkt" brag/support rackunit) (define (lex str) (apply-port-proc basic-lexer str)) (check-equal? (lex "") empty) (check-equal? (lex " ") (list (srcloc-token (token " " #:skip? #t) (srcloc 'string 1 0 1 1)))) (check-equal? (lex "rem ignored\n") (list (srcloc-token (token 'REM "rem ignored") (srcloc 'string 1 0 1 11)) (srcloc-token (token 'NEWLINE "\n") (srcloc 'string 1 11 12 1)))) (check-equal? (lex "print") (list (srcloc-token (token "print" "print") (srcloc 'string 1 0 1 5)))) (check-equal? (lex "goto") (list (srcloc-token (token "goto" "goto") (srcloc 'string 1 0 1 4)))) (check-equal? (lex "end") (list (srcloc-token (token "end" "end") (srcloc 'string 1 0 1 3)))) (check-equal? (lex "+") (list (srcloc-token (token "+" "+") (srcloc 'string 1 0 1 1)))) (check-equal? (lex ";") (list (srcloc-token (token ";" ";") (srcloc 'string 1 0 1 1)))) (check-equal? (lex ":") (list (srcloc-token (token ":" ":") (srcloc 'string 1 0 1 1)))) (check-equal? (lex "12") (list (srcloc-token (token 'INTEGER 12) (srcloc 'string 1 0 1 2)))) (check-equal? (lex "1.2") (list (srcloc-token (token 'DECIMAL 1.2) (srcloc 'string 1 0 1 3)))) (check-equal? (lex "12.") (list (srcloc-token (token 'DECIMAL 12.) (srcloc 'string 1 0 1 3)))) (check-equal? (lex ".12") (list (srcloc-token (token 'DECIMAL .12) (srcloc 'string 1 0 1 3)))) (check-equal? (lex "\"foo\"") (list (srcloc-token (token 'STRING "foo") (srcloc 'string 1 0 1 5)))) (check-equal? (lex "'foo'") (list (srcloc-token (token 'STRING "foo") (srcloc 'string 1 0 1 5)))) (check-exn exn:fail:read? (lambda () (lex "x"))) |