branch: externals/yaml
commit 840be1b2b289522e9e5bc593e4f111867f48f3c1
Author: Zachary Romero <zacrom...@posteo.net>
Commit: Zachary Romero <zacrom...@posteo.net>

    | blocks parse, initial wip
---
 grammargen.bb |  17 +++++--
 yaml.el       | 141 +++++++++++++++++++++++++++++++++++++++++++---------------
 2 files changed, 117 insertions(+), 41 deletions(-)

diff --git a/grammargen.bb b/grammargen.bb
index 3f67d0bc52..3a5921fb6c 100755
--- a/grammargen.bb
+++ b/grammargen.bb
@@ -36,10 +36,14 @@
   (cond (= "<auto-detect-indent>" var-name)
         (list 'yaml--auto-detect-indent 'n)
 
+        (= "<end-of-stream>" var-name)
+        (list 'yaml--end-of-stream)
+
         (= "(match)" var-name)
         (list 'yaml--match)
 
-        (#{"in-flow" "flow-out" "flow-in" "block-key" "block-in" "block-out"} 
var-name)
+        (#{"in-flow" "flow-out" "flow-in" "block-key" "block-in" "block-out"
+           "clip" "keep" "strip"} var-name)
         var-name
 
         (> (count var-name) 2)
@@ -68,6 +72,8 @@
     (list 'length (gen-elisp-fn-arg (get m "(len)")))
     (get m "(ord)")
     (list 'yaml--ord (gen-elisp-lambda (list 'yaml--match))) ;; hack
+    (get m "(any)")
+    (concat (list 'yaml--any) (map gen-elisp-fn-arg (get m "(any)")))
 
     :else
     (let [[f args] (first m)]
@@ -177,9 +183,12 @@
     (get m "(max)")
     (list 'yaml--max (get m "(max)"))
 
-    (get m "(set)")
-    (let [[var-name val] (get m "(set)")]
-      (list 'yaml--set (symbol var-name) (gen-elisp-fn-arg val)))
+    (and (get m "(if)") (get m "(set)"))
+    (let [rule (get m "(if)")
+          [var-name val] (get m "(set)")]
+      (list 'when (gen-elisp-parse-expr rule)
+            (list 'yaml--set (symbol var-name) (gen-elisp-fn-arg val))
+            't))
 
     (get m "(case)")
     (let [case-params (get m "(case)")
diff --git a/yaml.el b/yaml.el
index 18e82000ee..24a8d7efe5 100644
--- a/yaml.el
+++ b/yaml.el
@@ -80,27 +80,34 @@ This flag is intended for development purposes.")
        :name nil :doc nil :lvl 0 :beg 0 :end 0 :m nil :tt nil)))
 
 (defun yaml-state-set-m (val)
-  "Set the current value of m to VAL."
-  (let* ((top-state (yaml--state-curr)))
-    (setcar yaml--states
-            (yaml-state-create :doc (yaml-state-doc top-state)
-                               :tt (yaml-state-tt top-state)
-                               :m val
-                               :name (yaml-state-name top-state)
-                               :lvl (yaml-state-lvl top-state)
-                               :beg (yaml-state-beg top-state)
-                               :end (yaml-state-end top-state)))))
+  "Set the current value of t to VAL."
+  (let* ((states yaml--states))
+    (while states
+      (let* ((top-state (car states))
+             (new-state (yaml-state-create :doc (yaml-state-doc top-state)
+                                           :tt (yaml-state-tt top-state)
+                                           :m val
+                                           :name (yaml-state-name top-state)
+                                           :lvl (yaml-state-lvl top-state)
+                                           :beg (yaml-state-beg top-state)
+                                           :end (yaml-state-end top-state))))
+        (setcar states new-state))
+      (setq states (cdr states)))))
+
 (defun yaml-state-set-t (val)
   "Set the current value of t to VAL."
-  (let* ((top-state (yaml--state-curr)))
-    (setcar yaml--states
-            (yaml-state-create :doc (yaml-state-doc top-state)
-                               :tt val
-                               :m (yaml-state-m top-state)
-                               :name (yaml-state-name top-state)
-                               :lvl (yaml-state-lvl top-state)
-                               :beg (yaml-state-beg top-state)
-                               :end (yaml-state-end top-state)))))
+  (let* ((states yaml--states))
+    (while states
+      (let* ((top-state (car states))
+             (new-state (yaml-state-create :doc (yaml-state-doc top-state)
+                                           :tt val
+                                           :m (yaml-state-m top-state)
+                                           :name (yaml-state-name top-state)
+                                           :lvl (yaml-state-lvl top-state)
+                                           :beg (yaml-state-beg top-state)
+                                           :end (yaml-state-end top-state))))
+        (setcar states new-state))
+      (setq states (cdr states)))))
 
 (defun yaml--state-doc ()
   "Return the doc property of current state."
@@ -643,7 +650,8 @@ This flag is intended for development purposes.")
             (let ((beg (yaml-state-beg top-state))
                   (end (yaml-state-end top-state)))
               (setq res (substring yaml--parsing-input beg end)))
-          (setq states (cdr states)))))))
+          (setq states (cdr states)))))
+    res))
 
 (defun yaml--auto-detect-indent (n)
   "Detect the indentation given N."
@@ -835,8 +843,10 @@ Rules for this function are defined by the yaml-spec JSON 
file."
    ((eq state 'c-indentation-indicator)
     (let ((m (nth 0 args)))
       (yaml--frame "c-indentation-indicator"
-        (yaml--any (yaml--set m (yaml--ord (lambda () (yaml--match))))
-                   (yaml--set m (yaml--parse-from-grammar 'auto-detect))))))
+        (yaml--any (when (yaml--parse-from-grammar 'ns-dec-digit)
+                     (yaml--set m (yaml--ord (lambda () (yaml--match)))) t)
+                   (when (yaml--empty)
+                     (yaml--set m (yaml--parse-from-grammar 'auto-detect)) 
t)))))
 
    ((eq state 'ns-reserved-directive)
     (let ()
@@ -927,12 +937,15 @@ Rules for this function are defined by the yaml-spec JSON 
file."
                    (yaml--chr ?\%)
                    (yaml--chr ?\@)
                    (yaml--chr ?\`)))))
+
    ((eq state 'c-l+literal)
     (let ((n (nth 0 args)))
       (yaml--frame "c-l+literal"
-        (yaml--all (yaml--chr ?\|)
-                   (yaml--parse-from-grammar 'c-b-block-header (yaml--state-m) 
(yaml--state-t))
-                   (yaml--parse-from-grammar 'l-literal-content (+ n 
(yaml--state-m)) (yaml--state-t))))))
+        (progn
+          (message "c-l+literal: %s" (yaml--state-t))
+          (yaml--all (yaml--chr ?\|)
+                     (yaml--parse-from-grammar 'c-b-block-header 
(yaml--state-m) (yaml--state-t))
+                     (yaml--parse-from-grammar 'l-literal-content (+ n 
(yaml--state-m)) (yaml--state-t)))))))
 
    ((eq state 'c-single-quoted)
     (let ((n (nth 0 args))
@@ -1035,7 +1048,6 @@ Rules for this function are defined by the yaml-spec JSON 
file."
    ((eq state 'ns-plain)
     (let ((n (nth 0 args))
           (c (nth 1 args)))
-      (message "DEBUG: %s %s" n c)
       (yaml--frame "ns-plain"
         (cond
          ((equal c "block-key") (yaml--parse-from-grammar 'ns-plain-one-line 
c))
@@ -1082,7 +1094,15 @@ Rules for this function are defined by the yaml-spec 
JSON file."
         (yaml--but (lambda () (yaml--parse-from-grammar 'ns-char))
                    (lambda () (yaml--parse-from-grammar 'c-flow-indicator))))))
 
-   ((eq state 's-l+block-scalar) (let ((n (nth 0 args)) (c (nth 1 args))) 
(yaml--frame "s-l+block-scalar" (yaml--all (yaml--parse-from-grammar 
's-separate (+ n 1) c) (yaml--rep 0 1 (lambda () (yaml--all 
(yaml--parse-from-grammar 'c-ns-properties (+ n 1) c) (yaml--parse-from-grammar 
's-separate (+ n 1) c)))) (yaml--any (yaml--parse-from-grammar 'c-l+literal n) 
(yaml--parse-from-grammar 'c-l+folded n))))))
+   ((eq state 's-l+block-scalar)
+    (let ((n (nth 0 args)) (c (nth 1 args)))
+      (yaml--frame "s-l+block-scalar"
+        (yaml--all (yaml--parse-from-grammar 's-separate (+ n 1) c)
+                   (yaml--rep 0 1 (lambda ()
+                                    (yaml--all (yaml--parse-from-grammar 
'c-ns-properties (+ n 1) c)
+                                               (yaml--parse-from-grammar 
's-separate (+ n 1) c))))
+                   (yaml--any (yaml--parse-from-grammar 'c-l+literal n)
+                              (yaml--parse-from-grammar 'c-l+folded n))))))
 
    ((eq state 'ns-plain-safe-in)
     (let ()
@@ -1109,11 +1129,11 @@ Rules for this function are defined by the yaml-spec 
JSON file."
 
    ((eq state 'l-chomped-empty)
     (let ((n (nth 0 args))
-          (t (nth 1 args)))
+          (tt (nth 1 args)))
       (yaml--frame "l-chomped-empty"
-        (cond ((equal t "clip") (yaml--parse-from-grammar 'l-strip-empty n))
-              ((equal t "keep") (yaml--parse-from-grammar 'l-keep-empty n))
-              ((equal t "strip") (yaml--parse-from-grammar 'l-strip-empty 
n))))))
+        (cond ((equal tt "clip") (yaml--parse-from-grammar 'l-strip-empty n))
+              ((equal tt "keep") (yaml--parse-from-grammar 'l-keep-empty n))
+              ((equal tt "strip") (yaml--parse-from-grammar 'l-strip-empty 
n))))))
 
    ((eq state 'c-s-implicit-json-key)
     (let ((c (nth 0 args)))
@@ -1159,14 +1179,28 @@ Rules for this function are defined by the yaml-spec 
JSON file."
         (yaml--all (yaml--exclude "c-forbidden")
                    (yaml--parse-from-grammar 's-l+block-node -1 "block-in")))))
 
-   ((eq state 'b-chomped-last) (let ((t (nth 0 args))) (yaml--frame 
"b-chomped-last" (cond ((equal t "clip") (yaml--parse-from-grammar '(any) 
(yaml--parse-from-grammar 'b-as-line-feed) (yaml--parse-from-grammar 
'<end-of-stream>))) ((equal t "keep") (yaml--parse-from-grammar '(any) 
(yaml--parse-from-grammar 'b-as-line-feed) (yaml--parse-from-grammar 
'<end-of-stream>))) ((equal t "strip") (yaml--parse-from-grammar '(any) 
(yaml--parse-from-grammar 'b-non-content) (yaml--parse-from-grammar ' [...]
+   ;; TODO: don't use the symbol t as a variable.
+   ((eq state 'b-chomped-last)
+    (let ((tt (nth 0 args)))
+      (message "b-chomped-last: %s" tt)
+      (yaml--frame "b-chomped-last"
+        (cond ((equal tt "clip")
+               ;; TODO: Fix this
+               (yaml--any (yaml--parse-from-grammar 'b-as-line-feed)
+                          (yaml--end-of-stream)))
+              ((equal tt "keep")
+               (yaml--any (yaml--parse-from-grammar 'b-as-line-feed)
+                          (yaml--end-of-stream)))
+              ((equal tt "strip")
+               (yaml--any (yaml--parse-from-grammar 'b-non-content)
+                          (yaml--end-of-stream)))))))
+
    ((eq state 'l-trail-comments) (let ((n (nth 0 args))) (yaml--frame 
"l-trail-comments" (yaml--all (yaml--parse-from-grammar 's-indent-lt n) 
(yaml--parse-from-grammar 'c-nb-comment-text) (yaml--parse-from-grammar 
'b-comment) (yaml--rep2 0 nil (lambda () (yaml--parse-from-grammar 
'l-comment)))))))
    ((eq state 'ns-flow-map-yaml-key-entry) (let ((n (nth 0 args)) (c (nth 1 
args))) (yaml--frame "ns-flow-map-yaml-key-entry" (yaml--all 
(yaml--parse-from-grammar 'ns-flow-yaml-node n c) (yaml--any (yaml--all 
(yaml--rep 0 1 (lambda () (yaml--parse-from-grammar 's-separate n c))) 
(yaml--parse-from-grammar 'c-ns-flow-map-separate-value n c)) 
(yaml--parse-from-grammar 'e-node))))))
    ((eq state 's-indent) (let ((n (nth 0 args))) (yaml--frame "s-indent" 
(yaml--rep n n (lambda () (yaml--parse-from-grammar 's-space))))))
    ((eq state 'ns-esc-line-separator) (let () (yaml--frame 
"ns-esc-line-separator" (yaml--chr ?\L))))
    ((eq state 'ns-flow-yaml-node)
     (let ((n (nth 0 args)) (c (nth 1 args)))
-      (message "ns-flow-yaml-node: %s %s" n c)
       (yaml--frame "ns-flow-yaml-node"
         (yaml--any (yaml--parse-from-grammar 'c-ns-alias-node)
                    (yaml--parse-from-grammar 'ns-flow-yaml-content n c)
@@ -1180,7 +1214,14 @@ Rules for this function are defined by the yaml-spec 
JSON file."
    ((eq state 'c-directives-end) (let () (yaml--frame "c-directives-end" 
(yaml--all (yaml--chr ?\-) (yaml--chr ?\-) (yaml--chr ?\-)))))
    ((eq state 's-double-break) (let ((n (nth 0 args))) (yaml--frame 
"s-double-break" (yaml--any (yaml--parse-from-grammar 's-double-escaped n) 
(yaml--parse-from-grammar 's-flow-folded n)))))
    ((eq state 's-nb-spaced-text) (let ((n (nth 0 args))) (yaml--frame 
"s-nb-spaced-text" (yaml--all (yaml--parse-from-grammar 's-indent n) 
(yaml--parse-from-grammar 's-white) (yaml--rep2 0 nil (lambda () 
(yaml--parse-from-grammar 'nb-char)))))))
-   ((eq state 'l-folded-content) (let ((n (nth 0 args)) (t (nth 1 args))) 
(yaml--frame "l-folded-content" (yaml--all (yaml--rep 0 1 (lambda () (yaml--all 
(yaml--parse-from-grammar 'l-nb-diff-lines n) (yaml--parse-from-grammar 
'b-chomped-last t)))) (yaml--parse-from-grammar 'l-chomped-empty n t))))) ;; 
TODO: don't use yaml--state-t here
+   ((eq state 'l-folded-content)
+    (let ((n (nth 0 args))
+          (tt (nth 1 args)))
+      (yaml--frame "l-folded-content"
+        (yaml--all (yaml--rep 0 1 (lambda ()
+                                    (yaml--all (yaml--parse-from-grammar 
'l-nb-diff-lines n)
+                                               (yaml--parse-from-grammar 
'b-chomped-last tt))))
+                   (yaml--parse-from-grammar 'l-chomped-empty n tt))))) ;; 
TODO: don't use yaml--state-t here
    ((eq state 'nb-ns-plain-in-line) (let ((c (nth 0 args))) (yaml--frame 
"nb-ns-plain-in-line" (yaml--rep2 0 nil (lambda () (yaml--all (yaml--rep2 0 nil 
(lambda () (yaml--parse-from-grammar 's-white))) (yaml--parse-from-grammar 
'ns-plain-char c)))))))
    ((eq state 'nb-single-multi-line) (let ((n (nth 0 args))) (yaml--frame 
"nb-single-multi-line" (yaml--all (yaml--parse-from-grammar 
'nb-ns-single-in-line) (yaml--any (yaml--parse-from-grammar 's-single-next-line 
n) (yaml--rep2 0 nil (lambda () (yaml--parse-from-grammar 's-white))))))))
    ((eq state 'l-document-suffix) (let () (yaml--frame "l-document-suffix" 
(yaml--all (yaml--parse-from-grammar 'c-document-end) (yaml--parse-from-grammar 
's-l-comments)))))
@@ -1208,7 +1249,12 @@ Rules for this function are defined by the yaml-spec 
JSON file."
                               (yaml--parse-from-grammar 'l+block-mapping 
n))))))
 
    ((eq state 'c-quoted-quote) (let () (yaml--frame "c-quoted-quote" 
(yaml--all (yaml--chr ?\') (yaml--chr ?\')))))
-   ((eq state 'l+block-sequence) (let ((n (nth 0 args))) (yaml--frame 
"l+block-sequence" (yaml--all (yaml--set m (yaml--auto-detect-indent n)) 
(yaml--rep 1 nil (lambda () (yaml--all (yaml--parse-from-grammar 's-indent (+ n 
(yaml--state-m))) (yaml--parse-from-grammar 'c-l-block-seq-entry (+ n 
(yaml--state-m))))))))))
+   ((eq state 'l+block-sequence)
+    (let ((n (nth 0 args)))
+      (yaml--frame "l+block-sequence"
+        (yaml--all (yaml--set m (yaml--auto-detect-indent n))
+                   (yaml--rep 1 nil (lambda () (yaml--all 
(yaml--parse-from-grammar 's-indent (+ n (yaml--state-m))) 
(yaml--parse-from-grammar 'c-l-block-seq-entry (+ n (yaml--state-m))))))))))
+
    ((eq state 'c-double-quote) (let () (yaml--frame "c-double-quote" 
(yaml--chr ?\"))))
    ((eq state 'ns-esc-backspace) (let () (yaml--frame "ns-esc-backspace" 
(yaml--chr ?\b))))
    ((eq state 'c-flow-json-content) (let ((n (nth 0 args)) (c (nth 1 args))) 
(yaml--frame "c-flow-json-content" (yaml--any (yaml--parse-from-grammar 
'c-flow-sequence n c) (yaml--parse-from-grammar 'c-flow-mapping n c) 
(yaml--parse-from-grammar 'c-single-quoted n c) (yaml--parse-from-grammar 
'c-double-quoted n c)))))
@@ -1240,10 +1286,31 @@ Rules for this function are defined by the yaml-spec 
JSON file."
    ((eq state 'c-l-block-seq-entry) (let ((n (nth 0 args))) (yaml--frame 
"c-l-block-seq-entry" (yaml--all (yaml--chr ?\-) (yaml--chk "!" 
(yaml--parse-from-grammar 'ns-char)) (yaml--parse-from-grammar 
's-l+block-indented n "block-in")))))
    ((eq state 'c-ns-properties) (let ((n (nth 0 args)) (c (nth 1 args))) 
(yaml--frame "c-ns-properties" (yaml--any (yaml--all (yaml--parse-from-grammar 
'c-ns-tag-property) (yaml--rep 0 1 (lambda () (yaml--all 
(yaml--parse-from-grammar 's-separate n c) (yaml--parse-from-grammar 
'c-ns-anchor-property))))) (yaml--all (yaml--parse-from-grammar 
'c-ns-anchor-property) (yaml--rep 0 1 (lambda () (yaml--all 
(yaml--parse-from-grammar 's-separate n c) (yaml--parse-from-grammar 
'c-ns-tag-property)))))))))
    ((eq state 'ns-directive-parameter) (let () (yaml--frame 
"ns-directive-parameter" (yaml--rep 1 nil (lambda () (yaml--parse-from-grammar 
'ns-char))))))
-   ((eq state 'c-chomping-indicator) (let ((t (nth 0 args))) (yaml--frame 
"c-chomping-indicator" (yaml--any (yaml--set t (yaml--parse-from-grammar 
'strip)) (yaml--set t (yaml--parse-from-grammar 'keep)) (yaml--set t 
(yaml--parse-from-grammar 'clip))))))
+
+   ((eq state 'c-chomping-indicator)
+    (let ()
+      (yaml--frame "c-chomping-indicator"
+        (prog1
+            (yaml--any (when (yaml--chr ?\-) (yaml--set t "strip") t)
+                       (when (yaml--chr ?\+) (yaml--set t "keep") t)
+                       (when (yaml--empty) (yaml--set t "clip") t))
+          (message "c-chomping-indicator: %s" (yaml--state-t))))))
+
    ((eq state 'ns-global-tag-prefix) (let () (yaml--frame 
"ns-global-tag-prefix" (yaml--all (yaml--parse-from-grammar 'ns-tag-char) 
(yaml--rep2 0 nil (lambda () (yaml--parse-from-grammar 'ns-uri-char)))))))
    ((eq state 'c-ns-flow-pair-json-key-entry) (let ((n (nth 0 args)) (c (nth 1 
args))) (yaml--frame "c-ns-flow-pair-json-key-entry" (yaml--all 
(yaml--parse-from-grammar 'c-s-implicit-json-key (yaml--parse-from-grammar 
'flow-key)) (yaml--parse-from-grammar 'c-ns-flow-map-adjacent-value n c)))))
-   ((eq state 'l-literal-content) (let ((n (nth 0 args)) (t (nth 1 args))) 
(yaml--frame "l-literal-content" (yaml--all (yaml--rep 0 1 (lambda () 
(yaml--all (yaml--parse-from-grammar 'l-nb-literal-text n) (yaml--rep2 0 nil 
(lambda () (yaml--parse-from-grammar 'b-nb-literal-next n))) 
(yaml--parse-from-grammar 'b-chomped-last t)))) (yaml--parse-from-grammar 
'l-chomped-empty n t)))))
+
+   ((eq state 'l-literal-content)
+    (let ((n (nth 0 args))
+          (tt (nth 1 args)))
+      (yaml--frame "l-literal-content"
+        (progn
+          (message "l-literal-content: %s" tt)
+          (yaml--all (yaml--rep 0 1
+                                (lambda () (yaml--all 
(yaml--parse-from-grammar 'l-nb-literal-text n)
+                                                      (yaml--rep2 0 nil 
(lambda () (yaml--parse-from-grammar 'b-nb-literal-next n)))
+                                                      
(yaml--parse-from-grammar 'b-chomped-last tt))))
+                     (yaml--parse-from-grammar 'l-chomped-empty n tt))))))
+
    ((eq state 'c-document-end) (let () (yaml--frame "c-document-end" 
(yaml--all (yaml--chr ?\.) (yaml--chr ?\.) (yaml--chr ?\.)))))
    ((eq state 'nb-double-text) (let ((n (nth 0 args)) (c (nth 1 args))) 
(yaml--frame "nb-double-text" (cond ((equal c "block-key") 
(yaml--parse-from-grammar 'nb-double-one-line)) ((equal c "flow-in") 
(yaml--parse-from-grammar 'nb-double-multi-line n)) ((equal c "flow-key") 
(yaml--parse-from-grammar 'nb-double-one-line)) ((equal c "flow-out") 
(yaml--parse-from-grammar 'nb-double-multi-line n))))))
    ((eq state 's-b-comment) (let () (yaml--frame "s-b-comment" (yaml--all 
(yaml--rep 0 1 (lambda () (yaml--all (yaml--parse-from-grammar 
's-separate-in-line) (yaml--rep 0 1 (lambda () (yaml--parse-from-grammar 
'c-nb-comment-text)))))) (yaml--parse-from-grammar 'b-comment)))))

Reply via email to