Step 18 (part 3): Expand parser — expressions, commands, features

Tokenizer:
  * and % now emit as operators (were silently swallowed)
  Added keywords: install, measure, behavior, called
  5 new arithmetic operator tests

Parser — expression layer:
  Arithmetic (+, -, *, /, %) via parse-arith
  Unary not, no, unary minus
  the X of Y possessive (parse-the-expr)
  as Type conversion, X in Y membership, array literals [...]
  fetch URL parsing fixed — no longer consumes "as" meant for fetch

Parser — 8 new commands:
  return, throw, append...to, tell...end, for...in...end,
  make a Type, install Behavior, measure

Parser — 2 new features:
  def name(params)...end, behavior Name(params)...end

Parser — enhanced:
  wait for event [from target], on every event modifier

33 new parser tests (16 suites), 5 tokenizer tests.
3043/3043 full build, zero regressions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-06 08:21:02 +00:00
parent 4cd0e77331
commit f1ba7177e7
4 changed files with 625 additions and 23 deletions

View File

@@ -185,6 +185,43 @@
(assert= "number" (get (hs-tok tokens 1) "type"))
(assert= "bracket-close" (get (hs-tok tokens 2) "type")))))
(defsuite
"hs-tokenize-arithmetic-ops"
(deftest
"multiply operator"
(let
((toks (hs-tokenize "4 * 5")))
(assert= "number" (get (nth toks 0) "type"))
(assert= "op" (get (nth toks 1) "type"))
(assert= "*" (get (nth toks 1) "value"))
(assert= "number" (get (nth toks 2) "type"))))
(deftest
"modulo operator"
(let
((toks (hs-tokenize "10 % 3")))
(assert= "op" (get (nth toks 1) "type"))
(assert= "%" (get (nth toks 1) "value"))))
(deftest
"star as style not operator"
(let
((toks (hs-tokenize "*color")))
(assert= "style" (get (nth toks 0) "type"))
(assert= "color" (get (nth toks 0) "value"))))
(deftest
"division operator"
(let
((toks (hs-tokenize "10 / 2")))
(assert= "op" (get (nth toks 1) "type"))
(assert= "/" (get (nth toks 1) "value"))))
(deftest
"mixed arithmetic"
(let
((toks (hs-tokenize "1 + 2 * 3")))
(assert= "op" (get (nth toks 1) "type"))
(assert= "+" (get (nth toks 1) "value"))
(assert= "op" (get (nth toks 3) "type"))
(assert= "*" (get (nth toks 3) "value")))))
(defsuite
"hs-tokenize-comments"
(deftest