25 #ifndef JUCE_CPLUSPLUSCODETOKENISERFUNCTIONS_H_INCLUDED 26 #define JUCE_CPLUSPLUSCODETOKENISERFUNCTIONS_H_INCLUDED 37 || c ==
'_' || c ==
'@';
43 || c ==
'_' || c ==
'@';
48 static const char*
const keywords2Char[] =
49 {
"if",
"do",
"or",
nullptr };
51 static const char*
const keywords3Char[] =
52 {
"for",
"int",
"new",
"try",
"xor",
"and",
"asm",
"not",
nullptr };
54 static const char*
const keywords4Char[] =
55 {
"bool",
"void",
"this",
"true",
"long",
"else",
"char",
56 "enum",
"case",
"goto",
"auto",
nullptr };
58 static const char*
const keywords5Char[] =
59 {
"float",
"const",
"while",
"break",
"false",
"catch",
"class",
"bitor",
60 "compl",
"or_eq",
"short",
"throw",
"union",
"using",
"final",
nullptr };
62 static const char*
const keywords6Char[] =
63 {
"return",
"and_eq",
"bitand",
"delete",
"double",
"export",
"extern",
64 "friend",
"inline",
"not_eq",
"public",
"signed",
"sizeof",
"static",
65 "struct",
"switch",
"typeid",
"xor_eq",
nullptr };
67 static const char*
const keywords7Char[] =
68 {
"nullptr",
"alignas",
"alignof",
"default",
"mutable",
"private",
69 "typedef",
"virtual",
"wchar_t",
nullptr };
71 static const char*
const keywordsOther[] =
72 {
"char16_t",
"char32_t",
"const_cast",
"constexpr",
"continue",
"decltype",
"dynamic_cast",
73 "explicit",
"namespace",
"noexcept",
"operator",
"protected",
"register",
"reinterpret_cast",
74 "static_assert",
"static_cast",
"template",
"thread_local",
"typename",
"unsigned",
"volatile",
75 "@class",
"@dynamic",
"@end",
"@implementation",
"@interface",
"@public",
"@private",
76 "@protected",
"@property",
"@synthesize",
nullptr };
82 case 2: k = keywords2Char;
break;
83 case 3: k = keywords3Char;
break;
84 case 4: k = keywords4Char;
break;
85 case 5: k = keywords5Char;
break;
86 case 6: k = keywords6Char;
break;
87 case 7: k = keywords7Char;
break;
90 if (tokenLength < 2 || tokenLength > 16)
97 for (
int i = 0; k[i] != 0; ++i)
104 template <
typename Iterator>
108 String::CharPointerType::CharType possibleIdentifier [100];
109 String::CharPointerType possible (possibleIdentifier);
115 if (tokenLength < 20)
121 if (tokenLength > 1 && tokenLength <= 16)
123 possible.writeNull();
125 if (
isReservedKeyword (String::CharPointerType (possibleIdentifier), tokenLength))
132 template <
typename Iterator>
136 if (c ==
'l' || c ==
'L' || c ==
'u' || c ==
'U')
147 return (c >=
'0' && c <=
'9')
148 || (c >=
'a' && c <=
'f')
149 || (c >=
'A' && c <=
'F');
152 template <
typename Iterator>
155 if (source.peekNextChar() ==
'-')
158 if (source.nextChar() !=
'0')
162 if (c !=
'x' && c !=
'X')
180 return c >=
'0' && c <=
'7';
183 template <
typename Iterator>
186 if (source.peekNextChar() ==
'-')
189 if (source.nextChar() !=
'0')
203 return c >=
'0' && c <=
'9';
206 template <
typename Iterator>
209 if (source.peekNextChar() ==
'-')
225 template <
typename Iterator>
228 if (source.peekNextChar() ==
'-')
239 const bool hasPoint = (source.peekNextChar() ==
'.');
256 const bool hasExponent = (c ==
'e' || c ==
'E');
262 c = source.peekNextChar();
263 if (c ==
'+' || c ==
'-')
266 int numExpDigits = 0;
273 if (numExpDigits == 0)
277 c = source.peekNextChar();
278 if (c ==
'f' || c ==
'F')
280 else if (! (hasExponent || hasPoint))
286 template <
typename Iterator>
289 const Iterator original (source);
306 template <
typename Iterator>
315 if (c == quote || c == 0)
323 template <
typename Iterator>
326 bool lastWasStar =
false;
332 if (c == 0 || (c ==
'/' && lastWasStar))
335 lastWasStar = (c ==
'*');
339 template <
typename Iterator>
342 bool lastWasBackslash =
false;
356 Iterator next (source);
360 if (c2 ==
'/' || c2 ==
'*')
367 if (c ==
'\n' || c ==
'\r')
369 source.skipToEndOfLine();
371 if (lastWasBackslash)
377 lastWasBackslash = (c ==
'\\');
382 template <
typename Iterator>
385 if (source.peekNextChar() == c)
389 template <
typename Iterator>
394 if (c == c1 || c == c2)
398 template <
typename Iterator>
401 source.skipWhitespace();
403 const juce_wchar firstChar = source.peekNextChar();
410 case '0':
case '1':
case '2':
case '3':
case '4':
411 case '5':
case '6':
case '7':
case '8':
case '9':
420 if (firstChar ==
'.')
476 source.skipToEndOfLine();
499 case '|':
case '&':
case '^':
535 String::CharPointerType
t;
551 const int maxCharsOnLine,
const bool breakAtNewLines,
552 const bool replaceSingleQuotes,
const bool allowStringBreaks)
555 bool lastWasHexEscapeCode =
false;
557 for (
int i = 0; i < numBytesToRead || numBytesToRead < 0; ++i)
559 const unsigned char c = (
unsigned char) utf8[i];
560 bool startNewLine =
false;
564 case '\t': out <<
"\\t"; lastWasHexEscapeCode =
false; charsOnLine += 2;
break;
565 case '\r': out <<
"\\r"; lastWasHexEscapeCode =
false; charsOnLine += 2;
break;
566 case '\n': out <<
"\\n"; lastWasHexEscapeCode =
false; charsOnLine += 2; startNewLine = breakAtNewLines;
break;
567 case '\\': out <<
"\\\\"; lastWasHexEscapeCode =
false; charsOnLine += 2;
break;
568 case '\"': out <<
"\\\""; lastWasHexEscapeCode =
false; charsOnLine += 2;
break;
571 if (numBytesToRead < 0)
575 lastWasHexEscapeCode =
true;
580 if (replaceSingleQuotes)
583 lastWasHexEscapeCode =
false;
591 if (c >= 32 && c < 127 && ! (lastWasHexEscapeCode
595 lastWasHexEscapeCode =
false;
598 else if (allowStringBreaks && lastWasHexEscapeCode && c >= 32 && c < 127)
600 out <<
"\"\"" << (char) c;
601 lastWasHexEscapeCode =
false;
607 lastWasHexEscapeCode =
true;
614 if ((startNewLine || (maxCharsOnLine > 0 && charsOnLine >= maxCharsOnLine))
615 && (numBytesToRead < 0 || i < numBytesToRead - 1))
618 out <<
"\"" <<
newLine <<
"\"";
619 lastWasHexEscapeCode =
false;
641 #endif // JUCE_CPLUSPLUSCODETOKENISERFUNCTIONS_H_INCLUDED Definition: juce_CPlusPlusCodeTokeniser.h:55
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:523
Definition: juce_CPlusPlusCodeTokeniser.h:61
static bool isHexDigit(const juce_wchar c) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:145
static String toHexString(int number)
Definition: juce_String.cpp:1925
static void writeEscapeChars(OutputStream &out, const char *utf8, const int numBytesToRead, const int maxCharsOnLine, const bool breakAtNewLines, const bool replaceSingleQuotes, const bool allowStringBreaks)
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:550
String::CharPointerType t
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:535
static void skipPreprocessorLine(Iterator &source) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:340
static bool parseOctalLiteral(Iterator &source) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:184
juce_wchar nextChar() noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:528
#define noexcept
Definition: juce_CompilerSupport.h:141
static bool parseHexLiteral(Iterator &source) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:153
Definition: juce_CPlusPlusCodeTokeniser.h:60
Definition: juce_CPlusPlusCodeTokeniser.h:54
static bool isOctalDigit(const juce_wchar c) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:178
static bool isReservedKeyword(String::CharPointerType token, const int tokenLength) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:46
void skipToEndOfLine() noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:532
NewLine newLine
Definition: juce_core.cpp:35
static int getHexDigitValue(juce_wchar digit) noexcept
Definition: juce_CharacterFunctions.cpp:111
static bool isLetterOrDigit(char character) noexcept
Definition: juce_CharacterFunctions.cpp:99
Definition: juce_String.h:43
static void skipComment(Iterator &source) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:324
static void skipQuotedString(Iterator &source) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:307
static bool isLetter(char character) noexcept
Definition: juce_CharacterFunctions.cpp:88
Definition: juce_CPlusPlusCodeTokeniser.h:59
String toString() const
Definition: juce_MemoryOutputStream.cpp:201
static int parseIdentifier(Iterator &source) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:105
void skip() noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:530
static bool skipNumberSuffix(Iterator &source)
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:133
int numChars
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:536
static bool isIdentifierBody(const juce_wchar c) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:40
static String addEscapeChars(const String &s)
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:632
Definition: juce_CPlusPlusCodeTokeniser.h:57
bool isEOF() const noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:533
static bool parseDecimalLiteral(Iterator &source) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:207
Definition: juce_CPlusPlusCodeTokeniser.h:58
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:32
Definition: juce_OutputStream.h:42
StringIterator(const String &s) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:525
Definition: juce_CharPointer_ASCII.h:42
Definition: juce_CPlusPlusCodeTokeniser.h:56
static bool parseFloatLiteral(Iterator &source) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:226
static bool isDecimalDigit(const juce_wchar c) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:201
juce_wchar peekNextChar() noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:529
static int readNextToken(Iterator &source)
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:399
static void skipIfNextCharMatches(Iterator &source, const juce_wchar c) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:383
static int parseNumber(Iterator &source)
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:287
Definition: juce_MemoryOutputStream.h:40
static bool isIdentifierStart(const juce_wchar c) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:34
const char * toRawUTF8() const
Definition: juce_String.cpp:2061
Definition: juce_CPlusPlusCodeTokeniser.h:52
Definition: juce_CPlusPlusCodeTokeniser.h:53
void skipWhitespace() noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:531
wchar_t juce_wchar
Definition: juce_CharacterFunctions.h:49
StringIterator(String::CharPointerType s) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:526
Definition: juce_CPlusPlusCodeTokeniser.h:62
static void skipIfNextCharMatches(Iterator &source, const juce_wchar c1, const juce_wchar c2) noexcept
Definition: juce_CPlusPlusCodeTokeniserFunctions.h:390