From d73a5505c27f0471b80d988fc57a68a9e5cee8a0 Mon Sep 17 00:00:00 2001 From: Maikel Steneker Date: Fri, 10 May 2019 15:30:41 +0200 Subject: [PATCH] Added support for C++ raw string literals. --- pmd-cpp/etc/grammar/cpp.jj | 60 +++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/pmd-cpp/etc/grammar/cpp.jj b/pmd-cpp/etc/grammar/cpp.jj index 59eb1b51c6..c8344a270b 100644 --- a/pmd-cpp/etc/grammar/cpp.jj +++ b/pmd-cpp/etc/grammar/cpp.jj @@ -316,7 +316,65 @@ TOKEN : | < STRING : "\"" ( ( ~["\"","\\","\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 : "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 :