phi-lang/compiler/syms.phi
2025-09-23 23:54:07 +02:00

64 lines
1.3 KiB
Plaintext

(import "stdlib.phi" (indent map map_has map_get map_set))
(fn Syms () (do
(let syms (list null (map)))
(fn enter_scope () (do
(= syms (list syms (map)))
))
(fn leave_scope () (do
(let (parent _) syms)
(= syms parent)
))
(fn define_sym (ident sym) (do
(let (_ map) syms)
(map_set map ident sym)
))
(fn find_sym (syms ident) (do
(let (parent map) syms)
(if (map_has map ident) (do
(return (map_get map ident))
))
(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
))
))