Added support for C++ raw string literals.

This commit is contained in:
Maikel Steneker
2019-05-10 15:30:41 +02:00
parent 6bb83a71dd
commit d73a5505c2

View File

@ -316,7 +316,65 @@ TOKEN :
| < STRING : <STRPREF>
"\"" ( ( ~["\"","\\","\r","\n"] ) | ( "\\" ( ~["\n","\r"] | "\n" | "\r\n" ) ) )* "\"" >
| < RSTRING : "R\"(" ( ~[")"] | ( ")" ~["\""] ) )* ")\"" >
}
// Raw C++11 string literal support
// https://en.cppreference.com/w/cpp/language/string_literal
TOKEN :
{
< RSTRING : <STRPREF> "R\"" >
{
StringBuffer sb = new StringBuffer(16);
// delim ------+
// vvv
// Matching R"...(...)..."
// ^
for (;;) {
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) { return; }
if (curChar == '(') break;
sb.append(curChar);
}
final String delim = sb.toString();
sb = new StringBuffer(256);
rstringbody:
// Matching R"...(...)..."
// ^
for (;;) {
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) { return; }
sb.append(curChar);
if (curChar == ')') {
// delim --------------+
// vvv
// Matching R"...(...)..."
// ^^^
for (int i = 0; i < delim.length(); i++) {
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) { return; }
if (delim.charAt(i) != curChar) {
input_stream.backup(1);
continue rstringbody;
}
sb.append(curChar);
}
// Matching R"...(...)..."
// ^
try { curChar = input_stream.readChar(); }
catch(java.io.IOException e) { return; }
if (curChar != '"') {
input_stream.backup(1);
continue rstringbody;
}
sb.append(curChar);
break;
}
}
// Setting final token image
matchedToken.image += delim + "(" + sb.toString();
}
}
TOKEN :