diff options
Diffstat (limited to '')
| -rw-r--r-- | lex.c | 83 |
1 files changed, 65 insertions, 18 deletions
| @@ -1,5 +1,8 @@ | |||
| 1 | char *rcs_lex = "$Id: lex.c,v 2.3 1994/08/17 17:41:50 celes Exp celes $"; | 1 | char *rcs_lex = "$Id: lex.c,v 2.4 1994/09/05 19:14:40 celes Exp lhf $"; |
| 2 | /*$Log: lex.c,v $ | 2 | /*$Log: lex.c,v $ |
| 3 | * Revision 2.4 1994/09/05 19:14:40 celes | ||
| 4 | * escapes \' e \" em strings; correcao do escape \\ | ||
| 5 | * | ||
| 3 | * Revision 2.3 1994/08/17 17:41:50 celes | 6 | * Revision 2.3 1994/08/17 17:41:50 celes |
| 4 | * Implementacao da macro 'lua_strcmp' | 7 | * Implementacao da macro 'lua_strcmp' |
| 5 | * | 8 | * |
| @@ -33,7 +36,7 @@ char *rcs_lex = "$Id: lex.c,v 2.3 1994/08/17 17:41:50 celes Exp celes $"; | |||
| 33 | #include "table.h" | 36 | #include "table.h" |
| 34 | #include "y.tab.h" | 37 | #include "y.tab.h" |
| 35 | 38 | ||
| 36 | #define lua_strcmp(a,b) (a[0]<b[0]?(-1):(a[0]>b[0]?(1):strcmp(a,b))) | 39 | #define lua_strcmp(a,b) (a[0]<b[0]?(-1):(a[0]>b[0]?(1):strcmp(a,b))) |
| 37 | 40 | ||
| 38 | #define next() { current = input(); } | 41 | #define next() { current = input(); } |
| 39 | #define save(x) { *yytextLast++ = (x); } | 42 | #define save(x) { *yytextLast++ = (x); } |
| @@ -60,7 +63,7 @@ char *lua_lasttext (void) | |||
| 60 | 63 | ||
| 61 | 64 | ||
| 62 | /* The reserved words must be listed in lexicographic order */ | 65 | /* The reserved words must be listed in lexicographic order */ |
| 63 | static struct | 66 | static struct |
| 64 | { | 67 | { |
| 65 | char *name; | 68 | char *name; |
| 66 | int token; | 69 | int token; |
| @@ -82,6 +85,30 @@ static struct | |||
| 82 | {"until", UNTIL}, | 85 | {"until", UNTIL}, |
| 83 | {"while", WHILE} }; | 86 | {"while", WHILE} }; |
| 84 | 87 | ||
| 88 | enum | ||
| 89 | { | ||
| 90 | U_and=128, | ||
| 91 | U_do, | ||
| 92 | U_else, | ||
| 93 | U_elseif, | ||
| 94 | U_end, | ||
| 95 | U_function, | ||
| 96 | U_if, | ||
| 97 | U_local, | ||
| 98 | U_nil, | ||
| 99 | U_not, | ||
| 100 | U_or, | ||
| 101 | U_repeat, | ||
| 102 | U_return, | ||
| 103 | U_then, | ||
| 104 | U_until, | ||
| 105 | U_while, | ||
| 106 | U_le = '<'+128, | ||
| 107 | U_ge = '>'+128, | ||
| 108 | U_ne = '~'+128, | ||
| 109 | U_sc = '.'+128 | ||
| 110 | }; | ||
| 111 | |||
| 85 | #define RESERVEDSIZE (sizeof(reserved)/sizeof(reserved[0])) | 112 | #define RESERVEDSIZE (sizeof(reserved)/sizeof(reserved[0])) |
| 86 | 113 | ||
| 87 | 114 | ||
| @@ -134,23 +161,23 @@ int yylex () | |||
| 134 | return DEBUG; | 161 | return DEBUG; |
| 135 | } | 162 | } |
| 136 | return WRONGTOKEN; | 163 | return WRONGTOKEN; |
| 137 | 164 | ||
| 138 | case '-': | 165 | case '-': |
| 139 | save_and_next(); | 166 | save_and_next(); |
| 140 | if (current != '-') return '-'; | 167 | if (current != '-') return '-'; |
| 141 | do { next(); } while (current != '\n' && current != 0); | 168 | do { next(); } while (current != '\n' && current != 0); |
| 142 | continue; | 169 | continue; |
| 143 | 170 | ||
| 144 | case '<': | 171 | case '<': |
| 145 | save_and_next(); | 172 | save_and_next(); |
| 146 | if (current != '=') return '<'; | 173 | if (current != '=') return '<'; |
| 147 | else { save_and_next(); return LE; } | 174 | else { save_and_next(); return LE; } |
| 148 | 175 | ||
| 149 | case '>': | 176 | case '>': |
| 150 | save_and_next(); | 177 | save_and_next(); |
| 151 | if (current != '=') return '>'; | 178 | if (current != '=') return '>'; |
| 152 | else { save_and_next(); return GE; } | 179 | else { save_and_next(); return GE; } |
| 153 | 180 | ||
| 154 | case '~': | 181 | case '~': |
| 155 | save_and_next(); | 182 | save_and_next(); |
| 156 | if (current != '=') return '~'; | 183 | if (current != '=') return '~'; |
| @@ -161,12 +188,12 @@ int yylex () | |||
| 161 | { | 188 | { |
| 162 | int del = current; | 189 | int del = current; |
| 163 | next(); /* skip the delimiter */ | 190 | next(); /* skip the delimiter */ |
| 164 | while (current != del) | 191 | while (current != del) |
| 165 | { | 192 | { |
| 166 | switch (current) | 193 | switch (current) |
| 167 | { | 194 | { |
| 168 | case 0: | 195 | case 0: |
| 169 | case '\n': | 196 | case '\n': |
| 170 | return WRONGTOKEN; | 197 | return WRONGTOKEN; |
| 171 | case '\\': | 198 | case '\\': |
| 172 | next(); /* do not save the '\' */ | 199 | next(); /* do not save the '\' */ |
| @@ -180,7 +207,7 @@ int yylex () | |||
| 180 | default : save(current); next(); break; | 207 | default : save(current); next(); break; |
| 181 | } | 208 | } |
| 182 | break; | 209 | break; |
| 183 | default: | 210 | default: |
| 184 | save_and_next(); | 211 | save_and_next(); |
| 185 | } | 212 | } |
| 186 | } | 213 | } |
| @@ -212,12 +239,12 @@ int yylex () | |||
| 212 | yylval.pChar = yytext[currentText]; | 239 | yylval.pChar = yytext[currentText]; |
| 213 | return NAME; | 240 | return NAME; |
| 214 | } | 241 | } |
| 215 | 242 | ||
| 216 | case '.': | 243 | case '.': |
| 217 | save_and_next(); | 244 | save_and_next(); |
| 218 | if (current == '.') | 245 | if (current == '.') |
| 219 | { | 246 | { |
| 220 | save_and_next(); | 247 | save_and_next(); |
| 221 | return CONC; | 248 | return CONC; |
| 222 | } | 249 | } |
| 223 | else if (!isdigit(current)) return '.'; | 250 | else if (!isdigit(current)) return '.'; |
| @@ -226,7 +253,7 @@ int yylex () | |||
| 226 | 253 | ||
| 227 | case '0': case '1': case '2': case '3': case '4': | 254 | case '0': case '1': case '2': case '3': case '4': |
| 228 | case '5': case '6': case '7': case '8': case '9': | 255 | case '5': case '6': case '7': case '8': case '9': |
| 229 | 256 | ||
| 230 | do { save_and_next(); } while (isdigit(current)); | 257 | do { save_and_next(); } while (isdigit(current)); |
| 231 | if (current == '.') save_and_next(); | 258 | if (current == '.') save_and_next(); |
| 232 | fraction: while (isdigit(current)) save_and_next(); | 259 | fraction: while (isdigit(current)) save_and_next(); |
| @@ -241,12 +268,32 @@ fraction: while (isdigit(current)) save_and_next(); | |||
| 241 | yylval.vFloat = atof(yytext[currentText]); | 268 | yylval.vFloat = atof(yytext[currentText]); |
| 242 | return NUMBER; | 269 | return NUMBER; |
| 243 | 270 | ||
| 271 | case U_and: return AND; | ||
| 272 | case U_do: return DO; | ||
| 273 | case U_else: return ELSE; | ||
| 274 | case U_elseif: return ELSEIF; | ||
| 275 | case U_end: return END; | ||
| 276 | case U_function: return FUNCTION; | ||
| 277 | case U_if: return IF; | ||
| 278 | case U_local: return LOCAL; | ||
| 279 | case U_nil: return NIL; | ||
| 280 | case U_not: return NOT; | ||
| 281 | case U_or: return OR; | ||
| 282 | case U_repeat: return REPEAT; | ||
| 283 | case U_return: return RETURN; | ||
| 284 | case U_then: return THEN; | ||
| 285 | case U_until: return UNTIL; | ||
| 286 | case U_while: return WHILE; | ||
| 287 | case U_le: return LE; | ||
| 288 | case U_ge: return GE; | ||
| 289 | case U_ne: return NE; | ||
| 290 | case U_sc: return CONC; | ||
| 291 | |||
| 244 | default: /* also end of file */ | 292 | default: /* also end of file */ |
| 245 | { | 293 | { |
| 246 | save_and_next(); | 294 | save_and_next(); |
| 247 | return yytext[currentText][0]; | 295 | return yytext[currentText][0]; |
| 248 | } | 296 | } |
| 249 | } | 297 | } |
| 250 | } | 298 | } |
| 251 | } | 299 | } |
| 252 | |||
