-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathmain.rkt
51 lines (45 loc) · 1.29 KB
/
main.rkt
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
#lang typed/racket/base
(require racket/match)
(require racket/file)
(require "lox/lib/parser.rkt")
(require "lox/lib/scanner.rkt")
(require "lox/lib/interpreter.rkt")
(require "lox/lib/resolver.rkt")
(require "lox/lib/error.rkt")
(require "lox/lib/stmt.rkt")
(require "lox/lib/pretty-print.rkt")
(: main (-> Void))
(define (main)
(define args (current-command-line-arguments))
(match args
[(vector) (run-prompt)]
[(vector f) (run-file f)]
[_ (println "Usage: racket-lox [script]")]))
(: run-prompt (-> Void))
(define (run-prompt)
(let loop ()
(display "> ")
(define line (read-line))
(unless (eof-object? line)
(run line)
(set-had-error! #f)
(loop))))
(: run-file (-> Path-String Void))
(define (run-file filename)
(define source (file->string filename))
(run source)
(when had-error (exit 65))
(when had-runtime-error (exit 70)))
(: run (-> String Void))
(define (run source)
(define scanner (make-scanner source))
(define tokens (scan-tokens! scanner))
(define parser (make-parser tokens))
(define statements (parse! parser))
(unless had-error
(define interpreter (make-interpreter))
(define resolver (make-resolver interpreter))
(resolve-all! resolver statements)
(unless had-error
(interpret! interpreter statements))))
(main)