6c4344623b
The main HCL package is more visible this way, and so it's easier than having to pick it out from dozens of other package directories.
106 lines
2.9 KiB
Ragel
106 lines
2.9 KiB
Ragel
|
|
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
|
|
}
|