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" (
slice contains
list_push list_pop list_contains
map map_has map_get map_set
slice
contains
list_push
list_pop
list_contains
map
map_has
map_get
map_set
))
(import "./parse.phi" (Parser tokenize))
(import "./syms.phi" (Syms))
(import "./counter.phi" (Counter))
(fn JsEmitter (ast initial_filename) (do
(let output (list))
@ -64,30 +71,30 @@
(fn discover_syms (exprs) (do
(for expr exprs (do
(let (ty line) expr)
(let (_ ty line) expr)
(if (!= ty "list") (return))
(let (_ _ s) expr)
(let (_ _ _ s) expr)
(if (== (len s) 0) (return))
(let ((_ _ id)) s)
(let ((_ _ _ id)) s)
(if (== id "fn") (do
(let (_ (_ _ ident) (_ _ params) body) s)
(let (_ (_ _ _ ident) (_ _ _ params) body) s)
(define_fn ident line)
))
))
))
(fn emit_expr (expr) (do
(let (ty line) expr)
(let (_ ty line) expr)
(if (== ty "list") (do
(emit_list expr)
) (if (== ty "int") (do
(let (_ _ value) expr)
(let (_ _ _ value) expr)
(emit (format "({ type: \"int\", value: % })" value))
) (if (== ty "string") (do
(let (_ _ value) expr)
(let (_ _ _ value) expr)
(emit (format "({ type: \"string\", value: \"%\" })" (string_escape value)))
) (if (== ty "ident") (do
(let (_ _ value) expr)
(let (_ _ _ value) expr)
(if (== value "null") (do
(emit "({ type: \"null\" })")
@ -130,16 +137,16 @@
))
(fn emit_list (expr) (do
(let (ty line s) expr)
(let (_ ty line s) expr)
(if (== (len s) 0) (do
(panic "illegal function on line %" line)
))
(let ((id_ty _ id)) s)
(let ((_ id_ty _ id)) s)
(if (!= id_ty "ident") (do
(panic "illegal function on line %" line)
))
(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))
@ -186,7 +193,7 @@
))
(list_pop import_stack)
(for (_ _ ident) idents (do
(for (_ _ _ ident) idents (do
(let sym null)
(for (sym_ident found_sym) sym_map (do
(if (== sym_ident ident) (do
@ -206,7 +213,7 @@
))
))
) (if (== id "fn") (do
(let (_ (_ _ ident) (_ _ params) body) s)
(let (_ (_ _ _ ident) (_ _ _ params) body) s)
(let sym (get_sym ident))
(let (sym_id) sym)
@ -216,7 +223,7 @@
(enter_scope)
(let first true)
(for (_ _ ident) params (do
(for (_ _ _ ident) params (do
(if (not first) (do
(emit ", ")
))
@ -396,16 +403,16 @@
))
(fn emit_let_node (pat base_reg) (do
(let (pat_ty line) pat)
(let (_ pat_ty line) pat)
(if (== pat_ty "ident") (do
(let (_ _ ident) pat)
(let (_ _ _ ident) pat)
(if (== ident "_") (return))
(let sym_id (define_let ident line))
(emit (format ";\nlet _%% = r_%" ident sym_id base_reg))
) (if (== pat_ty "list") (do
(let (_ _ pats) pat)
(let (_ _ _ pats) pat)
(let i 0)
(for pat pats (do
@ -424,7 +431,7 @@
))
(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_expr left)
(emit ", ")
@ -437,11 +444,11 @@
))
(fn emit_assign_expr (s line id) (do
(let (_ (target_type) expr) s)
(let (_ (_ target_type) expr) s)
(if (!= target_type "ident") (do
(panic "cannot assign to expression on line %" line)
))
(let (_ (_ _ ident)) s)
(let (_ (_ _ _ ident)) s)
(let sym (get_sym ident))
(if (== sym null) (do
(panic "could not find symbol '%' on line %" ident line)
@ -533,20 +540,6 @@
(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
(let str_len (len str))
(let i 0)

View File

@ -1,9 +1,17 @@
(import "../stdlib.phi" (slice slice_eq contains))
(import "./counter.phi" (Counter))
(fn Parser (tokens) (do
(let i 0)
(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
(let exprs (list))
(loop (do
@ -24,13 +32,13 @@
(if (not (eat ")")) (do
(panic "expected ')' on line %" (at tok 1))
))
(return (list "list" line values))
(return (list (next_id) "list" line values))
) (if (eat "string") (do
(return (list "string" line value))
(return (list (next_id) "string" line value))
) (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
(return (list "ident" line value))
(return (list (next_id) "ident" line value))
) (do
(panic "expected expression, got '%' on line %" ty line)
)))))

2053
stage2.js

File diff suppressed because it is too large Load Diff