add expr ids
This commit is contained in:
parent
f17f098d20
commit
50417fd735
15
compiler/counter.phi
Normal file
15
compiler/counter.phi
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
(fn Counter () (do
|
||||||
|
(let counter 0)
|
||||||
|
|
||||||
|
(fn count () (do
|
||||||
|
(return counter)
|
||||||
|
))
|
||||||
|
|
||||||
|
(fn increment () (do
|
||||||
|
(+= counter 1)
|
||||||
|
))
|
||||||
|
|
||||||
|
(return (list count increment))
|
||||||
|
))
|
||||||
|
|
@ -1,10 +1,17 @@
|
|||||||
(import "../stdlib.phi" (
|
(import "../stdlib.phi" (
|
||||||
slice contains
|
slice
|
||||||
list_push list_pop list_contains
|
contains
|
||||||
map map_has map_get map_set
|
list_push
|
||||||
|
list_pop
|
||||||
|
list_contains
|
||||||
|
map
|
||||||
|
map_has
|
||||||
|
map_get
|
||||||
|
map_set
|
||||||
))
|
))
|
||||||
(import "./parse.phi" (Parser tokenize))
|
(import "./parse.phi" (Parser tokenize))
|
||||||
(import "./syms.phi" (Syms))
|
(import "./syms.phi" (Syms))
|
||||||
|
(import "./counter.phi" (Counter))
|
||||||
|
|
||||||
(fn JsEmitter (ast initial_filename) (do
|
(fn JsEmitter (ast initial_filename) (do
|
||||||
(let output (list))
|
(let output (list))
|
||||||
@ -64,30 +71,30 @@
|
|||||||
|
|
||||||
(fn discover_syms (exprs) (do
|
(fn discover_syms (exprs) (do
|
||||||
(for expr exprs (do
|
(for expr exprs (do
|
||||||
(let (ty line) expr)
|
(let (_ ty line) expr)
|
||||||
(if (!= ty "list") (return))
|
(if (!= ty "list") (return))
|
||||||
(let (_ _ s) expr)
|
(let (_ _ _ s) expr)
|
||||||
(if (== (len s) 0) (return))
|
(if (== (len s) 0) (return))
|
||||||
(let ((_ _ id)) s)
|
(let ((_ _ _ id)) s)
|
||||||
(if (== id "fn") (do
|
(if (== id "fn") (do
|
||||||
(let (_ (_ _ ident) (_ _ params) body) s)
|
(let (_ (_ _ _ ident) (_ _ _ params) body) s)
|
||||||
(define_fn ident line)
|
(define_fn ident line)
|
||||||
))
|
))
|
||||||
))
|
))
|
||||||
))
|
))
|
||||||
|
|
||||||
(fn emit_expr (expr) (do
|
(fn emit_expr (expr) (do
|
||||||
(let (ty line) expr)
|
(let (_ ty line) expr)
|
||||||
(if (== ty "list") (do
|
(if (== ty "list") (do
|
||||||
(emit_list expr)
|
(emit_list expr)
|
||||||
) (if (== ty "int") (do
|
) (if (== ty "int") (do
|
||||||
(let (_ _ value) expr)
|
(let (_ _ _ value) expr)
|
||||||
(emit (format "({ type: \"int\", value: % })" value))
|
(emit (format "({ type: \"int\", value: % })" value))
|
||||||
) (if (== ty "string") (do
|
) (if (== ty "string") (do
|
||||||
(let (_ _ value) expr)
|
(let (_ _ _ value) expr)
|
||||||
(emit (format "({ type: \"string\", value: \"%\" })" (string_escape value)))
|
(emit (format "({ type: \"string\", value: \"%\" })" (string_escape value)))
|
||||||
) (if (== ty "ident") (do
|
) (if (== ty "ident") (do
|
||||||
(let (_ _ value) expr)
|
(let (_ _ _ value) expr)
|
||||||
|
|
||||||
(if (== value "null") (do
|
(if (== value "null") (do
|
||||||
(emit "({ type: \"null\" })")
|
(emit "({ type: \"null\" })")
|
||||||
@ -130,16 +137,16 @@
|
|||||||
))
|
))
|
||||||
|
|
||||||
(fn emit_list (expr) (do
|
(fn emit_list (expr) (do
|
||||||
(let (ty line s) expr)
|
(let (_ ty line s) expr)
|
||||||
(if (== (len s) 0) (do
|
(if (== (len s) 0) (do
|
||||||
(panic "illegal function on line %" line)
|
(panic "illegal function on line %" line)
|
||||||
))
|
))
|
||||||
(let ((id_ty _ id)) s)
|
(let ((_ id_ty _ id)) s)
|
||||||
(if (!= id_ty "ident") (do
|
(if (!= id_ty "ident") (do
|
||||||
(panic "illegal function on line %" line)
|
(panic "illegal function on line %" line)
|
||||||
))
|
))
|
||||||
(if (== id "import") (do
|
(if (== id "import") (do
|
||||||
(let (_ (_ _ inner_filename_rel) (_ _ idents)) s)
|
(let (_ (_ _ _ inner_filename_rel) (_ _ _ idents)) s)
|
||||||
|
|
||||||
(let inner_filename (fs_resolve (fs_dirname filename) inner_filename_rel))
|
(let inner_filename (fs_resolve (fs_dirname filename) inner_filename_rel))
|
||||||
|
|
||||||
@ -186,7 +193,7 @@
|
|||||||
))
|
))
|
||||||
(list_pop import_stack)
|
(list_pop import_stack)
|
||||||
|
|
||||||
(for (_ _ ident) idents (do
|
(for (_ _ _ ident) idents (do
|
||||||
(let sym null)
|
(let sym null)
|
||||||
(for (sym_ident found_sym) sym_map (do
|
(for (sym_ident found_sym) sym_map (do
|
||||||
(if (== sym_ident ident) (do
|
(if (== sym_ident ident) (do
|
||||||
@ -206,7 +213,7 @@
|
|||||||
))
|
))
|
||||||
))
|
))
|
||||||
) (if (== id "fn") (do
|
) (if (== id "fn") (do
|
||||||
(let (_ (_ _ ident) (_ _ params) body) s)
|
(let (_ (_ _ _ ident) (_ _ _ params) body) s)
|
||||||
|
|
||||||
(let sym (get_sym ident))
|
(let sym (get_sym ident))
|
||||||
(let (sym_id) sym)
|
(let (sym_id) sym)
|
||||||
@ -216,7 +223,7 @@
|
|||||||
(enter_scope)
|
(enter_scope)
|
||||||
|
|
||||||
(let first true)
|
(let first true)
|
||||||
(for (_ _ ident) params (do
|
(for (_ _ _ ident) params (do
|
||||||
(if (not first) (do
|
(if (not first) (do
|
||||||
(emit ", ")
|
(emit ", ")
|
||||||
))
|
))
|
||||||
@ -396,16 +403,16 @@
|
|||||||
))
|
))
|
||||||
|
|
||||||
(fn emit_let_node (pat base_reg) (do
|
(fn emit_let_node (pat base_reg) (do
|
||||||
(let (pat_ty line) pat)
|
(let (_ pat_ty line) pat)
|
||||||
(if (== pat_ty "ident") (do
|
(if (== pat_ty "ident") (do
|
||||||
(let (_ _ ident) pat)
|
(let (_ _ _ ident) pat)
|
||||||
|
|
||||||
(if (== ident "_") (return))
|
(if (== ident "_") (return))
|
||||||
|
|
||||||
(let sym_id (define_let ident line))
|
(let sym_id (define_let ident line))
|
||||||
(emit (format ";\nlet _%% = r_%" ident sym_id base_reg))
|
(emit (format ";\nlet _%% = r_%" ident sym_id base_reg))
|
||||||
) (if (== pat_ty "list") (do
|
) (if (== pat_ty "list") (do
|
||||||
(let (_ _ pats) pat)
|
(let (_ _ _ pats) pat)
|
||||||
|
|
||||||
(let i 0)
|
(let i 0)
|
||||||
(for pat pats (do
|
(for pat pats (do
|
||||||
@ -424,7 +431,7 @@
|
|||||||
))
|
))
|
||||||
|
|
||||||
(fn emit_binary_op (s id) (do
|
(fn emit_binary_op (s id) (do
|
||||||
(let ((_ line _) left right) s)
|
(let ((_ _ line _) left right) s)
|
||||||
(emit (format "(%, runtime.%(" (rt_info line) id))
|
(emit (format "(%, runtime.%(" (rt_info line) id))
|
||||||
(emit_expr left)
|
(emit_expr left)
|
||||||
(emit ", ")
|
(emit ", ")
|
||||||
@ -437,11 +444,11 @@
|
|||||||
))
|
))
|
||||||
|
|
||||||
(fn emit_assign_expr (s line id) (do
|
(fn emit_assign_expr (s line id) (do
|
||||||
(let (_ (target_type) expr) s)
|
(let (_ (_ target_type) expr) s)
|
||||||
(if (!= target_type "ident") (do
|
(if (!= target_type "ident") (do
|
||||||
(panic "cannot assign to expression on line %" line)
|
(panic "cannot assign to expression on line %" line)
|
||||||
))
|
))
|
||||||
(let (_ (_ _ ident)) s)
|
(let (_ (_ _ _ ident)) s)
|
||||||
(let sym (get_sym ident))
|
(let sym (get_sym ident))
|
||||||
(if (== sym null) (do
|
(if (== sym null) (do
|
||||||
(panic "could not find symbol '%' on line %" ident line)
|
(panic "could not find symbol '%' on line %" ident line)
|
||||||
@ -533,20 +540,6 @@
|
|||||||
(return (list generate))
|
(return (list generate))
|
||||||
))
|
))
|
||||||
|
|
||||||
(fn Counter () (do
|
|
||||||
(let counter 0)
|
|
||||||
|
|
||||||
(fn count () (do
|
|
||||||
(return counter)
|
|
||||||
))
|
|
||||||
|
|
||||||
(fn increment () (do
|
|
||||||
(+= counter 1)
|
|
||||||
))
|
|
||||||
|
|
||||||
(return (list count increment))
|
|
||||||
))
|
|
||||||
|
|
||||||
(fn string_escape (str) (do
|
(fn string_escape (str) (do
|
||||||
(let str_len (len str))
|
(let str_len (len str))
|
||||||
(let i 0)
|
(let i 0)
|
||||||
|
@ -1,9 +1,17 @@
|
|||||||
(import "../stdlib.phi" (slice slice_eq contains))
|
(import "../stdlib.phi" (slice slice_eq contains))
|
||||||
|
(import "./counter.phi" (Counter))
|
||||||
|
|
||||||
(fn Parser (tokens) (do
|
(fn Parser (tokens) (do
|
||||||
(let i 0)
|
(let i 0)
|
||||||
(let tok (at tokens i))
|
(let tok (at tokens i))
|
||||||
|
|
||||||
|
(let (id_count increment_id) (Counter))
|
||||||
|
(fn next_id () (do
|
||||||
|
(let id (id_count))
|
||||||
|
(increment_id)
|
||||||
|
(return id)
|
||||||
|
))
|
||||||
|
|
||||||
(fn parse () (do
|
(fn parse () (do
|
||||||
(let exprs (list))
|
(let exprs (list))
|
||||||
(loop (do
|
(loop (do
|
||||||
@ -24,13 +32,13 @@
|
|||||||
(if (not (eat ")")) (do
|
(if (not (eat ")")) (do
|
||||||
(panic "expected ')' on line %" (at tok 1))
|
(panic "expected ')' on line %" (at tok 1))
|
||||||
))
|
))
|
||||||
(return (list "list" line values))
|
(return (list (next_id) "list" line values))
|
||||||
) (if (eat "string") (do
|
) (if (eat "string") (do
|
||||||
(return (list "string" line value))
|
(return (list (next_id) "string" line value))
|
||||||
) (if (eat "int") (do
|
) (if (eat "int") (do
|
||||||
(return (list "int" line (string_to_int value)))
|
(return (list (next_id) "int" line (string_to_int value)))
|
||||||
) (if (eat "ident") (do
|
) (if (eat "ident") (do
|
||||||
(return (list "ident" line value))
|
(return (list (next_id) "ident" line value))
|
||||||
) (do
|
) (do
|
||||||
(panic "expected expression, got '%' on line %" ty line)
|
(panic "expected expression, got '%' on line %" ty line)
|
||||||
)))))
|
)))))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user