@@ -28,13 +28,44 @@ int check_date_formats(char *s) {
2828 return 0 ;
2929}
3030
31+ /* Process escaped characters in a string */
32+ char * process_escapes (char * text, int len) {
33+ char * result = malloc (len + 1 );
34+ int i, j = 0 ;
35+
36+ for (i = 0 ; i < len; i++) {
37+ if (text[i] == ' \\ ' && i + 1 < len) {
38+ i++; // Skip backslash
39+ switch (text[i]) {
40+ case ' n' : result[j++] = ' \n ' ; break ;
41+ case ' t' : result[j++] = ' \t ' ; break ;
42+ case ' r' : result[j++] = ' \r ' ; break ;
43+ case ' b' : result[j++] = ' \b ' ; break ;
44+ case ' f' : result[j++] = ' \f ' ; break ;
45+ case ' \\ ' : result[j++] = ' \\ ' ; break ;
46+ case ' \' ' : result[j++] = ' \' ' ; break ;
47+ case ' \" ' : result[j++] = ' \" ' ; break ;
48+ case ' `' : result[j++] = ' `' ; break ;
49+ default : result[j++] = text[i]; break ;
50+ }
51+ } else {
52+ result[j++] = text[i];
53+ }
54+ }
55+ result[j] = ' \0 ' ;
56+ return result;
57+ }
58+
3159/* Strip quotes and process string */
3260char * strip_quotes (char * text, int offset) {
33- int len = strlen (text);
34- char *s = malloc (len - 1 );
35- strncpy (s, text + offset, len - (offset * 2 ));
36- s[len - (offset * 2 )] = ' \0 ' ;
37- return s;
61+ int len = strlen (text) - (offset * 2 );
62+ char *raw = malloc (len + 1 );
63+ strncpy (raw, text + offset, len);
64+ raw[len] = ' \0 ' ;
65+
66+ char *processed = process_escapes (raw, len);
67+ free (raw);
68+ return processed;
3869}
3970%}
4071
@@ -110,23 +141,23 @@ NUMBER_WITH_SUFFIX ({INTEGER}|{DECIMAL}){SIZE_SUFFIX}
110141{NUMBER_WITH_SUFFIX } { yylval.str = strdup (yytext); return NUMERIC_LITERAL; }
111142
112143 /* String literals and identifiers */
113- '[^ ' ] * ' {
144+ '( [^ ' \\ ] | \\ . ) * ' {
114145 char *s = strip_quotes (yytext, 1 );
115146 int token = check_date_formats (s);
116147 if (token) return token;
117148 yylval.str = s;
118149 return STRING_LITERAL;
119150 }
120151
121- \" [^ " ] * \" {
152+ \" ( [^ " \\ ] | \\ . ) * \" {
122153 char *s = strip_quotes (yytext, 1 );
123154 int token = check_date_formats (s);
124155 if (token) return token;
125156 yylval.str = s;
126157 return STRING_LITERAL;
127158 }
128159
129- `[^ ` ] * ` {
160+ `( [^ ` \\ ] | \\ . ) * ` {
130161 char *s = strip_quotes (yytext, 1 );
131162 int token = check_date_formats (s);
132163 if (token) return token;
0 commit comments