Skip to content

Instantly share code, notes, and snippets.

@mhshams
Created December 5, 2015 22:42
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 mhshams/e9660cf59ecb972b2de9 to your computer and use it in GitHub Desktop.
Save mhshams/e9660cf59ecb972b2de9 to your computer and use it in GitHub Desktop.
/**
* ** Spec productions
*
* These are copied directly from the YAML specification, with some changes to adapt to Kotlin language syntax and
* also ease some of the decisions.
*
* See: http://www.yaml.org/spec/1.2/spec.html
*/
/**
* 5.1 Character Set
*/
/**
* [1] c-printable ::= #x9 | #xA | #xD | [#x20-#x7E] /* 8 bit */
* | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD] /* 16 bit */
* | [#x10000-#x10FFFF] /* 32 bit */
*
* */
val `c-printable` = of(0x9) or 0xA or 0xD or 0x20..0x7E or 0x85 or 0xA0..0xD7FF or 0xE000..0xFFFD or 0x10000..0x10FFFF
/**
* [2] nb-json ::= #x9 | [#x20-#x10FFFF]
*/
val `nb-json` = of(0x9) or 0x20..0x10FFFF
/**
* 5.2 Character Encodings
*/
/**
* [3] c-byte-order-mark ::= #xFEFF
*/
val `c-byte-order-mark` = bom(0xFEFF)
/**
* 5.3 Indicator Characters
*/
/**
* [4] c-sequence-entry ::= “-”
*/
val `c-sequence-entry` = indicator('-')
/**
* [5] c-mapping-key ::= “?”
*/
val `c-mapping-key` = indicator('?')
/**
* [6] c-mapping-value ::= “:”
*/
val `c-mapping-value` = indicator(':')
/**
* [7] c-collect-entry ::= “,”
*/
val `c-collect-entry` = indicator(',')
/**
* [8] c-sequence-start ::= “[”
*/
val `c-sequence-start` = indicator('[')
/**
* [9] c-sequence-end ::= “]”
*/
val `c-sequence-end` = indicator(']')
/**
* [10] c-mapping-start ::= “{”
*/
val `c-mapping-start` = indicator('{')
/**
* [11] c-mapping-end ::= “}”
*/
val `c-mapping-end` = indicator('}')
/**
* [12] c-comment ::= “#”
*/
val `c-comment` = indicator('#')
/**
* [13] c-anchor ::= “&”
*/
val `c-anchor` = indicator('&')
/**
* [14] c-alias ::= “*”
*/
val `c-alias` = indicator('*')
/**
* [15] c-tag ::= “!”
*/
val `c-tag` = indicator('!')
/**
* [16] c-literal ::= “|”
*/
val `c-literal` = indicator('|')
/**
* [17] c-folded ::= “>”
*/
val `c-folded` = indicator('>')
/**
* [18] c-single-quote ::= “'”
*/
val `c-single-quote` = indicator('\'')
/**
* [19] c-double-quote ::= “"”
*/
val `c-double-quote` = indicator('"')
/**
* [20] c-directive ::= “%”
*/
val `c-directive` = indicator('%')
/**
* [21] c-reserved ::= “@” | “`”
*/
val `c-reserved` = indicator('@' or '`')
/**
* [22] c-indicator ::= “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}”
* | “#” | “&” | “*” | “!” | “|” | “>” | “'” | “"”
* | “%” | “@” | “`”
*/
val `c-indicator` = `c-sequence-entry` or `c-mapping-key` or `c-mapping-value` or `c-collect-entry` or
`c-sequence-start` or `c-sequence-end` or `c-mapping-start` or `c-mapping-end` or `c-comment` or `c-anchor` or
`c-alias` or `c-tag` or `c-literal` or `c-folded` or `c-single-quote` or `c-double-quote` or `c-directive` or `c-reserved`
/**
* [23] c-flow-indicator ::= “,” | “[” | “]” | “{” | “}”
*/
val `c-flow-indicator` = `c-collect-entry` or `c-sequence-start` or `c-sequence-end` or `c-mapping-start` or `c-mapping-end`
/**
* 5.4 Line Break Characters
*/
/**
* [24] b-line-feed ::= #xA /* LF */
*/
val `b-line-feed` = of(0xA)
/**
* [25] b-carriage-return ::= #xD /* CR */
*/
val `b-carriage-return` = of(0xD)
/**
* [26] b-char ::= b-line-feed | b-carriage-return
*/
val `b-char` = `b-line-feed` or `b-carriage-return`
/**
* [27] nb-char ::= c-printable - b-char - c-byte-order-mark
*/
val `nb-char` = `c-printable` not `b-char` not `c-byte-order-mark`
/**
* [28] b-break ::= (b-carriage-return b-line-feed) /* DOS, Windows */
* | b-carriage-return /* MacOS upto 9.x */
* | b-line-feed /* UNIX, MacOS X */
*/
val `b-break` = ((`b-carriage-return` and `b-line-feed`) or `b-carriage-return` or `b-line-feed`) and nextLine()
/**
* [29] b-as-line-feed ::= b-break
*/
val `b-as-line-feed` = token(Code.LineFeed, `b-break`)
/**
* [30] b-non-content ::= b-break
*/
val `b-non-content` = token(Code.Break, `b-break`)
/**
* 5.5 White Space Characters
*/
/**
* [31] s-space ::= #x20 /* SP */
*/
val `s-space` = of(0x20)
/**
* [32] s-tab ::= #x9 /* TAB */
*/
val `s-tab` = of(0x9)
/**
* [33] s-white ::= s-space | s-tab
*/
val `s-white` = `s-space` or `s-tab`
/**
* [34] ns-char ::= nb-char - s-white
*/
val `ns-char` = `nb-char` not `s-white`
/**
* 5.6 Miscellaneous Characters
*/
/**
* [35] ns-dec-digit ::= [#x30-#x39] /* 0-9 */
*/
val `ns-dec-digit` = of(0x30..0x39)
/**
* [36] ns-hex-digit ::= ns-dec-digit
* | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */
*/
val `ns-hex-digit` = `ns-dec-digit` or 0x41..0x46 or 0x61..0x66
/**
* [37] ns-ascii-letter ::= [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */
*/
val `ns-ascii-letter` = 0x41..0x5A or 0x61..0x7A
/**
* [38] ns-word-char ::= ns-dec-digit | ns-ascii-letter | “-”
*/
val `ns-word-char` = `ns-dec-digit` or `ns-ascii-letter` or '-'
/**
* [39] ns-uri-char ::= “%” ns-hex-digit ns-hex-digit | ns-word-char | “#”
* | “;” | “/” | “?” | “:” | “@” | “&” | “=” | “+” | “$” | “,”
* | “_” | “.” | “!” | “~” | “*” | “'” | “(” | “)” | “[” | “]”
*/
val `ns-uri-char` = "escape" cho
('%' cmt "escape" and `ns-hex-digit` and `ns-hex-digit` or `ns-word-char` or '#' or
';' or '/' or '?' or ':' or '@' or '&' or '=' or '+' or '$' or ',' or
'_' or '.' or '!' or '~' or '*' or '\'' or '(' or ')' or '[' or ']')
/**
* [40] ns-tag-char ::= ns-uri-char - “!” - c-flow-indicator
*/
val `ns-tag-char` = `ns-uri-char` not `c-tag` not `c-flow-indicator`
/**
* 5.7 Escaped Characters
*/
/**
* [41] c-escape ::= “\”
*/
val `c-escape` = indicator('\\')
/**
* [42] ns-esc-null ::= “0”
*/
val `ns-esc-null` = meta('0')
/**
* [43] ns-esc-bell ::= “a”
*/
val `ns-esc-bell` = meta('a')
/**
* [44] ns-esc-backspace ::= “b”
*/
val `ns-esc-backspace` = meta('b')
/**
* [45] ns-esc-horizontal-tab ::= “t” | #x9
*/
val `ns-esc-horizontal-tab` = meta('t' or 0x9)
/**
* [46] ns-esc-line-feed ::= “n”
*/
val `ns-esc-line-feed` = meta('n')
/**
* [47] ns-esc-vertical-tab ::= “v”
*/
val `ns-esc-vertical-tab` = meta('v')
/**
* [48] ns-esc-form-feed ::= “f”
*/
val `ns-esc-form-feed` = meta('f')
/**
* [49] ns-esc-carriage-return ::= “r”
*/
val `ns-esc-carriage-return` = meta('r')
/**
* [50] ns-esc-escape ::= “e”
*/
val `ns-esc-escape` = meta('e')
/**
* [51] ns-esc-space ::= #x20
*/
val `ns-esc-space` = meta(0x20)
/**
* [52] ns-esc-double-quote ::= “"”
*/
val `ns-esc-double-quote` = meta('"')
/**
* [53] ns-esc-slash ::= “/”
*/
val `ns-esc-slash` = meta('/')
/**
* [54] ns-esc-backslash ::= “\”
*/
val `ns-esc-backslash` = meta('\\')
/**
* [55] ns-esc-next-line ::= “N”
*/
val `ns-esc-next-line` = meta('N')
/**
* [56] ns-esc-non-breaking-space ::= “_”
*/
val `ns-esc-non-breaking-space` = meta('_')
/**
* [57] ns-esc-line-separator ::= “L”
*/
val `ns-esc-line-separator` = meta('L')
/**
* [58] ns-esc-paragraph-separator ::= “P”
*/
val `ns-esc-paragraph-separator` = meta('P')
/**
* [59] ns-esc-8-bit ::= “x”
* ( ns-hex-digit × 2 )
*/
val `ns-esc-8-bit` = indicator('x') cmt "escaped" and meta(`ns-hex-digit` tms 2)
/**
* [60] ns-esc-16-bit ::= “u”
* ( ns-hex-digit × 4 )
*/
val `ns-esc-16-bit` = indicator('u') cmt "escaped" and meta(`ns-hex-digit` tms 4)
/**
* [61] ns-esc-32-bit ::= “U”
* ( ns-hex-digit × 8 )
*/
val `ns-esc-32-bit` = indicator('U') cmt "escaped" and meta(`ns-hex-digit` tms 8)
/**
* [62] c-ns-esc-char ::= “\”
* ( ns-esc-null | ns-esc-bell | ns-esc-backspace
* | ns-esc-horizontal-tab | ns-esc-line-feed
* | ns-esc-vertical-tab | ns-esc-form-feed
* | ns-esc-carriage-return | ns-esc-escape | ns-esc-space
* | ns-esc-double-quote | ns-esc-slash | ns-esc-backslash
* | ns-esc-next-line | ns-esc-non-breaking-space
* | ns-esc-line-separator | ns-esc-paragraph-separator
* | ns-esc-8-bit | ns-esc-16-bit | ns-esc-32-bit )
*/
val `c-ns-esc-char` = wrapTokens(Code.BeginEscape, Code.EndEscape,
`c-escape` cmt "escape" and ("escaped" cho (
`ns-esc-null` or `ns-esc-bell` or `ns-esc-backspace` or
`ns-esc-horizontal-tab` or `ns-esc-line-feed` or
`ns-esc-vertical-tab` or `ns-esc-form-feed` or
`ns-esc-carriage-return` or `ns-esc-escape` or `ns-esc-space` or
`ns-esc-double-quote` or `ns-esc-slash` or `ns-esc-backslash` or
`ns-esc-next-line` or `ns-esc-non-breaking-space` or
`ns-esc-line-separator` or `ns-esc-paragraph-separator` or
`ns-esc-8-bit` or `ns-esc-16-bit` or `ns-esc-32-bit`)))
/**
* 6.1 Indentation Spaces
*/
/**
* [63] s-indent(n) ::= s-space × n
*/
fun `s-indent`(n: Int) = token(Code.Indent, `s-space` tms n)
/**
* [64] s-indent(<n) ::= s-space × m /* Where m < n */
*/
fun `s-indent-lt`(n: Int) = token(Code.Indent, `s-space` lms n)
/**
* [65] s-indent(≤n) ::= s-space × m /* Where m ≤ n */
*/
fun `s-indent-le`(n: Int) = token(Code.Indent, `s-space` lms n + 1)
/**
* 6.2 Separation Spaces
*/
/**
* [66] s-separate-in-line ::= s-white+ | /* Start of line */
*/
val `s-separate-in-line` = token(Code.White, oom(`s-white`)) or sol()
/**
* 6.3 Line Prefixes
*/
/**
* [67] s-line-prefix(n,c) ::= 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)
*/
fun `s-line-prefix`(n: Int, c: Context) = when (c) {
Context.BlockOut -> `s-block-line-prefix`(n)
Context.BlockIn -> `s-block-line-prefix`(n)
Context.FlowOut -> `s-flow-line-prefix`(n)
Context.FlowIn -> `s-flow-line-prefix`(n)
else -> throw IllegalArgumentException("invalid context: $c")
}
/**
* [68] s-block-line-prefix(n) ::= s-indent(n)
*/
fun `s-block-line-prefix`(n: Int) = `s-indent`(n)
/**
* [69] s-flow-line-prefix(n) ::= s-indent(n) s-separate-in-line?
*/
fun `s-flow-line-prefix`(n: Int) = `s-indent`(n) and opt(`s-separate-in-line`)
/**
* 6.4 Empty Lines
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment