Advertisement
lythesia

Untitled

Mar 29th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 1.54 KB | None | 0 0
  1. (use-modules (ice-9 format))
  2.  
  3. (define (lexer)
  4.   (define (scan)
  5.     (do
  6.       ((ch (read-char) (read-char)))
  7.       ((or (eof-object? ch) (not (char-whitespace? ch))) ch)
  8.     )
  9.   )
  10.  
  11.   ; return is the **NEXT** which will use `(scan)`
  12.   (define (cc return)
  13.     (let loop ()
  14.       (set! return
  15.         (call/cc
  16.           (lambda (resume-here)
  17.             (set! cc resume-here)
  18.             (return (scan))
  19.           )
  20.         )
  21.       )
  22.       (loop)
  23.     )
  24.   )
  25.  
  26.   (lambda () (call/cc cc))
  27. )
  28.  
  29. (define (parser cb lexer)
  30.   (define (E)
  31.     (T)
  32.     (format #t "begin [+-..]\n")
  33.     (do
  34.       ((next (lexer) (lexer)))
  35.       ((not (or (equal? #\+ next) (equal? #\- next))))
  36.       (begin (cb next) (T))
  37.     )
  38.     (format #t "ret-E\n")
  39.   )
  40.  
  41.   (define (T)
  42.     (S)
  43.     (format #t "begin [*/..]\n")
  44.     (do
  45.       ((next (lexer) (lexer)))
  46.       ((not (or (equal? #\* next) (equal? #\/ next))))
  47.       (begin (cb next) (S))
  48.     )
  49.     (format #t "ret-T\n")
  50.   )
  51.  
  52.   (define (S)
  53.     (let ((next (lexer)))
  54.       (cond
  55.         ((char-numeric? next)
  56.          (cb next))
  57.         ((equal? #\( next)
  58.          (cb next)
  59.          (E)
  60.          (let ((next2 (lexer)))
  61.            (if (equal? #\) next2)
  62.              (cb next2)
  63.              (error "PARSE FAIL1")
  64.            )
  65.          ))
  66.         ((eof-object? next) (begin (format #t "bye~") (exit)))
  67.         (else (error "PARSE FAIL2"))
  68.       )
  69.     )
  70.   )
  71.  
  72.   (E)
  73. )
  74.  
  75. ;(parser (lambda (ch) (format #t "parsed: ~c\n" ch)) (lexer))
  76. (parser (lambda (ch) (format #t "parsed: ~c\n" ch)) read-char)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement