projects
/
cparser
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
support for pointer add/sub, no need for type_environment in ast2firm
[cparser]
/
lexer.c
diff --git
a/lexer.c
b/lexer.c
index
9dbd2fa
..
1300b3d
100644
(file)
--- a/
lexer.c
+++ b/
lexer.c
@@
-17,6
+17,7
@@
static int c;
token_t lexer_token;
static int c;
token_t lexer_token;
+symbol_t *symbol_L;
static FILE *input;
static char buf[1024 + MAX_PUTBACK];
static const char *bufend;
static FILE *input;
static char buf[1024 + MAX_PUTBACK];
static const char *bufend;
@@
-88,11
+89,7
@@
static inline void next_char(void);
lexer_token.source_position.linenr++; \
code;
lexer_token.source_position.linenr++; \
code;
-static inline void eat(char c_type)
-{
- assert(c == c_type);
- next_char();
-}
+#define eat(c_type) do { assert(c == c_type); next_char(); } while(0)
static void maybe_concat_lines(void)
{
static void maybe_concat_lines(void)
{
@@
-113,6
+110,7
@@
static inline void next_char(void)
{
next_real_char();
{
next_real_char();
+#if 0
/* filter trigraphs */
if(UNLIKELY(c == '\\')) {
maybe_concat_lines();
/* filter trigraphs */
if(UNLIKELY(c == '\\')) {
maybe_concat_lines();
@@
-148,6
+146,8
@@
static inline void next_char(void)
}
end_of_next_char:
}
end_of_next_char:
+#endif
+ (void) maybe_concat_lines;
#ifdef DEBUG_CHARS
printf("nchar '%c'\n", c);
#else
#ifdef DEBUG_CHARS
printf("nchar '%c'\n", c);
#else
@@
-805,7
+805,7
@@
static void parse_preprocessor_identifier(void)
}
}
}
}
-static void parse_preprocessor_directive()
+static void parse_preprocessor_directive(
void
)
{
next_pp_token();
{
next_pp_token();
@@
-863,6
+863,12
@@
void lexer_next_preprocessing_token(void)
SYMBOL_CHARS
parse_symbol();
SYMBOL_CHARS
parse_symbol();
+ /* might be a wide string ( L"string" ) */
+ if(c == '"' && (lexer_token.type == T_IDENTIFIER &&
+ lexer_token.v.symbol == symbol_L)) {
+ parse_string_literal();
+ return;
+ }
return;
DIGITS
return;
DIGITS
@@
-1041,6
+1047,8
@@
void lexer_open_stream(FILE *stream, const char *input_name)
lexer_token.source_position.linenr = 0;
lexer_token.source_position.input_name = input_name;
lexer_token.source_position.linenr = 0;
lexer_token.source_position.input_name = input_name;
+ symbol_L = symbol_table_insert("L");
+
/* place a virtual \n at the beginning so the lexer knows that we're
* at the beginning of a line */
c = '\n';
/* place a virtual \n at the beginning so the lexer knows that we're
* at the beginning of a line */
c = '\n';