ocaml: phase 1 match/with + pattern parser (+9 tests, 113 total)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 52s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 52s
Patterns: wildcard, literal, var, ctor (nullary + arg, flattens tuple args so Pair(a,b) -> (:pcon "Pair" PA PB)), tuple, list literal, cons :: (right-assoc), unit. Match: leading | optional, (:match SCRUT CLAUSES) with each clause (:case PAT BODY). Body parsed via parse-expr because | is below level-1 binop precedence.
This commit is contained in:
@@ -280,6 +280,26 @@ cat > "$TMPFILE" << 'EPOCHS'
|
||||
(epoch 278)
|
||||
(eval "(ocaml-parse-program \"\")")
|
||||
|
||||
;; ── Match / patterns ───────────────────────────────────────────
|
||||
(epoch 300)
|
||||
(eval "(ocaml-parse \"match x with | None -> 0 | Some y -> y\")")
|
||||
(epoch 301)
|
||||
(eval "(ocaml-parse \"match x with None -> 0 | Some y -> y\")")
|
||||
(epoch 302)
|
||||
(eval "(ocaml-parse \"match l with | [] -> 0 | h :: t -> 1\")")
|
||||
(epoch 303)
|
||||
(eval "(ocaml-parse \"match p with | (a, b) -> a + b\")")
|
||||
(epoch 304)
|
||||
(eval "(ocaml-parse \"match n with | 0 -> 1 | _ -> n\")")
|
||||
(epoch 305)
|
||||
(eval "(ocaml-parse \"match x with | true -> 1 | false -> 0\")")
|
||||
(epoch 306)
|
||||
(eval "(ocaml-parse \"match x with | Pair (a, b) -> a + b\")")
|
||||
(epoch 307)
|
||||
(eval "(ocaml-parse \"match x with | \\\"hi\\\" -> 1 | _ -> 0\")")
|
||||
(epoch 308)
|
||||
(eval "(ocaml-parse \"match x with | () -> 0\")")
|
||||
|
||||
EPOCHS
|
||||
|
||||
OUTPUT=$(timeout 60 "$SX_SERVER" < "$TMPFILE" 2>/dev/null)
|
||||
@@ -445,6 +465,17 @@ check 276 "program: mixed decls + expr" '("def" "y" () ("int" 2)) ("expr"'
|
||||
check 277 "program: 4 forms incl head" '4'
|
||||
check 278 "program: empty" '("program")'
|
||||
|
||||
# ── Match / patterns ────────────────────────────────────────────
|
||||
check 300 "match Some/None" '("match" ("var" "x") (("case" ("pcon" "None") ("int" 0)) ("case" ("pcon" "Some" ("pvar" "y")) ("var" "y")))'
|
||||
check 301 "match no leading bar" '("match" ("var" "x") (("case" ("pcon" "None") ("int" 0)) ("case" ("pcon" "Some"'
|
||||
check 302 "match list cons" '("case" ("plist") ("int" 0)) ("case" ("pcons" ("pvar" "h") ("pvar" "t")) ("int" 1))'
|
||||
check 303 "match tuple pat" '("ptuple" ("pvar" "a") ("pvar" "b"))'
|
||||
check 304 "match int + wildcard" '("case" ("plit" ("int" 0)) ("int" 1)) ("case" ("pwild")'
|
||||
check 305 "match bool literals" '("plit" ("bool" true))'
|
||||
check 306 "match ctor with tuple arg" '("pcon" "Pair" ("pvar" "a") ("pvar" "b"))'
|
||||
check 307 "match string literal" '("plit" ("string" "hi"))'
|
||||
check 308 "match unit pattern" '("plit" ("unit"))'
|
||||
|
||||
TOTAL=$((PASS + FAIL))
|
||||
if [ $FAIL -eq 0 ]; then
|
||||
echo "ok $PASS/$TOTAL OCaml-on-SX tests passed"
|
||||
|
||||
Reference in New Issue
Block a user