diff --git a/pmd-cpp/etc/grammar/cpp.jj b/pmd-cpp/etc/grammar/cpp.jj index a47a0b7ce3..b535533533 100644 --- a/pmd-cpp/etc/grammar/cpp.jj +++ b/pmd-cpp/etc/grammar/cpp.jj @@ -318,35 +318,9 @@ TOKEN [IGNORE_CASE] : TOKEN : { - < CHARACTER : ("L")? "'" - ( (~["'","\\","\n","\r"])* - | ("\\" ( - ["n","t","v","b","r","f","a","\\","?","'","\""] - | - "0" (["0"-"7"])* - | - ["1"-"9"] (["0"-"9"])* - | - ("x" | "X") (["0"-"9","a"-"f","A"-"F"])+ - ) - ) - ) - "'" > + < CHARACTER : ("L")? "'" ( ( ~["'","\\","\r","\n"] ) | ( "\\" ( ~["\n","\r"] ) ) )* "'" > -| < STRING : ("L")? "\"" - ( ( ~["\"","\\","\n","\r"]) - | ("\\" ( - ["n","t","v","b","r","f","a","\\","?","'","\"","\n"] - | - "0" (["0"-"7"])* - | - ["1"-"9"] (["0"-"9"])* - | - ("x" | "X") (["0"-"9","a"-"f","A"-"F"])+ - ) - ) - )* - "\"" > +| < STRING : ("L")? "\"" ( ( ~["\"","\\","\r","\n"] ) | ( "\\" ( ~["\n","\r"] | "\n" | "\r\n" ) ) )* "\"" > } void translation_unit() : diff --git a/pmd-cpp/src/test/java/net/sourceforge/pmd/cpd/CPPTokenizerTest.java b/pmd-cpp/src/test/java/net/sourceforge/pmd/cpd/CPPTokenizerTest.java index aac224ce3b..4b78507736 100644 --- a/pmd-cpp/src/test/java/net/sourceforge/pmd/cpd/CPPTokenizerTest.java +++ b/pmd-cpp/src/test/java/net/sourceforge/pmd/cpd/CPPTokenizerTest.java @@ -113,6 +113,18 @@ public class CPPTokenizerTest { assertEquals(15, tokens.size()); } + @Test + public void testHexCharacter() { + Tokens tokens = parse("if (*pbuf == '\\0x05')" + PMD.EOL); + assertEquals(8, tokens.size()); + } + + @Test + public void testWhiteSpaceEscape() { + Tokens tokens = parse("szPath = m_sdcacheDir + _T(\"\\ oMedia\");" + PMD.EOL); + assertEquals(10, tokens.size()); + } + private Tokens parse(String snippet) { return parse(snippet, false); }