ocaml: phase 1 sequence operator ; (+10 tests, 123 total)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 53s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 53s
Two-phase grammar: parse-expr-no-seq (prior entry) + parse-expr wraps it with ;-chaining. List bodies keep parse-expr-no-seq so ; remains a separator inside [...]. Match clause bodies use the seq variant and stop at | — real OCaml semantics. Trailing ; before end/)/|/in/then/else/eof permitted.
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
;; let let x = e in body (no rec, function shorthand)
|
||||
;; let rec f x = e in body
|
||||
;; match match e with [|] p -> body | p -> body | ...
|
||||
;; sequence e1 ; e2 → (:seq e1 e2 …) (lowest-precedence binary)
|
||||
;;
|
||||
;; Pattern scope:
|
||||
;; _ (wildcard), int/string/char/bool literals, ident (var binding),
|
||||
@@ -30,6 +31,7 @@
|
||||
;; (:op OP LHS RHS)
|
||||
;; (:neg E) (:not E)
|
||||
;; (:tuple ITEMS) (:list ITEMS)
|
||||
;; (:seq EXPRS)
|
||||
;; (:if C T E)
|
||||
;; (:fun PARAMS BODY)
|
||||
;; (:let NAME PARAMS EXPR BODY) (:let-rec NAME PARAMS EXPR BODY)
|
||||
@@ -280,6 +282,7 @@
|
||||
(else lhs)))))
|
||||
(set! parse-pattern (fn () (parse-pattern-cons)))
|
||||
(define parse-expr (fn () nil))
|
||||
(define parse-expr-no-seq (fn () nil))
|
||||
(define parse-tuple (fn () nil))
|
||||
(define parse-binop-rhs (fn (lhs min-prec) lhs))
|
||||
(define parse-prefix (fn () nil))
|
||||
@@ -324,7 +327,7 @@
|
||||
(let
|
||||
((items (list)))
|
||||
(begin
|
||||
(append! items (parse-expr))
|
||||
(append! items (parse-expr-no-seq))
|
||||
(define
|
||||
loop
|
||||
(fn
|
||||
@@ -336,7 +339,7 @@
|
||||
(when
|
||||
(not (at-op? "]"))
|
||||
(begin
|
||||
(append! items (parse-expr))
|
||||
(append! items (parse-expr-no-seq))
|
||||
(loop)))))))
|
||||
(loop)
|
||||
(consume! "op" "]")
|
||||
@@ -521,17 +524,17 @@
|
||||
(fn
|
||||
()
|
||||
(let
|
||||
((cond-expr (parse-expr)))
|
||||
((cond-expr (parse-expr-no-seq)))
|
||||
(begin
|
||||
(consume! "keyword" "then")
|
||||
(let
|
||||
((then-expr (parse-expr)))
|
||||
((then-expr (parse-expr-no-seq)))
|
||||
(cond
|
||||
((at-kw? "else")
|
||||
(begin
|
||||
(advance-tok!)
|
||||
(let
|
||||
((else-expr (parse-expr)))
|
||||
((else-expr (parse-expr-no-seq)))
|
||||
(list :if cond-expr then-expr else-expr))))
|
||||
(else (list :if cond-expr then-expr (list :unit)))))))))
|
||||
(define
|
||||
@@ -539,7 +542,7 @@
|
||||
(fn
|
||||
()
|
||||
(let
|
||||
((scrut (parse-expr)))
|
||||
((scrut (parse-expr-no-seq)))
|
||||
(begin
|
||||
(consume! "keyword" "with")
|
||||
(when (at-op? "|") (advance-tok!))
|
||||
@@ -555,7 +558,7 @@
|
||||
(begin
|
||||
(consume! "op" "->")
|
||||
(let
|
||||
((body (parse-match-body)))
|
||||
((body (parse-expr)))
|
||||
(append! cases (list :case p body)))))))
|
||||
(one)
|
||||
(define
|
||||
@@ -567,9 +570,8 @@
|
||||
(begin (advance-tok!) (one) (loop)))))
|
||||
(loop)
|
||||
(cons :match (cons scrut (list cases)))))))))
|
||||
(define parse-match-body (fn () (parse-expr)))
|
||||
(set!
|
||||
parse-expr
|
||||
parse-expr-no-seq
|
||||
(fn
|
||||
()
|
||||
(cond
|
||||
@@ -578,6 +580,40 @@
|
||||
((at-kw? "if") (begin (advance-tok!) (parse-if)))
|
||||
((at-kw? "match") (begin (advance-tok!) (parse-match)))
|
||||
(else (parse-tuple)))))
|
||||
(set!
|
||||
parse-expr
|
||||
(fn
|
||||
()
|
||||
(let
|
||||
((lhs (parse-expr-no-seq)))
|
||||
(cond
|
||||
((at-op? ";")
|
||||
(let
|
||||
((items (list lhs)))
|
||||
(begin
|
||||
(define
|
||||
loop
|
||||
(fn
|
||||
()
|
||||
(when
|
||||
(at-op? ";")
|
||||
(begin
|
||||
(advance-tok!)
|
||||
(cond
|
||||
((at-kw? "end") nil)
|
||||
((at-op? ")") nil)
|
||||
((at-op? "|") nil)
|
||||
((at-kw? "in") nil)
|
||||
((at-kw? "then") nil)
|
||||
((at-kw? "else") nil)
|
||||
((= (ocaml-tok-type (peek-tok)) "eof") nil)
|
||||
(else
|
||||
(begin
|
||||
(append! items (parse-expr-no-seq))
|
||||
(loop))))))))
|
||||
(loop)
|
||||
(cons :seq items))))
|
||||
(else lhs)))))
|
||||
(let
|
||||
((result (parse-expr)))
|
||||
(begin
|
||||
|
||||
Reference in New Issue
Block a user