phi-lang/compiler/syms.phi
2025-09-23 19:47:35 +02:00

80 lines
1.7 KiB
Plaintext

(import "stdlib.phi" (indent))
(fn Syms () (do
(let syms (list null (list)))
(fn enter_scope () (do
(= syms (list syms (list)))
))
(fn leave_scope () (do
(let (parent _) syms)
(= syms parent)
))
(fn define_sym (ident sym) (do
(let (_ map) syms)
(let i 0)
(loop (do
(if (>= i (len map)) (break))
(let (s_ident _) (at map i))
(if (== ident s_ident) (do
(set map i (list ident sym))
(return)
))
(+= i 1)
))
(push map (list ident sym))
))
(fn find_sym (syms ident) (do
(let (parent map) syms)
(let i 0)
(loop (do
(if (>= i (len map)) (break))
(let (s_ident s_sym) (at map i))
(if (== ident s_ident) (do
(return s_sym)
))
(+= i 1)
))
(if (!= parent null) (do
(return (find_sym parent ident))
))
(return null)
))
(fn get_sym (ident) (do
(return (find_sym syms ident))
))
(fn get_current_map () (do
(let (_ map) syms)
(return map)
))
(fn print_syms_node (syms depth) (do
(let (parent map) syms)
(for (ident sym) map (do
(println "%- %: %" (indent depth) ident sym)
))
(if (!= parent null) (do
(print_syms_node parent (+ depth 1))
))
))
(fn print_syms () (do
(print_syms_node syms 0)
))
(return (list
enter_scope
leave_scope
define_sym
get_sym
get_current_map
print_syms
))
))