Skip to content

Instantly share code, notes, and snippets.

@citizenmatt
Created January 5, 2018 18:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save citizenmatt/8d8c2d8920f1235b2d3993588d2ee325 to your computer and use it in GitHub Desktop.
Save citizenmatt/8d8c2d8920f1235b2d3993588d2ee325 to your computer and use it in GitHub Desktop.
YAML Grammar
title
YAML Spec

  1. c-printable ::= ...
  2. nb-json ::= #x9 | [#x20-#x10FFFF]
  3. c-byte-order-mark ::= #xFEFF
  4. c-sequence-entry ::= -
  5. c-mapping-key ::= ?
  6. c-mapping-value ::= :
  7. c-collect-entry ::= ,
  8. c-sequence-start ::= [
  9. c-sequence-end ::= [
  10. c-mapping-start ::= {
  11. c-mapping-end ::= }
  12. c-comment ::= #
  13. c-anchor ::= &
  14. c-alias ::= *
  15. c-tag ::= !
  16. c-literal ::= |
  17. c-folded ::= |
  18. c-single-quoted ::= '
  19. c-double-quoted ::= '
  20. c-directive ::= %
  21. c-reserved ::= @ | BACKTICK
  22. c-indicator ::= [-?:,\[\]{}#&*!|>'"%@] | BACKTICK
  23. c-flow-indicator ::= [,\[\]{}]
  24. b-line-feed ::= #xA /* LF */
  25. b-carriage-return ::= #xD /* CR */
  26. b-char ::= b-line-feed | b-carriage-return
  27. nb-char ::= c-printable - b-char - [c-byte-order-mark]
  28. b-break ::= ( b-carriage-return b-line-feed) | b-carriage-return | b-line-feed
  29. b-as-line-feed ::= b-break
  30. b-non-content ::= b-break
  31. b-non-content ::=
  32. s-space ::= #x20 /* SP */
  33. s-tab ::= #x9 /* TAB */
  34. s-white ::= s-space | s-tab

63. s-indent(n) ::= s-space x n 66. s-separate-in-line ::= s-white+ | ^ 67. s-line-prefix ::= * c = block-out => s-block-line-prefix(n) * c = block-in => s-block-line-prefix(n) * c = flow-out => s-flow-line-prefix(n) * c = flow-in => s-flow-line-prefix(n) 68. s-block-line-prefix(n) ::= s-indent(n) 69. s-flow-line-prefix(n) ::= s-indent(n) s-separate-in-line?


80. s-separate(n, c) ::= * c = block-out => s-separate-lines(n) * c = block-in => s-separate-lines(n) * c = flow-out => s-separate-lines(n) * c = flow-in => s-separate-lines(n) * c = block-key => s-separate-in-line * c = flow-key => s-separate-in-line 81. s-separate-lines(n) ::= ( s-l-comments s-flow-line-prefix(n) ) | s-separate-in-line


89. c-tag-handle ::= c-named-tag-handle | c-secondary-tag-handle | c-primary-tag-handle 90. c-primary-tag-handle ::= ! 91. c-secondary-tag-handle ::= !! 92. c-named-tag-handle ::= ! ns-word-char+ !


96. c-ns-properties(n, c) ::= ( c-ns-tag-property ( s-separate(n, c) c-ns-anchor-property )? ) | ( c-ns-anchor-property ( s-separate(n, c) c-ns-tag-property )? ) 97. c-ns-tag-property ::= c-verbatim-tag | c-ns-shorthand-tag | c-non-specific-tag 98. c-verbatim-tag ::= !< ns-uri-char+ > 99. c-ns-shorthand-tag ::= c-tag-handle ns-tag-char+ 100. c-non-specific-tag ::= ! 101. c-ns-anchor-property ::= & ns-anchor-name 102. ns-anchor-char ::= ns-char - c-flow-indicator 103. ns-anchor-name ::= ns-anchor-char+ 104. c-ns-alias-node ::= * ns-anchor-name


137. c-flow-sequence(n, c) ::= [ s-separate(n, c)? ns-s-flow-seq-entries(n, in-flow(c))? ]


140. c-flow-mapping(n, c) ::= { s-separate(n, c)? [ns-s-flow-map-entries](#ns-s-flow-map-entries(n, in-flow(c))? }


154. ns-s-implicit-yaml-key(c) ::= ns-flow-yaml-node(n/a, c) s-separate-in-line? /* At most 1024 chars */ 155. c-s-implicit-json-key(c) ::= c-flow-json-node(n/a, c) s-separate-in-line? /* At most 1024 chars */ 156. ns-flow-yaml-content(n, c) ::= ns-plain(n, c) 157. c-flow-json-content(n, c) ::= c-flow-sequence(n, c) | c-flow-mapping(n, c) | c-single-quoted(n, c) | c-double-quoted(n, c) 158. ns-flow-content(n, c) ::= ns-flow-yaml-content(n, c) | c-flow-json-content(n, c) 159. ns-flow-yaml-node(n, c) ::= c-ns-alias-node | ns-flow-yaml-content(n, c) | ( c-ns-properties(n, c) ( ( s-separate(n, c) ns-flow-yaml-content(n, c) ) | e-scalar ) ) 160. c-flow-json-node(n, c) ::= ( c-ns-properties(n, c) s-separate(n, c) )? c-flow-json-content(n, c) 161. ns-flow-node(n, c) ::= c-ns-alias-node | ns-flow-content(n, c) | c-ns-properties(n, c) ( ( s-separate(n, c) ns-flow-content(n, c) ) | e-scalar ) )


165. b-chomped-last(t) ::= * t = strip => b-non-content | EOF t = clip => b-as-line-feed | EOF * t = keep => b-as-line-feed | EOF 166. l-chomped-empty(n, t) ::= * t = strip => l-strip-empty(n) * t = clip => l-strip-empty(n) * t = keep => l-keep-empty(n)


170. c-l+literal(n) ::= | c-b-block-header(m, t) l-literal-content(n+m, t) /* WHAT IS m?? / 171. l-nb-literal-text(n) ::= l-empty(n, block-in) s-indent(n) nb-char+ 172. b-nb-literal-next(n) ::= b-as-line-feed l-nb-literal-text(n) 173. l-literal-content(n, t) ::= ( l-nb-literal-text(n) b-nb-literal-next(n)* b-chomped-last(t) )? l-chomped-empty(n, t) 174. c-l+folded(n) ::= > c-b-block-header(m, t) l-literal-content(n+m, t) /* WHAT IS m?? */


183. l+block-sequence(n, c) ::= ( s-indent(n+m) c-l-block-seq-entry(n+m) )+ /* For some fixed auto-detected m > 0 */ 184. c-l-block-seq-entry(n) ::= - /* Not followed by an ns-char */ s-l+block-indented(n, block-in)


187. l+block-mapping(n) ::= ( s-indent(n+m) ns-l-block-map-entry(n+m) )+ 188. ns-l-block-map-entry(n) ::= c-l-block-map-explicit-entry(n) | ns-l-block-map-implicit-entry(n) 189. c-l-block-map-explicit-entry(n) ::= c-l-block-map-explicit-key(n) ( l-block-map-explicit-value(n) | e-node) 190. c-l-block-map-explicit-key(n) ::= ? s-l+block-indented(n, block-out) 191. l-block-map-explicit-value(n) ::= s-indent(n) : s-l+block-indented(n, block-out) 192. ns-l-block-map-implicit-entry(n) ::= ( ns-s-block-map-implicit-key | e-node) c-l-block-map-implicit-value 193. ns-s-block-map-implicit-key(n) ::= ( c-s-implicit-json-key(block-key) | ns-s-implicit-yaml-key(block-key) 194. c-l-block-map-implicit-value(n) ::= : ( s-l+block-node(n, block-out) | ( e-node s-l-comments ) )


196. s-l+block-node(n, c) ::= s-l+block-in-block(n, c) | s-l+flow-in-block(n)

  1. [197] s-l+flow-in-block(n) ::= s-separate(n+1, flow-out) ns-flow-node(n+1, flow-out) s-l-comments
  2. s-l+block-in-block(n, c) ::= s-l+block-scalar(n, c) | s-l+block-collection(n, c)
  3. s-l+block-scalar(n, c) ::= s-separate(n+1, c) ( c-ns-properties(n+1, c) s-separate(n+1, c) )? ( c-l+literal(n) | c-l+folded(n) )
  4. s-l+block-collection(n, c) ::= ( s-separate(n+1, c) c-ns-properties(n+1, c) )? s-l-comments ( l+block-sequence(seq-spaces(n, c)) | l+block-mapping(n) )
  5. [201] seq-spaces(n, c) ::=
    • c = block-out => n-1
    • c = block-in => n
  6. [202] l-document-prefix ::= c-byte-order-mark? l-comment*
  7. [203] c-directives-end ::= ---
  8. [204] c-document-end ::= ...
  9. [205] l-document-suffix ::= c-document-end s-l-comments
  10. [206] c-forbidden ::= ^ ( c-directives-end | c-document-end ) ( b-char | s-white | EOF )

207. l-bare-document ::= s-l+block-node(-1, block-in)

Firsts:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment