added support for ugly tokens

This commit is contained in:
Luiz Henrique de Figueiredo
1994-09-22 09:44:00 -03:00
parent 98d9509676
commit 24c962de43

83
lex.c
View File

@@ -1,5 +1,8 @@
char *rcs_lex = "$Id: lex.c,v 2.3 1994/08/17 17:41:50 celes Exp celes $"; char *rcs_lex = "$Id: lex.c,v 2.4 1994/09/05 19:14:40 celes Exp lhf $";
/*$Log: lex.c,v $ /*$Log: lex.c,v $
* Revision 2.4 1994/09/05 19:14:40 celes
* escapes \' e \" em strings; correcao do escape \\
*
* Revision 2.3 1994/08/17 17:41:50 celes * Revision 2.3 1994/08/17 17:41:50 celes
* Implementacao da macro 'lua_strcmp' * Implementacao da macro 'lua_strcmp'
* *
@@ -33,7 +36,7 @@ char *rcs_lex = "$Id: lex.c,v 2.3 1994/08/17 17:41:50 celes Exp celes $";
#include "table.h" #include "table.h"
#include "y.tab.h" #include "y.tab.h"
#define lua_strcmp(a,b) (a[0]<b[0]?(-1):(a[0]>b[0]?(1):strcmp(a,b))) #define lua_strcmp(a,b) (a[0]<b[0]?(-1):(a[0]>b[0]?(1):strcmp(a,b)))
#define next() { current = input(); } #define next() { current = input(); }
#define save(x) { *yytextLast++ = (x); } #define save(x) { *yytextLast++ = (x); }
@@ -60,7 +63,7 @@ char *lua_lasttext (void)
/* The reserved words must be listed in lexicographic order */ /* The reserved words must be listed in lexicographic order */
static struct static struct
{ {
char *name; char *name;
int token; int token;
@@ -82,6 +85,30 @@ static struct
{"until", UNTIL}, {"until", UNTIL},
{"while", WHILE} }; {"while", WHILE} };
enum
{
U_and=128,
U_do,
U_else,
U_elseif,
U_end,
U_function,
U_if,
U_local,
U_nil,
U_not,
U_or,
U_repeat,
U_return,
U_then,
U_until,
U_while,
U_le = '<'+128,
U_ge = '>'+128,
U_ne = '~'+128,
U_sc = '.'+128
};
#define RESERVEDSIZE (sizeof(reserved)/sizeof(reserved[0])) #define RESERVEDSIZE (sizeof(reserved)/sizeof(reserved[0]))
@@ -134,23 +161,23 @@ int yylex ()
return DEBUG; return DEBUG;
} }
return WRONGTOKEN; return WRONGTOKEN;
case '-': case '-':
save_and_next(); save_and_next();
if (current != '-') return '-'; if (current != '-') return '-';
do { next(); } while (current != '\n' && current != 0); do { next(); } while (current != '\n' && current != 0);
continue; continue;
case '<': case '<':
save_and_next(); save_and_next();
if (current != '=') return '<'; if (current != '=') return '<';
else { save_and_next(); return LE; } else { save_and_next(); return LE; }
case '>': case '>':
save_and_next(); save_and_next();
if (current != '=') return '>'; if (current != '=') return '>';
else { save_and_next(); return GE; } else { save_and_next(); return GE; }
case '~': case '~':
save_and_next(); save_and_next();
if (current != '=') return '~'; if (current != '=') return '~';
@@ -161,12 +188,12 @@ int yylex ()
{ {
int del = current; int del = current;
next(); /* skip the delimiter */ next(); /* skip the delimiter */
while (current != del) while (current != del)
{ {
switch (current) switch (current)
{ {
case 0: case 0:
case '\n': case '\n':
return WRONGTOKEN; return WRONGTOKEN;
case '\\': case '\\':
next(); /* do not save the '\' */ next(); /* do not save the '\' */
@@ -180,7 +207,7 @@ int yylex ()
default : save(current); next(); break; default : save(current); next(); break;
} }
break; break;
default: default:
save_and_next(); save_and_next();
} }
} }
@@ -212,12 +239,12 @@ int yylex ()
yylval.pChar = yytext[currentText]; yylval.pChar = yytext[currentText];
return NAME; return NAME;
} }
case '.': case '.':
save_and_next(); save_and_next();
if (current == '.') if (current == '.')
{ {
save_and_next(); save_and_next();
return CONC; return CONC;
} }
else if (!isdigit(current)) return '.'; else if (!isdigit(current)) return '.';
@@ -226,7 +253,7 @@ int yylex ()
case '0': case '1': case '2': case '3': case '4': case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9': case '5': case '6': case '7': case '8': case '9':
do { save_and_next(); } while (isdigit(current)); do { save_and_next(); } while (isdigit(current));
if (current == '.') save_and_next(); if (current == '.') save_and_next();
fraction: while (isdigit(current)) save_and_next(); fraction: while (isdigit(current)) save_and_next();
@@ -241,12 +268,32 @@ fraction: while (isdigit(current)) save_and_next();
yylval.vFloat = atof(yytext[currentText]); yylval.vFloat = atof(yytext[currentText]);
return NUMBER; return NUMBER;
case U_and: return AND;
case U_do: return DO;
case U_else: return ELSE;
case U_elseif: return ELSEIF;
case U_end: return END;
case U_function: return FUNCTION;
case U_if: return IF;
case U_local: return LOCAL;
case U_nil: return NIL;
case U_not: return NOT;
case U_or: return OR;
case U_repeat: return REPEAT;
case U_return: return RETURN;
case U_then: return THEN;
case U_until: return UNTIL;
case U_while: return WHILE;
case U_le: return LE;
case U_ge: return GE;
case U_ne: return NE;
case U_sc: return CONC;
default: /* also end of file */ default: /* also end of file */
{ {
save_and_next(); save_and_next();
return yytext[currentText][0]; return yytext[currentText][0];
} }
} }
} }
} }