added support for ugly tokens
This commit is contained in:
83
lex.c
83
lex.c
@@ -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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user