Files
rose-ash/lib/erlang/parser-core.sx
giles 99753580b4 Recover agent-loop progress: lua/prolog/forth/erlang/haskell phases 1-2
Salvaged from worktree-agent-* branches killed during sx-tree MCP outage:
- lua: tokenizer + parser + phase-2 transpile (~157 tests)
- prolog: tokenizer + parser + unification (72 tests, plan update lost to WIP)
- forth: phase-1 reader/interpreter + phase-2 colon/VARIABLE (134 tests)
- erlang: tokenizer + parser (114 tests)
- haskell: tokenizer + parse tests (43 tests)

Cherry-picked file contents only, not branch history, to avoid pulling in
unrelated ocaml-vm merge commits that were in those branches' bases.
2026-04-24 16:03:00 +00:00

50 lines
1.2 KiB
Plaintext

;; Core parser helpers — shared by er-parse-expr and er-parse-module.
;; Everything reads/mutates a parser state dict:
;; {:toks TOKS :idx INDEX}
(define er-state-make (fn (toks) {:idx 0 :toks toks}))
(define
er-peek
(fn
(st offset)
(let
((toks (get st :toks)) (idx (+ (get st :idx) offset)))
(if (< idx (len toks)) (nth toks idx) (nth toks (- (len toks) 1))))))
(define er-cur (fn (st) (er-peek st 0)))
(define er-cur-type (fn (st) (get (er-cur st) :type)))
(define er-cur-value (fn (st) (get (er-cur st) :value)))
(define er-advance! (fn (st) (dict-set! st :idx (+ (get st :idx) 1))))
(define er-at-eof? (fn (st) (= (er-cur-type st) "eof")))
(define
er-is?
(fn
(st type value)
(and
(= (er-cur-type st) type)
(or (= value nil) (= (er-cur-value st) value)))))
(define
er-expect!
(fn
(st type value)
(if
(er-is? st type value)
(let ((t (er-cur st))) (er-advance! st) t)
(error
(str
"Erlang parse: expected "
type
(if value (str " '" value "'") "")
" but got "
(er-cur-type st)
" '"
(er-cur-value st)
"' at pos "
(get (er-cur st) :pos))))))