Created
December 5, 2015 22:42
-
-
Save mhshams/e9660cf59ecb972b2de9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* ** 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