1(use judge)
2(use ../lox/scanner)
3(use ../lox/parser)
4
5(defn parse [tokens] (:parse (make-parser tokens)))
6
7(test (parse @[{:token [:num 1]}
8 {:token [:plus]}
9 {:token [:num 2]}
10 {:token [:semicolon]}])
11 @[[:expr
12 [:binary
13 [:literal 1]
14 {:token [:plus]}
15 [:literal 2]]]])
16(test (parse @[{:token [:print]}
17 {:token [:num 1]}
18 {:token [:plus]}
19 {:token [:num 2]}
20 {:token [:semicolon]}])
21 @[[:print
22 [:binary
23 [:literal 1]
24 {:token [:plus]}
25 [:literal 2]]]])
26
27(test (parse @[{:token [:if]}
28 {:token [:left-paren]}
29 {:token [:true]}
30 {:token [:right-paren]}
31 {:token [:print]}
32 {:token [:nil]}
33 {:token [:semicolon]}])
34 @[[:if
35 [:literal true]
36 [:print [:literal nil]]
37 nil]])
38
39(test (parse @[{:token [:if]}
40 {:token [:left-paren]}
41 {:token [:true]}
42 {:token [:right-paren]}
43 {:token [:print]}
44 {:token [:true]}
45 {:token [:semicolon]}
46 {:token [:else]}
47 {:token [:print]}
48 {:token [:false]}
49 {:token [:semicolon]}])
50 @[[:if
51 [:literal true]
52 [:print [:literal true]]
53 [:print [:literal false]]]])
54
55(defn scan-parse [input] (parse (scan input)))
56
57(test (scan-parse "var three;")
58 @[[:var
59 {:line 1 :token [:ident "three"]}
60 nil]])
61(test (scan-parse "var three = 1 + 2; print three;")
62 @[[:var {:line 1 :token [:ident "three"]}
63 [:binary
64 [:literal 1]
65 {:line 1 :token [:plus]}
66 [:literal 2]]]
67 [:print [:variable {:line 1 :token [:ident "three"]}]]])
68(test (scan-parse "one();")
69 @[[:expr
70 [:call
71 [:variable
72 {:line 1 :token [:ident "one"]}]
73 {:line 1 :token [:right-paren]}
74 @[]]]])
75(test (scan-parse "add(1, 2);")
76 @[[:expr
77 [:call
78 [:variable
79 {:line 1 :token [:ident "add"]}]
80 {:line 1 :token [:right-paren]}
81 @[[:literal 1] [:literal 2]]]]])