X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=lexer.c;h=f1b00e368942380411244d9d8822d65a4fe213cc;hb=4d951195589b5fbe66e5712b76b5ec5724404633;hp=16a3798c9c7a03d1f1b13494051eaba752358d84;hpb=930b5d23cc57298f8f211e5eb4475ea883e7907b;p=cparser diff --git a/lexer.c b/lexer.c index 16a3798..f1b00e3 100644 --- a/lexer.c +++ b/lexer.c @@ -56,6 +56,7 @@ static char buf[1024 + MAX_PUTBACK]; static const char *bufend; static const char *bufpos; static strset_t stringset; +bool allow_dollar_in_symbol = true; /** * Prints a parse error message at the current token. @@ -194,6 +195,7 @@ end_of_next_char:; } #define SYMBOL_CHARS \ + case '$': if (!allow_dollar_in_symbol) goto dollar_sign; \ case 'a': \ case 'b': \ case 'c': \ @@ -246,8 +248,7 @@ end_of_next_char:; case 'X': \ case 'Y': \ case 'Z': \ - case '_': \ - case '$': // TODO add option to deactivate $ in identifers + case '_': #define DIGITS \ case '0': \ @@ -282,6 +283,7 @@ static void parse_symbol(void) break; default: +dollar_sign: goto end_symbol; } } @@ -750,7 +752,7 @@ static int parse_escape_sequence(void) int ec = c; next_char(); - switch(ec) { + switch (ec) { case '"': return '"'; case '\'': return '\''; case '\\': return '\\'; @@ -776,6 +778,10 @@ static int parse_escape_sequence(void) case EOF: parse_error("reached end of file while parsing escape sequence"); return EOF; + case 'e': + if (c_mode & _GNUC) + return 27; /* hopefully 27 is ALWAYS the code for ESACAPE */ + /*fallthrough*/ default: parse_error("unknown escape sequence"); return EOF; @@ -1565,6 +1571,7 @@ void lexer_next_preprocessing_token(void) return; default: +dollar_sign: errorf(&lexer_token.source_position, "unknown character '%c' found", c); next_char(); lexer_token.type = T_ERROR;