lpmud/mudlib/
lpmud/mudlib/doc/
lpmud/mudlib/doc/LPC/
lpmud/mudlib/log/
lpmud/mudlib/players/
lpmud/mudlib/room/maze1/
lpmud/mudlib/room/sub/
%{
#include "os.h"
#include "y.tab.h"
#include "lnode.h"
#include "config.h"

int current_line;
char *current_file;

void start_new_file(FILE *f);

static int ident(char *str);
static int number(char *str);
static int string(char *str);

#ifdef FLEX
#define yywrap() 1
#endif

/* lang.y */
extern int current_number_of_locals;
extern char *local_names[];
extern char *argument_name;
extern YYSTYPE yylval;
extern void yyerror(char *str);

/* main.c */
extern char *string_copy(char *str);
extern void *xalloc(int size);

%}
%p 4000
%%
";"	{ return ';'; }
"("	{ return '('; }
")"	{ return ')'; }
","	{ return ','; }
"{"	{ return '{'; }
"}"	{ return '}'; }
"!"	{ return F_NOT; }
"&&"	{ return F_AND; }
"||"	{ return F_OR; }
"="	{ return '='; }
"-"	{ return '-'; }
"-="	{ return F_SUB_EQ; }
"+"	{ return '+'; }
"+="	{ return F_ADD_EQ; }
"*"	{ return '*'; }
"*="	{ return F_MULT_EQ; }
"%"	{ return '%'; }
"%="	{ return F_MOD_EQ; }
"/"	{ return '/'; }
"/="	{ return F_DIV_EQ; }
"<"	{ return '<'; }
">"	{ return '>'; }
">="	{ return F_GE; }
"<="	{ return F_LE; }
"=="	{ return F_EQ; }
"!="	{ return F_NE; }
"#"	{ return '#'; }
"#line"	{ return '#'; }
"["	{ return '['; }
"]"	{ return ']'; }
[0-9]+	{ return number(yytext); }
'.'	{ yylval.lnode = (struct lnode *)alloc_lnode_number(F_NUMBER,
							    yytext[1]);
          return F_NUMBER; }
"ls"	{ return F_LS; }
"cat"	{ return F_CAT; }
"rm"	{ return F_RM; }
"log_file" { return F_LOG_FILE; }
"else"	{ return F_ELSE; }
"find_living" { return F_FIND_LIVING; }
"find_player" { return F_FIND_PLAYER; }
"tell_object" { return F_TELL_OBJECT; }
"people" { return F_PEOPLE; }
"snoop" { return F_SNOOP; }
"input_to" { return F_INPUT_TO; }
"wizlist" { return F_WIZLIST; }
"crypt" { return F_CRYPT; }
"first_inventory" { return F_FIRST_INVENTORY; }
"regcomp"	 { return F_REGCOMP; }
"regexec"	 { return F_REGEXEC; }
"transfer"	 { return F_TRANSFER; }
"next_inventory" { return F_NEXT_INVENTORY; }
"string" { return F_STRING_DECL; }
"shout"	{ return F_SHOUT; }
"sscanf" { return F_SSCANF; }
"ed"	{ return F_ED; }
"localcmd" { return F_LOCALCMD; }
"swap"	{ return F_SWAP; }
"break"	{ return F_BREAK; }
"continue" { return F_CONTINUE; }
"while"	{ return F_WHILE; }
"capitalize" { return F_CAPITALIZE; }
"living" { return F_LIVING; }
"lower_case" { return F_LOWER_CASE; }
"set_heart_beat" { return F_SET_HEART_BEAT; }
"strlen" { return F_STRLEN; }
"say"	{ return F_SAY; }
"tell_room"	{ return F_TELL_ROOM; }
"find_object"   { return F_FIND_OBJECT; }
"add_worth"	{ return F_ADD_WORTH; }
"time"		{ return F_TIME; }
"create_wizard" { return F_CREATE_WIZARD; }
"destruct" { return F_DESTRUCT; }
"environment" { return F_ENVIRONMENT; }
"save_object" { return F_SAVE_OBJECT; }
"enable_commands" { return F_ENABLE_COMMANDS; }
"random" { return F_RANDOM; }
"restore_object" { return F_RESTORE_OBJECT; }
"this_object" { return F_THIS_OBJECT; }
"clone_object" { return F_CLONE_OBJECT; }
"this_player" { return F_THIS_PLAYER; }
"if"	{ return F_IF; }
"status" { return F_STATUS; }
"object" { return F_STATUS; }
"return" { return F_RETURN; }
"write" { return F_WRITE; }
"add_verb" { return F_ADD_VERB; }
"add_adj" { return F_ADD_ADJ; }
"add_subst" { return F_ADD_SUBST; }
"add_action" { return F_ADD_ACTION; }
"move_object" { return F_MOVE_OBJECT; }
"present" { return F_PRESENT; }
"command" { return F_COMMAND; }
"set_light" { return F_SET_LIGHT; }
"int"	{ return F_INT; }
"call_other" { return F_CALL_OTHER; }
"shutdown" { return F_SHUTDOWN; }
[_a-zA-Z][_a-zA-Z0-9]* { return ident(yytext); }
\"([^"\n]|\\\")*\"    { return string(yytext); }
[\t ]	{ break; }
"\n"	{ current_line++; }
"\r\n"	{ current_line++; }
.	{ char buff[100]; sprintf(buff, "Illegal character '%c'", yytext[0]);
	  yyerror(buff); }
%%


#ifdef LEX
int yywrap() { return 1; }
#endif

static int ident(char *str)
{
    int i;

    for (i=current_number_of_locals-1; i>=0; i--) {
	if (strcmp(local_names[i], str) == 0) {
	    yylval.lnode = (struct lnode *)alloc_lnode_number(F_LOCAL_NAME, i);
	    return F_LOCAL_NAME;
	}
    }
    if (argument_name && strcmp(str, argument_name) == 0)
	return F_ARGUMENT;
    yylval.string = string_copy(str);
    return F_IDENTIFIER;
}

static int string(char *str)
{
    char *p;

    p = xalloc(strlen(str) - 1);
    yylval.string = p;
    for (str++; str[1] != '\0'; str++, p++) {
	if (str[0] == '\\' && str[1] == 'n') {
	    *p = '\n';
	    str++;
	} else if (str[0] == '\\' && str[1] == 't') {
	    *p = '\t';
	    str++;
	} else if (str[0] == '\\' && str[1] == '"') {	/* LA */
	    *p = '"';					/* LA */
	    str++;					/* LA */
 	    if (!str[1]) {
 		yyerror("Unterminated string");
 		break;
 	    }

	} else
	    *p = *str;
    }
    *p = '\0';
    return F_STRING;
}

static int number(char *str)
{
    int i;

    i = atoi(str);
    if (i == 0) {
        yylval.lnode = (struct lnode *)alloc_lnode_single(F_CONST0);
	return F_CONST0;
    } else if (i == 1) {
	yylval.lnode = (struct lnode *)alloc_lnode_single(F_CONST1);
	return F_CONST1;
    }
    yylval.lnode =(struct lnode *)alloc_lnode_number(F_NUMBER, atoi(str));
    return F_NUMBER;
}

void start_new_file(FILE *f)
{
#ifdef FLEX
    yy_init = 1;
#endif
    yyin = f;
}