@@ -218,7 +218,12 @@ static void addToScope (tokenInfo *const token, const vString *const extra)
218
218
219
219
static bool isIdentChar (const int c )
220
220
{
221
- return (isalnum (c ) || c == ':' || c == '_' || c == '-' || c >= 0x80 );
221
+ return (isalnum (c ) || c == '_' || c == '-' || c >= 0x80 );
222
+ }
223
+
224
+ static bool isScopeIdentifierChar (const int c )
225
+ {
226
+ return (isIdentChar (c ) || c == ':' );
222
227
}
223
228
224
229
static void parseString (vString * const string , const int delimiter )
@@ -228,20 +233,40 @@ static void parseString (vString *const string, const int delimiter)
228
233
int c = getcFromInputFile ();
229
234
230
235
if (c == '\\' && (c = getcFromInputFile ()) != EOF )
231
- vStringPut (string , ( char ) c );
236
+ vStringPut (string , c );
232
237
else if (c == EOF || c == delimiter )
233
238
break ;
234
239
else
235
- vStringPut (string , ( char ) c );
240
+ vStringPut (string , c );
236
241
}
237
242
}
238
243
244
+ /* parse a identifier that may contain scopes, such as function names and
245
+ * variable names.
246
+ *
247
+ * VariableName
248
+ * FunctionName
249
+ * local:VariableName
250
+ * private:FunctionName
251
+ */
252
+ static void parseScopeIdentifier (vString * const string , const int firstChar )
253
+ {
254
+ int c = firstChar ;
255
+ do
256
+ {
257
+ vStringPut (string , c );
258
+ c = getcFromInputFile ();
259
+ } while (isScopeIdentifierChar (c ));
260
+ ungetcToInputFile (c );
261
+ }
262
+
263
+ /* parse a identifier that do not contain scope, such as class names. */
239
264
static void parseIdentifier (vString * const string , const int firstChar )
240
265
{
241
266
int c = firstChar ;
242
267
do
243
268
{
244
- vStringPut (string , ( char ) c );
269
+ vStringPut (string , c );
245
270
c = getcFromInputFile ();
246
271
} while (isIdentChar (c ));
247
272
ungetcToInputFile (c );
@@ -365,14 +390,14 @@ static void readToken (tokenInfo *const token)
365
390
case '$' : /* variable start */
366
391
{
367
392
int d = getcFromInputFile ();
368
- if (! isIdentChar (d ))
393
+ if (! isScopeIdentifierChar (d ))
369
394
{
370
395
ungetcToInputFile (d );
371
396
token -> type = TOKEN_UNDEFINED ;
372
397
}
373
398
else
374
399
{
375
- parseIdentifier (token -> string , d );
400
+ parseScopeIdentifier (token -> string , d );
376
401
token -> type = TOKEN_VARIABLE ;
377
402
}
378
403
break ;
@@ -383,7 +408,11 @@ static void readToken (tokenInfo *const token)
383
408
token -> type = TOKEN_UNDEFINED ;
384
409
else
385
410
{
386
- parseIdentifier (token -> string , c );
411
+ if (token -> keyword == KEYWORD_function ||
412
+ token -> keyword == KEYWORD_filter )
413
+ parseScopeIdentifier (token -> string , c );
414
+ else
415
+ parseIdentifier (token -> string , c );
387
416
token -> keyword = lookupCaseKeyword (
388
417
vStringValue (token -> string ), getInputLanguage ());
389
418
if (token -> keyword == KEYWORD_NONE )
@@ -536,6 +565,7 @@ static bool parseFunction (tokenInfo *const token, int kind)
536
565
/* parse a class
537
566
*
538
567
* class MyClass {}
568
+ * class Derived : Base {}
539
569
*/
540
570
static bool parseClass (tokenInfo * const token )
541
571
{
0 commit comments