add expr ids

This commit is contained in:
sfja 2025-09-25 19:31:24 +02:00
parent f17f098d20
commit 50417fd735
4 changed files with 1106 additions and 1045 deletions

15
compiler/counter.phi Normal file
View 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))
))

View File

@ -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)

View File

@ -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)
))))) )))))

2053
stage2.js

File diff suppressed because it is too large Load Diff