git @ Cat's Eye Technologies Tamsin / f8f0409
Bring parser, desugarer in Tamsin up to speed. All tests pass. Cat's Eye Technologies 11 years ago
5 changed file(s) with 37 addition(s) and 38 deletion(s). Raw diff Collapse all Expand all
1717
1818 desugar(program(L)) = desugar_all(L) → DL & return program(DL).
1919 desugar(module(N, L)) = desugar_all(L) → DL & return module(N, DL).
20 desugar(production(N, F, E)) = desugar(E) → DE & return production(N, F, DE).
20 desugar(production(N, F, E, Ps)) = desugar(E) → DE & return production(N, F, DE, Ps).
2121 desugar(or(L, R)) = desugar(L) → DL & desugar(R) → DR & return or(DL, DR).
2222 desugar(and(L, R)) = desugar(L) → DL & desugar(R) → DR & return and(DL, DR).
2323 desugar(not(X)) = desugar(X) → DX & return not(DX).
3030
3131 desugar(fold(R, I)) =
3232 desugar(R) → DR &
33 SET ← set('_1', I) &
34 SEND ← send(DR, '_2') &
35 CAT ← concat('_1', '_2') &
36 ACC ← set('_1', CAT) &
37 RET ← call(prodref('$', 'return'), list('_1', nil)) &
33 SET ← set(term('_1'), I) &
34 SEND ← send(DR, term('_2')) &
35 CAT ← concat(term('_1'), term('_2')) &
36 ACC ← set(term('_1'), CAT) &
37 RET ← call(prodref('$', 'return'), list(term('_1'), nil)) &
3838 return and(and(SET, while(and(SEND, ACC))), RET).
3939
4040 desugar(Else) = Else.
44 # REQUIRES lib/tamsin_scanner.tamsin
55 # REQUIRES lib/tamsin_parser.tamsin
66
7 # Note that this may contain support for some features which are not in
8 # the current released or pre-released version.
9
10 main = tamsin_parser:parse → AST & {" " | "\n"} & "/" & interpret(AST, AST).
7 main = tamsin_parser:parse → AST & tamsin_scanner:skippable & "/" &
8 interpret(AST, AST).
119
1210 interpret(P, program(L)) =
1311 find_main_module_prods(L) → MMPs &
1412 find_prod(main, MMPs) → Main &
1513 interpret(P, Main).
1614
17 interpret(P, production(N, F, E)) = interpret(P, E).
18 interpret(program(L), call(prodref('$', 'return'), list(X, nil))) = return X.
19 interpret(program(L), call(prodref('$', 'expect'), list(X, nil))) = «X».
20 interpret(program(L), call(prodref('$', 'print'), list(X, nil))) = print X.
15 interpret(P, production(N, F, E, Ps)) = interpret(P, E).
16 interpret(program(L), call(prodref('$', 'return'), list(term(X), nil))) = return X.
17 interpret(program(L), call(prodref('$', 'expect'), list(term(X), nil))) = «X».
18 interpret(program(L), call(prodref('$', 'print'), list(term(X), nil))) = print X.
2119
2220 interpret(program(L), call(prodref(M, N), A)) =
2321 find_main_module_prods(L) → MMP &
2927 interpret(P, not(X)) = !interpret(P, X).
3028 interpret(P, while(X)) = {interpret(P, X)}.
3129
32 find_main_module_prods(list(module(main, Ps),T)) = Ps.
33 find_main_module_prods(list(H,T)) = find_main_module_prods(T).
30 find_main_module_prods(list(module(main, Ps), T)) = Ps.
31 find_main_module_prods(list(H, T)) = find_main_module_prods(T).
3432 find_main_module_prods(nil) = fail 'no main module'.
3533
36 find_prod(N1, list(production(N2, F, E),T)) =
37 $:equal(N1, N2) & return production(N2, F, E) | find_prod(N1, T).
38 find_prod(N, list(H,T)) = find_prod(N, T).
34 find_prod(N1, list(production(N2, F, E, Ps), T)) =
35 $:equal(N1, N2) & return production(N2, F, E, Ps) | find_prod(N1, T).
36 find_prod(N, list(H, T)) = find_prod(N, T).
3937 find_prod(N, nil) = fail 'no ' + N + ' production'.
3838 [formals → F] &
3939 "=" &
4040 expr0 → E &
41 return production(N, F, E).
41 return production(N, F, E, nil).
4242 formals = L ← nil &
4343 "(" &
4444 term → T & L ← list(T, L) &
5050 expr0 = expr1 → L & {("|" | "||") & expr1 → R & L ← or(L, R)} & L.
5151 expr1 = expr2 → L & {("&" | "&&") & expr2 → R & L ← and(L, R)} & L.
5252 expr2 = expr3 → L & ["using" & prodref → P & L ← using(L, P)] & L.
53 expr3 = expr4 → L & [("→" | "->") & variable → V & L ← send(L, V)] & L.
53 expr3 = expr4 → L & [("→" | "->") & variable → V & L ← send(L, term(V))] & L.
5454 expr4 = expr5 → L & ("/" & texpr → T & return fold(L, T) | return L).
5555 expr5 = "(" & expr0 → E & ")" & E
56 | "[" & expr0 → E & "]" & return or(E, call(prodref('$', return), list(nil, nil)))
56 | "[" & expr0 → E & "]" &
57 return or(E, call(prodref('$', return), list(term(nil), nil)))
5758 | "{" & expr0 → E & "}" & return while(E)
5859 | "!" & expr5 → E & return not(E)
59 | "set" & variable → V & "=" & texpr → T & return set(V, T)
60 | "set" & variable → V & "=" & texpr → T & return set(term(V), T)
6061 | "return" & texpr → T & return call(prodref('$', return), list(T, nil))
6162 | "fail" & texpr → T & return call(prodref('$', fail), list(T, nil))
6263 | "print" & texpr → T & return call(prodref('$', print), list(T, nil))
6465 | "eof" & return call(prodref('$', 'eof'), nil)
6566 | terminal
6667 | variable → V &
67 (("←" | "<-") & texpr → T & return set(V, T)
68 | return call(prodref('$', return), list(V, nil)))
68 (("←" | "<-") & texpr → T & return set(term(V), T)
69 | return call(prodref('$', return), list(term(V), nil)))
6970 | sq_string → T &
7071 $:unquote(T, '\'', '\'') → T &
71 return call(prodref('$', return), list(T, nil))
72 return call(prodref('$', return), list(term(T), nil))
7273 | prodref → P &
7374 L ← nil &
7475 ["(" &
7980 return call(P, L).
8081
8182 texpr = term → T & {"+" & term → S & T ← concat(T, S)} & T.
82 term = atom → A & L ← nil & ["(" &
83 term → T & L ← list(T, L) &
84 {"," & term → T & L ← list(T, L)} &
83 term = term0 → T & return term(T).
84 term0 = atom → A & L ← nil & ["(" &
85 term0 → T & L ← list(T, L) &
86 {"," & term0 → T & L ← list(T, L)} &
8587 ")"] &
8688 reverse(L, nil) → L &
8789 $:mkterm(A, L)
9193 $:unquote(T, '\'', '\'').
9294
9395 terminal = terminal0 → T & return call(prodref('$', expect), list(T, nil)).
94 terminal0 = dq_string → T & $:unquote(T, '"', '"') → T & T
95 | ("«" | "<<") & texpr → T & ("»" | ">>") & T.
96 terminal0 = dq_string → T & $:unquote(T, '"', '"') → T & return term(T)
97 | ("«" | "<<") & texpr → T & ("»" | ">>") & return T.
9698
9799 prodref = M ← '' & [modref → M & ":"] & word → P & return prodref(M, P).
98100 modref = "$" | word.
127127 )
128128
129129 def __str__(self):
130 return "production(%s, %s, %s)" % (
130 return "production(%s, %s, %s, %s)" % (
131131 self.name,
132132 format_list(self.formals),
133133 #format_list(self.locals_),
134134 self.body,
135 #self.next or 'nil'
135 self.next or 'nil'
136136 )
137137
138138
293293 return u"TermNode(%r)" % self.term
294294
295295 def __str__(self):
296 return "term(%s)" % self.term
296 return "term(%s)" % self.term.repr()
297297
298298
299299 class Using(AST):
210210 self.emit('result = tamsin_mkterm(temp_atom, temp_list);')
211211 self.emit('ok = 1;')
212212 elif name == 'fail':
213 self.emit_term(args[0].term, "temp")
214 self.emit("result = temp;")
213 name = self.compile_r(args[0])
214 self.emit("result = %s;" % name)
215215 self.emit('ok = 0;')
216216 else:
217217 raise NotImplementedError(name)
295295 name_lhs = self.compile_r(ast.lhs);
296296 name_rhs = self.compile_r(ast.rhs);
297297 name = self.new_name()
298 self.emit('struct term *%s = term_concat(%s, %s);' %
298 self.emit('struct term *%s = term_concat(term_flatten(%s), term_flatten(%s));' %
299299 (name, name_lhs, name_rhs)
300300 )
301301 return name;
302302 elif isinstance(ast, TermNode):
303303 name = self.new_name()
304304 self.emit_term(ast.term, name);
305 self.emit('result = %s;' % name)
306305 return name
307306 else:
308307 raise NotImplementedError(repr(ast))