Janet implementation of Lox from the book Crafting Interpreters
at main 2.3 kB view raw
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]]]]])