33 static const char*
const keywords2Char[] =
34 {
"if",
"or",
"in",
"do",
nullptr };
36 static const char*
const keywords3Char[] =
37 {
"and",
"end",
"for",
"nil",
"not",
nullptr };
39 static const char*
const keywords4Char[] =
40 {
"then",
"true",
"else",
nullptr };
42 static const char*
const keywords5Char[] =
43 {
"false",
"local",
"until",
"while",
"break",
nullptr };
45 static const char*
const keywords6Char[] =
46 {
"repeat",
"return",
"elseif",
nullptr};
48 static const char*
const keywordsOther[] =
49 {
"function",
"@interface",
"@end",
"@synthesize",
"@dynamic",
"@public",
50 "@private",
"@property",
"@protected",
"@class",
nullptr };
56 case 2: k = keywords2Char;
break;
57 case 3: k = keywords3Char;
break;
58 case 4: k = keywords4Char;
break;
59 case 5: k = keywords5Char;
break;
60 case 6: k = keywords6Char;
break;
63 if (tokenLength < 2 || tokenLength > 16)
70 for (
int i = 0; k[i] !=
nullptr; ++i)
77 template <
typename Iterator>
78 static int parseIdentifier (Iterator& source)
noexcept
81 String::CharPointerType::CharType possibleIdentifier[100] = {};
84 while (CppTokeniserFunctions::isIdentifierBody (source.peekNextChar()))
86 auto c = source.nextChar();
94 if (tokenLength > 1 && tokenLength <= 16)
99 return LuaTokeniser::tokenType_keyword;
102 return LuaTokeniser::tokenType_identifier;
105 template <
typename Iterator>
106 static int readNextToken (Iterator& source)
108 source.skipWhitespace();
110 auto firstChar = source.peekNextChar();
117 case '0':
case '1':
case '2':
case '3':
case '4':
118 case '5':
case '6':
case '7':
case '8':
case '9':
121 auto result = CppTokeniserFunctions::parseNumber (source);
123 if (result == LuaTokeniser::tokenType_error)
127 if (firstChar ==
'.')
128 return LuaTokeniser::tokenType_punctuation;
138 return LuaTokeniser::tokenType_punctuation;
144 return LuaTokeniser::tokenType_bracket;
148 CppTokeniserFunctions::skipQuotedString (source);
149 return LuaTokeniser::tokenType_string;
153 CppTokeniserFunctions::skipIfNextCharMatches (source,
'+',
'=');
154 return LuaTokeniser::tokenType_operator;
159 auto result = CppTokeniserFunctions::parseNumber (source);
161 if (source.peekNextChar() ==
'-')
163 source.skipToEndOfLine();
164 return LuaTokeniser::tokenType_comment;
167 if (result == LuaTokeniser::tokenType_error)
169 CppTokeniserFunctions::skipIfNextCharMatches (source,
'-',
'=');
170 return LuaTokeniser::tokenType_operator;
179 CppTokeniserFunctions::skipIfNextCharMatches (source,
'=');
180 return LuaTokeniser::tokenType_operator;
185 return LuaTokeniser::tokenType_operator;
188 case '|':
case '&':
case '^':
190 CppTokeniserFunctions::skipIfNextCharMatches (source, firstChar);
191 CppTokeniserFunctions::skipIfNextCharMatches (source,
'=');
192 return LuaTokeniser::tokenType_operator;
195 if (CppTokeniserFunctions::isIdentifierStart (firstChar))
196 return parseIdentifier (source);
202 return LuaTokeniser::tokenType_error;