%{

char *rcs_lualex = "$Id: $";

#include <stdlib.h>
#include <string.h>

#include "opcode.h"
#include "hash.h"
#include "inout.h"
#include "table.h"
#include "y.tab.h"

#undef input
#undef unput

static Input input;
static Unput unput;

void lua_setinput (Input fn)
{
 input = fn;
}

void lua_setunput (Unput fn)
{
 unput = fn;
}

char *lua_lasttext (void)
{
 return yytext;
}

%}


%%
[ \t]*					;
^"$debug"				{yylval.vInt = 1; return DEBUG;}
^"$nodebug"				{yylval.vInt = 0; return DEBUG;}
\n					lua_linenumber++;
"--".*					;
"local"					return LOCAL;
"if"					return IF;
"then"					return THEN;
"else"					return ELSE;
"elseif"				return ELSEIF;
"while"					return WHILE;
"do"					return DO;
"repeat"				return REPEAT;
"until"					return UNTIL;
"function"				{
                                         yylval.vWord = lua_nfile-1;
                                         return FUNCTION;
					}
"end"					return END;
"return" 				return RETURN;
"local" 				return LOCAL;
"nil"					return NIL;
"and"					return AND;
"or"					return OR;
"not"					return NOT;
"~="					return NE;
"<="					return LE;
">="					return GE;
".."					return CONC;
\"[^\"]*\" 			| 
\'[^\']*\'			      {
				       yylval.vWord = lua_findenclosedconstant (yytext);
				       return STRING;
				      }
[0-9]+("."[0-9]*)?	|
([0-9]+)?"."[0-9]+	|
[0-9]+("."[0-9]*)?[dDeEgG][+-]?[0-9]+ |
([0-9]+)?"."[0-9]+[dDeEgG][+-]?[0-9]+ {
				        yylval.vFloat = atof(yytext);
				        return NUMBER;
				       }
[a-zA-Z_][a-zA-Z0-9_]*  	       {
					yylval.vWord = lua_findsymbol (yytext);
					return NAME;
				       }
.					return  *yytext;

