1 2package hclsyntax 3 4// This file is generated from scan_string_lit.rl. DO NOT EDIT. 5%%{ 6 # (except you are actually in scan_string_lit.rl here, so edit away!) 7 8 machine hclstrtok; 9 write data; 10}%% 11 12func scanStringLit(data []byte, quoted bool) [][]byte { 13 var ret [][]byte 14 15 %%{ 16 include UnicodeDerived "unicode_derived.rl"; 17 18 UTF8Cont = 0x80 .. 0xBF; 19 AnyUTF8 = ( 20 0x00..0x7F | 21 0xC0..0xDF . UTF8Cont | 22 0xE0..0xEF . UTF8Cont . UTF8Cont | 23 0xF0..0xF7 . UTF8Cont . UTF8Cont . UTF8Cont 24 ); 25 BadUTF8 = any - AnyUTF8; 26 27 Hex = ('0'..'9' | 'a'..'f' | 'A'..'F'); 28 29 # Our goal with this patterns is to capture user intent as best as 30 # possible, even if the input is invalid. The caller will then verify 31 # whether each token is valid and generate suitable error messages 32 # if not. 33 UnicodeEscapeShort = "\\u" . Hex{0,4}; 34 UnicodeEscapeLong = "\\U" . Hex{0,8}; 35 UnicodeEscape = (UnicodeEscapeShort | UnicodeEscapeLong); 36 SimpleEscape = "\\" . (AnyUTF8 - ('U'|'u'))?; 37 TemplateEscape = ("$" . ("$" . ("{"?))?) | ("%" . ("%" . ("{"?))?); 38 Newline = ("\r\n" | "\r" | "\n"); 39 40 action Begin { 41 // If te is behind p then we've skipped over some literal 42 // characters which we must now return. 43 if te < p { 44 ret = append(ret, data[te:p]) 45 } 46 ts = p; 47 } 48 action End { 49 te = p; 50 ret = append(ret, data[ts:te]); 51 } 52 53 QuotedToken = (UnicodeEscape | SimpleEscape | TemplateEscape | Newline) >Begin %End; 54 UnquotedToken = (TemplateEscape | Newline) >Begin %End; 55 QuotedLiteral = (any - ("\\" | "$" | "%" | "\r" | "\n")); 56 UnquotedLiteral = (any - ("$" | "%" | "\r" | "\n")); 57 58 quoted := (QuotedToken | QuotedLiteral)**; 59 unquoted := (UnquotedToken | UnquotedLiteral)**; 60 61 }%% 62 63 // Ragel state 64 p := 0 // "Pointer" into data 65 pe := len(data) // End-of-data "pointer" 66 ts := 0 67 te := 0 68 eof := pe 69 70 var cs int // current state 71 switch { 72 case quoted: 73 cs = hclstrtok_en_quoted 74 default: 75 cs = hclstrtok_en_unquoted 76 } 77 78 // Make Go compiler happy 79 _ = ts 80 _ = eof 81 82 /*token := func () { 83 ret = append(ret, data[ts:te]) 84 }*/ 85 86 %%{ 87 write init nocs; 88 write exec; 89 }%% 90 91 if te < p { 92 // Collect any leftover literal characters at the end of the input 93 ret = append(ret, data[te:p]) 94 } 95 96 // If we fall out here without being in a final state then we've 97 // encountered something that the scanner can't match, which should 98 // be impossible (the scanner matches all bytes _somehow_) but we'll 99 // tolerate it and let the caller deal with it. 100 if cs < hclstrtok_first_final { 101 ret = append(ret, data[p:len(data)]) 102 } 103 104 return ret 105} 106