git @ Cat's Eye Technologies Decoy / f26d562
Refactor parser. Toplevels are seperate. Chris Pressey 1 year, 4 months ago
4 changed file(s) with 54 addition(s) and 36 deletion(s). Raw diff Collapse all Expand all
0 (import-from "stdenv" (+))
0 (import-from "stdenv" (+ list))
11 (import-from "list" (fold))
2 (fold (lambda (x acc) (+ x acc)) 0 (quote (4 16 1)))
2 (fold (lambda (x acc) (+ x acc)) 0 (list 4 16 1))
1010
1111 local Parser = {}
1212
13 function Parser:parse_exprs()
13 function Parser:parse_sexps()
1414 local es = {}
1515 local e
16 while not self.scanner:is_eof() and self.scanner:get_token_text() ~= ")" do
17 e = self:parse_expr()
16 while (not self.scanner:is_eof()) and self.scanner:get_token_text() ~= ")" do
17 e = self:parse_sexp()
1818 table.insert(es, e)
1919 end
2020 return es
2121 end
2222
23 function Parser:parse_expr()
23 function Parser:parse_sexp()
2424 local e
2525 local scanner = self.scanner
2626 if scanner:consume("(") then
27 if self.parse_special_forms then
28 if scanner:consume("define") then
29 assert(scanner:get_token_type() == "symbol")
30 local name = scanner:get_token_text()
31 scanner:consume_type("symbol")
32 local defn = self:parse_expr()
33 scanner:expect(")")
34 e = ast.new_Define(name, defn)
35 --elseif scanner:consume("import-from") then
36 -- error("You said *import-from")
37 -- scanner:expect(")")
38 else
39 local es = self:parse_exprs()
40 scanner:expect(")")
41 e = Cons.table_to_list(es)
42 end
43 else
44 local es = self:parse_exprs()
45 scanner:expect(")")
46 e = Cons.table_to_list(es)
47 end
27 local es = self:parse_sexps()
28 scanner:expect(")")
29 e = Cons.table_to_list(es)
4830 elseif scanner:get_token_type() == "symbol" then
4931 e = Symbol.new(scanner:get_token_text())
5032 scanner:scan()
5537 local value = tonumber(scanner:get_token_text())
5638 e = Number.new(value)
5739 scanner:scan()
40 else
41 error("what is this I don't even: " .. scanner:get_token_text())
42 end
43 return e
44 end
45
46 function Parser:parse_toplevels()
47 local es = {}
48 local e
49 while not self.scanner:is_eof() do
50 e = self:parse_toplevel()
51 table.insert(es, e)
52 end
53 return es
54 end
55
56 function Parser:parse_toplevel()
57 local e
58 local scanner = self.scanner
59 if scanner:consume("(") then
60 if scanner:consume("define") then
61 assert(scanner:get_token_type() == "symbol")
62 local name = scanner:get_token_text()
63 scanner:consume_type("symbol")
64 local defn = self:parse_sexp()
65 scanner:expect(")")
66 e = ast.new_Define(name, defn)
67 --elseif scanner:consume("import-from") then
68 -- error("You said *import-from")
69 -- scanner:expect(")")
70 else
71 local es = self:parse_sexps()
72 scanner:expect(")")
73 e = Cons.table_to_list(es)
74 end
5875 else
5976 error("what is this I don't even: " .. scanner:get_token_text())
6077 end
8686 local env = self.preload_env
8787
8888 local parser = Parser.new(program_text)
89 local exprs = parser:parse_exprs()
89 -- local exprs = parser:parse_toplevels()
90 local exprs = parser:parse_sexps()
9091 for j, expr in ipairs(exprs) do
9192 env = process_toplevel(self, expr, env, module, expr_processor)
9293 end
1616
1717 local Parser = require "decoy_parser"
1818
19 local p, j, expr
19 local p, j, sexp
2020
2121 p = Parser.new("(meow woof)")
22 expr = p:parse_expr()
23 print(depict(expr))
22 sexp = p:parse_sexp()
23 print(depict(sexp))
2424
2525 p = Parser.new("(a ())")
26 expr = p:parse_expr()
27 print(depict(expr))
28 print(render(expr))
26 sexp = p:parse_sexp()
27 print(depict(sexp))
28 print(render(sexp))
2929 print(Cons.table_to_list({}))
3030
3131 p = Parser.new([[
4949 (define update (lambda (key fn map)
5050 (set key (fn (get key map)) map)))
5151 ]])
52 local result = p:parse_exprs()
52 local result = p:parse_sexps()
5353 for j, expr in ipairs(result) do
5454 print(depict(expr))
5555 end
6060
6161 function run(s)
6262 local p = Parser.new(s)
63 local expr = p:parse_expr()
63 local expr = p:parse_sexp()
6464 print("???", depict(expr))
6565 local desugarer = Desugarer.new()
6666 expr = desugarer:desugar_expr(expr)