0001 import Foundation
0002
0003 enum TokenType| Parser.swift:31 | >>=- expect(TokenType.End, message: "expected end") |
| Parser.swift:57 | func peekType (context: Context) -> TokenType { |
| Parser.swift:85 | func expect (type: TokenType, message: String) -> Context -> Result<Context> { |
| Parser.swift:132 | >>=- expect(TokenType.Space, message: "expected space") |
| Parser.swift:229 | >>=- expect(TokenType.Dedent, message: "expected dedent") |
| Parser.swift:294 | >>=- expect(TokenType.OpenSB, message: "expected [") |
| Parser.swift:305 | >>=- (acc.count == 0 ? lift : expect(TokenType.Comma, message: "expected comma")) |
| Parser.swift:319 | >>=- expect(TokenType.OpenCB, message: "expected {") |
| Parser.swift:330 | >>=- (acc.count == 0 ? lift : expect(TokenType.Comma, message: "expected comma")) |
| Parser.swift:337 | >>=- expect(TokenType.Colon, message: "expected colon") |
| Parser.swift:359 | >>=- expect(TokenType.Indent, message: "expected indent after dash") |
| Parser.swift:366 | >>=- expect(TokenType.Dedent, message: "expected dedent after dash indent") |
| Parser.swift:396 | >>=- expect(TokenType.QuestionMark, message: "expected ?") |
| Parser.swift:422 | >>=- expect(TokenType.Colon, message: "expected colon") |
| Parser.swift:505 | >>=- expect(TokenType.String, message: "expected scalar block") |
| Tokenizer.swift:53 | typealias TokenPattern = (type: TokenType, pattern: NSRegularExpression) |
| Tokenizer.swift:54 | typealias TokenMatch = (type: TokenType, match: String) |
: Swift.String, CustomStringConvertible {
0004 case YamlDirective| Parser.swift:127 | case .YamlDirective: |
| Tokenizer.swift:72 | (.YamlDirective, regex("^%YAML(?= )")), |
= "%YAML"
0005 case DocStart| Parser.swift:136 | case .DocStart: |
| Tokenizer.swift:73 | (.DocStart, regex("^---")), |
= "doc-start"
0006 case DocEnd| Parser.swift:79 | if ![.Comment, .Space, .NewLine, .DocEnd].contains(peekType(context)) { |
| Tokenizer.swift:74 | (.DocEnd, regex("^\\.\\.\\.")), |
= "doc-end"
0007 case Comment| Parser.swift:72 | if ![.Comment, .Space, .NewLine].contains(peekType(context)) { |
| Parser.swift:79 | if ![.Comment, .Space, .NewLine, .DocEnd].contains(peekType(context)) { |
| Parser.swift:122 | case .Comment, .Space, .NewLine: |
| Parser.swift:149 | case .Comment, .Space, .NewLine: |
| Tokenizer.swift:75 | (.Comment, regex("^#.*|^\(bBreak) *(#.*)?(?=\(bBreak)|$)")), |
= "comment"
0008 case Space| Parser.swift:72 | if ![.Comment, .Space, .NewLine].contains(peekType(context)) { |
| Parser.swift:79 | if ![.Comment, .Space, .NewLine, .DocEnd].contains(peekType(context)) { |
| Parser.swift:122 | case .Comment, .Space, .NewLine: |
| Parser.swift:132 | >>=- expect(TokenType.Space, message: "expected space") |
| Parser.swift:149 | case .Comment, .Space, .NewLine: |
| Tokenizer.swift:76 | (.Space, regex("^ +")), |
= "space"
0009 case NewLine| Parser.swift:72 | if ![.Comment, .Space, .NewLine].contains(peekType(context)) { |
| Parser.swift:79 | if ![.Comment, .Space, .NewLine, .DocEnd].contains(peekType(context)) { |
| Parser.swift:122 | case .Comment, .Space, .NewLine: |
| Parser.swift:149 | case .Comment, .Space, .NewLine: |
| Tokenizer.swift:77 | (.NewLine, regex("^\(bBreak) *")), |
| Tokenizer.swift:131 | case .NewLine: |
| Tokenizer.swift:139 | matchList.append(TokenMatch(.NewLine, match)) |
| Tokenizer.swift:152 | matchList.append(TokenMatch(.NewLine, match)) |
| Tokenizer.swift:159 | matchList.append(TokenMatch(.NewLine, match)) |
= "newline"
0010 case Indent| Parser.swift:223 | case .Indent: |
| Parser.swift:359 | >>=- expect(TokenType.Indent, message: "expected indent after dash") |
| Tokenizer.swift:143 | matchList[matchList.endIndex - 1].type == .Indent { |
| Tokenizer.swift:145 | matchList[matchList.endIndex - 1] = TokenMatch(.Indent, match) |
| Tokenizer.swift:148 | matchList.append(TokenMatch(.Indent, match)) |
| Tokenizer.swift:169 | matchList.append(TokenMatch(.Indent, match.substringFromIndex(index))) |
| Tokenizer.swift:182 | matchList.append(TokenMatch(.Indent, "")) |
= "indent"
0011 case Dedent| Parser.swift:229 | >>=- expect(TokenType.Dedent, message: "expected dedent") |
| Parser.swift:248 | case .End, .Dedent: |
| Parser.swift:366 | >>=- expect(TokenType.Dedent, message: "expected dedent after dash indent") |
| Tokenizer.swift:157 | matchList.append(TokenMatch(.Dedent, "")) |
| Tokenizer.swift:255 | matchList.append((.Dedent, "")) |
= "dedent"
0012 case Null| Parser.swift:152 | case .Null: |
| Tokenizer.swift:79 | (.Null, regex("^(null|Null|NULL|~)\(finish)")), |
= "null"
0013 case True| Parser.swift:155 | case .True: |
| Tokenizer.swift:80 | (.True, regex("^(true|True|TRUE)\(finish)")), |
= "true"
0014 case False| Parser.swift:158 | case .False: |
| Tokenizer.swift:81 | (.False, regex("^(false|False|FALSE)\(finish)")), |
= "false"
0015 case InfinityP| Parser.swift:184 | case .InfinityP: |
| Tokenizer.swift:82 | (.InfinityP, regex("^\\+?\\.(inf|Inf|INF)\(finish)")), |
= "+infinity"
0016 case InfinityN| Parser.swift:187 | case .InfinityN: |
| Tokenizer.swift:83 | (.InfinityN, regex("^-\\.(inf|Inf|INF)\(finish)")), |
= "-infinity"
0017 case NaN| Parser.swift:190 | case .NaN: |
| Tokenizer.swift:84 | (.NaN, regex("^\\.(nan|NaN|NAN)\(finish)")), |
= "nan"
0018 case Double| Parser.swift:193 | case .Double: |
| Tokenizer.swift:89 | (.Double, regex("^[-+]?(\\.[0-9]+|[0-9]+(\\.[0-9]*)?)([eE][-+]?[0-9]+)?\(finish)")), |
= "double"
0019 case Int| Parser.swift:161 | case .Int: |
| Tokenizer.swift:85 | (.Int, regex("^[-+]?[0-9]+\(finish)")), |
= "int"
0020 case IntOct| Parser.swift:167 | case .IntOct: |
| Tokenizer.swift:86 | (.IntOct, regex("^0o[0-7]+\(finish)")), |
= "int-oct"
0021 case IntHex| Parser.swift:173 | case .IntHex: |
| Tokenizer.swift:87 | (.IntHex, regex("^0x[0-9a-fA-F]+\(finish)")), |
= "int-hex"
0022 case IntSex| Parser.swift:179 | case .IntSex: |
| Tokenizer.swift:88 | (.IntSex, regex("^[0-9]{2}(:[0-9]{2})+\(finish)")), |
= "int-sex"
0023 case Anchor| Parser.swift:232 | case .Anchor: |
| Tokenizer.swift:90 | (.Anchor, regex("^&\\w+")), |
= "&"
0024 case Alias| Parser.swift:240 | case .Alias: |
| Tokenizer.swift:91 | (.Alias, regex("^\\*\\w+")), |
= "*"
0025 case Comma| Parser.swift:305 | >>=- (acc.count == 0 ? lift : expect(TokenType.Comma, message: "expected comma")) |
| Parser.swift:330 | >>=- (acc.count == 0 ? lift : expect(TokenType.Comma, message: "expected comma")) |
| Tokenizer.swift:92 | (.Comma, regex("^,")), |
= ","
0026 case OpenSB| Parser.swift:200 | case .OpenSB: |
| Parser.swift:294 | >>=- expect(TokenType.OpenSB, message: "expected [") |
| Tokenizer.swift:93 | (.OpenSB, regex("^\\[")), |
| Tokenizer.swift:185 | case .OpenSB, .OpenCB: |
= "["
0027 case CloseSB| Parser.swift:300 | if peekType(context) == .CloseSB { |
| Tokenizer.swift:94 | (.CloseSB, regex("^\\]")), |
| Tokenizer.swift:189 | case .CloseSB, .CloseCB: |
= "]"
0028 case Dash| Parser.swift:197 | case .Dash: |
| Parser.swift:354 | if peekType(context) != .Dash { |
| Tokenizer.swift:78 | (.Dash, dashPattern), |
| Tokenizer.swift:162 | case .Dash, .QuestionMark: |
= "-"
0029 case OpenCB| Parser.swift:203 | case .OpenCB: |
| Parser.swift:319 | >>=- expect(TokenType.OpenCB, message: "expected {") |
| Tokenizer.swift:95 | (.OpenCB, regex("^\\{")), |
| Tokenizer.swift:185 | case .OpenSB, .OpenCB: |
= "{"
0030 case CloseCB| Parser.swift:325 | if peekType(context) == .CloseCB { |
| Tokenizer.swift:96 | (.CloseCB, regex("^\\}")), |
| Tokenizer.swift:189 | case .CloseSB, .CloseCB: |
= "}"
0031 case Key = "key"
0032 case KeyDQ = "key-dq"
0033 case KeySQ = "key-sq"
0034 case QuestionMark| Parser.swift:206 | case .QuestionMark: |
| Parser.swift:381 | case .QuestionMark: |
| Parser.swift:396 | >>=- expect(TokenType.QuestionMark, message: "expected ?") |
| Tokenizer.swift:97 | (.QuestionMark, regex("^\\?( +|(?=\(bBreak)))")), |
| Tokenizer.swift:162 | case .Dash, .QuestionMark: |
= "?"
0035 case ColonFO| Tokenizer.swift:98 | (.ColonFO, regex("^:(?!:)")), |
| Tokenizer.swift:171 | case .ColonFO: |
= ":-flow-out"
0036 case ColonFI| Tokenizer.swift:99 | (.ColonFI, regex("^:(?!:)")), |
| Tokenizer.swift:177 | case .ColonFI: |
= ":-flow-in"
0037 case Colon| Parser.swift:337 | >>=- expect(TokenType.Colon, message: "expected colon") |
| Parser.swift:414 | if peekType(context) != .Colon { |
| Parser.swift:422 | >>=- expect(TokenType.Colon, message: "expected colon") |
| Parser.swift:470 | return context.tokens[1].type != .Colon || matches(match, regex: regex("\n")) |
| Tokenizer.swift:179 | matchList.append(TokenMatch(.Colon, match)) |
= ":"
0038 case Literal| Parser.swift:212 | case .Literal: |
| Tokenizer.swift:100 | (.Literal, regex("^\\|.*")), |
| Tokenizer.swift:193 | case .Literal, .Folded: |
= "|"
0039 case Folded| Parser.swift:215 | case .Folded: |
| Tokenizer.swift:101 | (.Folded, regex("^>.*")), |
| Tokenizer.swift:193 | case .Literal, .Folded: |
= ">"
0040 case Reserved| Tokenizer.swift:102 | (.Reserved, regex("^[@`]")), |
| Tokenizer.swift:241 | case .Reserved: |
= "reserved"
0041 case StringDQ| Parser.swift:209 | case .StringDQ, .StringSQ, .String: |
| Parser.swift:384 | case .String, .StringDQ, .StringSQ: |
| Parser.swift:454 | case .StringDQ: |
| Tokenizer.swift:103 | (.StringDQ, regex("^\"([^\\\\\"]|\\\\(.|\(bBreak)))*\"")), |
= "string-dq"
0042 case StringSQ| Parser.swift:209 | case .StringDQ, .StringSQ, .String: |
| Parser.swift:384 | case .String, .StringDQ, .StringSQ: |
| Parser.swift:458 | case .StringSQ: |
| Tokenizer.swift:104 | (.StringSQ, regex("^'([^']|'')*'")), |
= "string-sq"
0043 case StringFI| Tokenizer.swift:106 | (.StringFI, regex("^\(plainInPattern)")), |
| Tokenizer.swift:235 | case .StringFI: |
= "string-flow-in"
0044 case StringFO| Tokenizer.swift:105 | (.StringFO, regex("^\(plainOutPattern)(?=:([ \\t]|\(bBreak))|\(bBreak)|$)")), |
| Tokenizer.swift:211 | case .StringFO: |
= "string-flow-out"
0045 case String| Parser.swift:209 | case .StringDQ, .StringSQ, .String: |
| Parser.swift:384 | case .String, .StringDQ, .StringSQ: |
| Parser.swift:449 | case .String: |
| Parser.swift:505 | >>=- expect(TokenType.String, message: "expected scalar block") |
| Tokenizer.swift:208 | matchList.append(TokenMatch(.String, block)) |
| Tokenizer.swift:232 | matchList.append(TokenMatch(.String, block)) |
| Tokenizer.swift:239 | matchList.append(TokenMatch(.String, match)) |
= "string"
0046 case End| Parser.swift:31 | >>=- expect(TokenType.End, message: "expected end") |
| Parser.swift:41 | if peekType(context) == .End { |
| Parser.swift:108 | if string.characters.count >= 50 || peekType(context) == .End { |
| Parser.swift:248 | case .End, .Dedent: |
| Tokenizer.swift:257 | matchList.append((.End, "")) |
= "end"
0047
0048 var description: Swift.String {
0049 return self.rawValue
0050 }
0051 }
0052
0053 typealias TokenPattern| Tokenizer.swift:71 | let tokenPatterns: [TokenPattern] = [ |
= (type: TokenType, pattern: NSRegularExpression)
0054 typealias TokenMatch| Parser.swift:4 | let tokens: [TokenMatch] |
| Parser.swift:7 | init (_ tokens: [TokenMatch], _ aliases: [String: Yaml] = [:]) { |
| Parser.swift:24 | func parseDoc (tokens: [TokenMatch]) -> Result<Yaml> { |
| Parser.swift:35 | func parseDocs (tokens: [TokenMatch]) -> Result<[Yaml]> { |
| Tokenizer.swift:118 | func tokenize (text: String) -> Result<[TokenMatch]> { |
| Tokenizer.swift:120 | var matchList: [TokenMatch] = [] |
= (type: TokenType, match: String)
0055
0056 let bBreak| Tokenizer.swift:66 | "([\(safeOut)]#|:(?![ \\t]|\(bBreak))|[\(safeOut)]|[ \\t])+" |
| Tokenizer.swift:68 | "([\(safeIn)]#|:(?![ \\t]|\(bBreak))|[\(safeIn)]|[ \\t]|\(bBreak))+" |
| Tokenizer.swift:68 | "([\(safeIn)]#|:(?![ \\t]|\(bBreak))|[\(safeIn)]|[ \\t]|\(bBreak))+" |
| Tokenizer.swift:69 | let dashPattern = regex("^-([ \\t]+(?!#|\(bBreak))|(?=[ \\t\\n]))") |
| Tokenizer.swift:70 | let finish = "(?= *(,|\\]|\\}|( #.*)?(\(bBreak)|$)))" |
| Tokenizer.swift:75 | (.Comment, regex("^#.*|^\(bBreak) *(#.*)?(?=\(bBreak)|$)")), |
| Tokenizer.swift:75 | (.Comment, regex("^#.*|^\(bBreak) *(#.*)?(?=\(bBreak)|$)")), |
| Tokenizer.swift:77 | (.NewLine, regex("^\(bBreak) *")), |
| Tokenizer.swift:97 | (.QuestionMark, regex("^\\?( +|(?=\(bBreak)))")), |
| Tokenizer.swift:103 | (.StringDQ, regex("^\"([^\\\\\"]|\\\\(.|\(bBreak)))*\"")), |
| Tokenizer.swift:105 | (.StringFO, regex("^\(plainOutPattern)(?=:([ \\t]|\(bBreak))|\(bBreak)|$)")), |
| Tokenizer.swift:105 | (.StringFO, regex("^\(plainOutPattern)(?=:([ \\t]|\(bBreak))|\(bBreak)|$)")), |
| Tokenizer.swift:198 | let blockPattern = regex(("^(\(bBreak) *)*(\(bBreak)" + |
| Tokenizer.swift:198 | let blockPattern = regex(("^(\(bBreak) *)*(\(bBreak)" + |
| Tokenizer.swift:199 | "( {\(minIndent),})[^ ].*(\(bBreak)( *|\\3.*))*)(?=\(bBreak)|$)")) |
| Tokenizer.swift:199 | "( {\(minIndent),})[^ ].*(\(bBreak)( *|\\3.*))*)(?=\(bBreak)|$)")) |
| Tokenizer.swift:203 | |> replace(regex("^\(bBreak)"), template: "") |
| Tokenizer.swift:205 | |> replace(regex("\(bBreak) {0,\(lastIndent)}"), template: "\n") |
| Tokenizer.swift:206 | ) + (matches(text, regex: regex("^\(bBreak)")) && lead.endIndex > lead.startIndex |
| Tokenizer.swift:216 | let blockPattern = regex(("^\(bBreak)( *| {\(indent),}" + |
| Tokenizer.swift:217 | "\(plainOutPattern))(?=\(bBreak)|$)")) |
| Tokenizer.swift:229 | replace(regex("^\(bBreak)[ \\t]*|[ \\t]+$"), template: "")(s) |
= "(?:\\r\\n|\\r|\\n)"
0057
0058 let safeIn| Tokenizer.swift:64 | let safeOut = "\\x2c\\x5b\\x5d\\x7b\\x7d" + safeIn |
| Tokenizer.swift:68 | "([\(safeIn)]#|:(?![ \\t]|\(bBreak))|[\(safeIn)]|[ \\t]|\(bBreak))+" |
| Tokenizer.swift:68 | "([\(safeIn)]#|:(?![ \\t]|\(bBreak))|[\(safeIn)]|[ \\t]|\(bBreak))+" |
= "\\x21\\x22\\x24-\\x2b\\x2d-\\x39\\x3b-\\x5a\\x5c\\x5e-\\x7a" +
0061 "\\x7c\\x7e\\x85\\xa0-\\ud7ff\\ue000-\\ufefe\\uff00\\ufffd" +
0062 "\\U00010000-\\U0010ffff"
0063 let safeOut| Tokenizer.swift:66 | "([\(safeOut)]#|:(?![ \\t]|\(bBreak))|[\(safeOut)]|[ \\t])+" |
| Tokenizer.swift:66 | "([\(safeOut)]#|:(?![ \\t]|\(bBreak))|[\(safeOut)]|[ \\t])+" |
= "\\x2c\\x5b\\x5d\\x7b\\x7d" + safeIn
0065 let plainOutPattern| Tokenizer.swift:105 | (.StringFO, regex("^\(plainOutPattern)(?=:([ \\t]|\(bBreak))|\(bBreak)|$)")), |
| Tokenizer.swift:217 | "\(plainOutPattern))(?=\(bBreak)|$)")) |
=
0066 "([\(safeOut)]#|:(?![ \\t]|\(bBreak))|[\(safeOut)]|[ \\t])+"
0067 let plainInPattern| Tokenizer.swift:106 | (.StringFI, regex("^\(plainInPattern)")), |
=
0068 "([\(safeIn)]#|:(?![ \\t]|\(bBreak))|[\(safeIn)]|[ \\t]|\(bBreak))+"
0069 let dashPattern| Tokenizer.swift:78 | (.Dash, dashPattern), |
| Tokenizer.swift:137 | matches(text |> substringFromIndex(rangeEnd), regex: dashPattern) |
= regex("^-([ \\t]+(?!#|\(bBreak))|(?=[ \\t\\n]))")
0070 let finish| Tokenizer.swift:79 | (.Null, regex("^(null|Null|NULL|~)\(finish)")), |
| Tokenizer.swift:80 | (.True, regex("^(true|True|TRUE)\(finish)")), |
| Tokenizer.swift:81 | (.False, regex("^(false|False|FALSE)\(finish)")), |
| Tokenizer.swift:82 | (.InfinityP, regex("^\\+?\\.(inf|Inf|INF)\(finish)")), |
| Tokenizer.swift:83 | (.InfinityN, regex("^-\\.(inf|Inf|INF)\(finish)")), |
| Tokenizer.swift:84 | (.NaN, regex("^\\.(nan|NaN|NAN)\(finish)")), |
| Tokenizer.swift:85 | (.Int, regex("^[-+]?[0-9]+\(finish)")), |
| Tokenizer.swift:86 | (.IntOct, regex("^0o[0-7]+\(finish)")), |
| Tokenizer.swift:87 | (.IntHex, regex("^0x[0-9a-fA-F]+\(finish)")), |
| Tokenizer.swift:88 | (.IntSex, regex("^[0-9]{2}(:[0-9]{2})+\(finish)")), |
| Tokenizer.swift:89 | (.Double, regex("^[-+]?(\\.[0-9]+|[0-9]+(\\.[0-9]*)?)([eE][-+]?[0-9]+)?\(finish)")), |
= "(?= *(,|\\]|\\}|( #.*)?(\(bBreak)|$)))"
0071 let tokenPatterns| Tokenizer.swift:125 | for tokenPattern in tokenPatterns { |
: [TokenPattern] = [
0072 (.YamlDirective, regex("^%YAML(?= )")),
0073 (.DocStart, regex("^---")),
0074 (.DocEnd, regex("^\\.\\.\\.")),
0075 (.Comment, regex("^#.*|^\(bBreak) *(#.*)?(?=\(bBreak)|$)")),
0076 (.Space, regex("^ +")),
0077 (.NewLine, regex("^\(bBreak) *")),
0078 (.Dash, dashPattern),
0079 (.Null, regex("^(null|Null|NULL|~)\(finish)")),
0080 (.True, regex("^(true|True|TRUE)\(finish)")),
0081 (.False, regex("^(false|False|FALSE)\(finish)")),
0082 (.InfinityP, regex("^\\+?\\.(inf|Inf|INF)\(finish)")),
0083 (.InfinityN, regex("^-\\.(inf|Inf|INF)\(finish)")),
0084 (.NaN, regex("^\\.(nan|NaN|NAN)\(finish)")),
0085 (.Int, regex("^[-+]?[0-9]+\(finish)")),
0086 (.IntOct, regex("^0o[0-7]+\(finish)")),
0087 (.IntHex, regex("^0x[0-9a-fA-F]+\(finish)")),
0088 (.IntSex, regex("^[0-9]{2}(:[0-9]{2})+\(finish)")),
0089 (.Double, regex("^[-+]?(\\.[0-9]+|[0-9]+(\\.[0-9]*)?)([eE][-+]?[0-9]+)?\(finish)")),
0090 (.Anchor, regex("^&\\w+")),
0091 (.Alias, regex("^\\*\\w+")),
0092 (.Comma, regex("^,")),
0093 (.OpenSB, regex("^\\[")),
0094 (.CloseSB, regex("^\\]")),
0095 (.OpenCB, regex("^\\{")),
0096 (.CloseCB, regex("^\\}")),
0097 (.QuestionMark, regex("^\\?( +|(?=\(bBreak)))")),
0098 (.ColonFO, regex("^:(?!:)")),
0099 (.ColonFI, regex("^:(?!:)")),
0100 (.Literal, regex("^\\|.*")),
0101 (.Folded, regex("^>.*")),
0102 (.Reserved, regex("^[@`]")),
0103 (.StringDQ, regex("^\"([^\\\\\"]|\\\\(.|\(bBreak)))*\"")),
0104 (.StringSQ, regex("^'([^']|'')*'")),
0105 (.StringFO, regex("^\(plainOutPattern)(?=:([ \\t]|\(bBreak))|\(bBreak)|$)")),
0106 (.StringFI, regex("^\(plainInPattern)")),
0107 ]
0108
0109 func escapeErrorContext| Parser.swift:102 | let text = recreateText("", context: context) |> escapeErrorContext |
| Tokenizer.swift:242 | return fail(escapeErrorContext(text)) |
| Tokenizer.swift:251 | return fail(escapeErrorContext(text)) |
(text: String) -> String {
0110 let endIndex = text.startIndex.advancedBy(50, limit: text.endIndex)
0111 let escaped = text.substringToIndex(endIndex)
0112 |> replace(regex("\\r"), template: "\\\\r")
0113 |> replace(regex("\\n"), template: "\\\\n")
0114 |> replace(regex("\""), template: "\\\\\"")
0115 return "near \"\(escaped)\""
0116 }
0117
0118 func tokenize| Yaml.swift:99 | return tokenize(text) >>=- parseDoc |
| Yaml.swift:103 | return tokenize(text) >>=- parseDocs |
| Yaml.swift:107 | let result = tokenize(text) |
| Yaml.swift:118 | let result = tokenize(text) |
(text: String) -> Result<[TokenMatch]> {
0119 var text = text
0120 var matchList: [TokenMatch] = []
0121 var indents = [0]
0122 var insideFlow = 0
0123 next:
0124 while text.endIndex > text.startIndex {
0125 for tokenPattern in tokenPatterns {
0126 let range = matchRange(text, regex: tokenPattern.pattern)
0127 if range.location != NSNotFound {
0128 let rangeEnd = range.location + range.length
0129 switch tokenPattern.type {
0130
0131 case .NewLine:
0132 let match = text |> substringWithRange(range)
0133 let lastIndent = indents.last ?? 0
0134 let rest = match.substringFromIndex(match.startIndex.successor())
0135 let spaces = rest.characters.count
0136 let nestedBlockSequence =
0137 matches(text |> substringFromIndex(rangeEnd), regex: dashPattern)
0138 if spaces == lastIndent {
0139 matchList.append(TokenMatch(.NewLine, match))
0140 } else if spaces > lastIndent {
0141 if insideFlow == 0 {
0142 if matchList.last != nil &&
0143 matchList[matchList.endIndex - 1].type == .Indent {
0144 indents[indents.endIndex - 1] = spaces
0145 matchList[matchList.endIndex - 1] = TokenMatch(.Indent, match)
0146 } else {
0147 indents.append(spaces)
0148 matchList.append(TokenMatch(.Indent, match))
0149 }
0150 }
0151 } else if nestedBlockSequence && spaces == lastIndent - 1 {
0152 matchList.append(TokenMatch(.NewLine, match))
0153 } else {
0154 while nestedBlockSequence && spaces < (indents.last ?? 0) - 1
0155 || !nestedBlockSequence && spaces < indents.last {
0156 indents.removeLast()
0157 matchList.append(TokenMatch(.Dedent, ""))
0158 }
0159 matchList.append(TokenMatch(.NewLine, match))
0160 }
0161
0162 case .Dash, .QuestionMark:
0163 let match = text |> substringWithRange(range)
0164 let index = match.startIndex.successor()
0165 let indent = match.characters.count
0166 indents.append((indents.last ?? 0) + indent)
0167 matchList.append(
0168 TokenMatch(tokenPattern.type, match.substringToIndex(index)))
0169 matchList.append(TokenMatch(.Indent, match.substringFromIndex(index)))
0170
0171 case .ColonFO:
0172 if insideFlow > 0 {
0173 continue
0174 }
0175 fallthrough
0176
0177 case .ColonFI:
0178 let match = text |> substringWithRange(range)
0179 matchList.append(TokenMatch(.Colon, match))
0180 if insideFlow == 0 {
0181 indents.append((indents.last ?? 0) + 1)
0182 matchList.append(TokenMatch(.Indent, ""))
0183 }
0184
0185 case .OpenSB, .OpenCB:
0186 insideFlow += 1
0187 matchList.append(TokenMatch(tokenPattern.type, text |> substringWithRange(range)))
0188
0189 case .CloseSB, .CloseCB:
0190 insideFlow -= 1
0191 matchList.append(TokenMatch(tokenPattern.type, text |> substringWithRange(range)))
0192
0193 case .Literal, .Folded:
0194 matchList.append(TokenMatch(tokenPattern.type, text |> substringWithRange(range)))
0195 text = text |> substringFromIndex(rangeEnd)
0196 let lastIndent = indents.last ?? 0
0197 let minIndent = 1 + lastIndent
0198 let blockPattern = regex(("^(\(bBreak) *)*(\(bBreak)" +
0199 "( {\(minIndent),})[^ ].*(\(bBreak)( *|\\3.*))*)(?=\(bBreak)|$)"))
0200 let (lead, rest) = text |> splitLead(blockPattern)
0201 text = rest
0202 let block = (lead
0203 |> replace(regex("^\(bBreak)"), template: "")
0204 |> replace(regex("^ {0,\(lastIndent)}"), template: "")
0205 |> replace(regex("\(bBreak) {0,\(lastIndent)}"), template: "\n")
0206 ) + (matches(text, regex: regex("^\(bBreak)")) && lead.endIndex > lead.startIndex
0207 ? "\n" : "")
0208 matchList.append(TokenMatch(.String, block))
0209 continue next
0210
0211 case .StringFO:
0212 if insideFlow > 0 {
0213 continue
0214 }
0215 let indent = (indents.last ?? 0)
0216 let blockPattern = regex(("^\(bBreak)( *| {\(indent),}" +
0217 "\(plainOutPattern))(?=\(bBreak)|$)"))
0218 var block = text
0219 |> substringWithRange(range)
0220 |> replace(regex("^[ \\t]+|[ \\t]+$"), template: "")
0221 text = text |> substringFromIndex(rangeEnd)
0222 while true {
0223 let range = matchRange(text, regex: blockPattern)
0224 if range.location == NSNotFound {
0225 break
0226 }
0227 let s = text |> substringWithRange(range)
0228 block += "\n" +
0229 replace(regex("^\(bBreak)[ \\t]*|[ \\t]+$"), template: "")(s)
0230 text = text |> substringFromIndex(range.location + range.length)
0231 }
0232 matchList.append(TokenMatch(.String, block))
0233 continue next
0234
0235 case .StringFI:
0236 let match = text
0237 |> substringWithRange(range)
0238 |> replace(regex("^[ \\t]|[ \\t]$"), template: "")
0239 matchList.append(TokenMatch(.String, match))
0240
0241 case .Reserved:
0242 return fail(escapeErrorContext(text))
0243
0244 default:
0245 matchList.append(TokenMatch(tokenPattern.type, text |> substringWithRange(range)))
0246 }
0247 text = text |> substringFromIndex(rangeEnd)
0248 continue next
0249 }
0250 }
0251 return fail(escapeErrorContext(text))
0252 }
0253 while indents.count > 1 {
0254 indents.removeLast()
0255 matchList.append((.Dedent, ""))
0256 }
0257 matchList.append((.End, ""))
0258 return lift(matchList)
0259 }
0260