106 lines
2.9 KiB
Plaintext
106 lines
2.9 KiB
Plaintext
|
|
||
|
package hclsyntax
|
||
|
|
||
|
// This file is generated from scan_string_lit.rl. DO NOT EDIT.
|
||
|
%%{
|
||
|
# (except you are actually in scan_string_lit.rl here, so edit away!)
|
||
|
|
||
|
machine hclstrtok;
|
||
|
write data;
|
||
|
}%%
|
||
|
|
||
|
func scanStringLit(data []byte, quoted bool) [][]byte {
|
||
|
var ret [][]byte
|
||
|
|
||
|
%%{
|
||
|
include UnicodeDerived "unicode_derived.rl";
|
||
|
|
||
|
UTF8Cont = 0x80 .. 0xBF;
|
||
|
AnyUTF8 = (
|
||
|
0x00..0x7F |
|
||
|
0xC0..0xDF . UTF8Cont |
|
||
|
0xE0..0xEF . UTF8Cont . UTF8Cont |
|
||
|
0xF0..0xF7 . UTF8Cont . UTF8Cont . UTF8Cont
|
||
|
);
|
||
|
BadUTF8 = any - AnyUTF8;
|
||
|
|
||
|
Hex = ('0'..'9' | 'a'..'f' | 'A'..'F');
|
||
|
|
||
|
# Our goal with this patterns is to capture user intent as best as
|
||
|
# possible, even if the input is invalid. The caller will then verify
|
||
|
# whether each token is valid and generate suitable error messages
|
||
|
# if not.
|
||
|
UnicodeEscapeShort = "\\u" . Hex{0,4};
|
||
|
UnicodeEscapeLong = "\\U" . Hex{0,8};
|
||
|
UnicodeEscape = (UnicodeEscapeShort | UnicodeEscapeLong);
|
||
|
SimpleEscape = "\\" . (AnyUTF8 - ('U'|'u'))?;
|
||
|
TemplateEscape = ("$" . ("$" . ("{"?))?) | ("%" . ("%" . ("{"?))?);
|
||
|
Newline = ("\r\n" | "\r" | "\n");
|
||
|
|
||
|
action Begin {
|
||
|
// If te is behind p then we've skipped over some literal
|
||
|
// characters which we must now return.
|
||
|
if te < p {
|
||
|
ret = append(ret, data[te:p])
|
||
|
}
|
||
|
ts = p;
|
||
|
}
|
||
|
action End {
|
||
|
te = p;
|
||
|
ret = append(ret, data[ts:te]);
|
||
|
}
|
||
|
|
||
|
QuotedToken = (UnicodeEscape | SimpleEscape | TemplateEscape | Newline) >Begin %End;
|
||
|
UnquotedToken = (TemplateEscape | Newline) >Begin %End;
|
||
|
QuotedLiteral = (any - ("\\" | "$" | "%" | "\r" | "\n"));
|
||
|
UnquotedLiteral = (any - ("$" | "%" | "\r" | "\n"));
|
||
|
|
||
|
quoted := (QuotedToken | QuotedLiteral)**;
|
||
|
unquoted := (UnquotedToken | UnquotedLiteral)**;
|
||
|
|
||
|
}%%
|
||
|
|
||
|
// Ragel state
|
||
|
p := 0 // "Pointer" into data
|
||
|
pe := len(data) // End-of-data "pointer"
|
||
|
ts := 0
|
||
|
te := 0
|
||
|
eof := pe
|
||
|
|
||
|
var cs int // current state
|
||
|
switch {
|
||
|
case quoted:
|
||
|
cs = hclstrtok_en_quoted
|
||
|
default:
|
||
|
cs = hclstrtok_en_unquoted
|
||
|
}
|
||
|
|
||
|
// Make Go compiler happy
|
||
|
_ = ts
|
||
|
_ = eof
|
||
|
|
||
|
/*token := func () {
|
||
|
ret = append(ret, data[ts:te])
|
||
|
}*/
|
||
|
|
||
|
%%{
|
||
|
write init nocs;
|
||
|
write exec;
|
||
|
}%%
|
||
|
|
||
|
if te < p {
|
||
|
// Collect any leftover literal characters at the end of the input
|
||
|
ret = append(ret, data[te:p])
|
||
|
}
|
||
|
|
||
|
// If we fall out here without being in a final state then we've
|
||
|
// encountered something that the scanner can't match, which should
|
||
|
// be impossible (the scanner matches all bytes _somehow_) but we'll
|
||
|
// tolerate it and let the caller deal with it.
|
||
|
if cs < hclstrtok_first_final {
|
||
|
ret = append(ret, data[p:len(data)])
|
||
|
}
|
||
|
|
||
|
return ret
|
||
|
}
|