lexer updates
Bump the number of nodes (%e) specified in lev_comp.l so that the lex on Solaris doesn't choke. flex doesn't use those paramters (%e, %p, and a few others), so this change gets accepted but hasn't been adequately tested to verify that it solves the problem. Reformat some of the C code at the end of dgn_comp.l and lev_comp.l; going through the whole thing isn't worth the effort, particularly since flex generates such a mess in the rest of the code it produces. I haven't updated sys/share/*_lex.c and they definitely need it now. I've got an older version of flex than the one that was used on the code that's there now, and the most recent version. Both of those produce different code--the stuff that's there now has been through more testing so whatever version was used for it ought to be used for new editions.
This commit is contained in:
+18
-13
@@ -1,5 +1,5 @@
|
|||||||
%{
|
%{
|
||||||
/* NetHack 3.6 dgn_comp.l $NHDT-Date: 1432512785 2015/05/25 00:13:05 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */
|
/* NetHack 3.6 dgn_comp.l $NHDT-Date: 1448710672 2015/11/28 11:37:52 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ */
|
||||||
/* Copyright (c) 1989 by Jean-Christophe Collet */
|
/* Copyright (c) 1989 by Jean-Christophe Collet */
|
||||||
/* Copyright (c) 1990 by M. Stephenson */
|
/* Copyright (c) 1990 by M. Stephenson */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
@@ -55,7 +55,11 @@ void FDECL(yyoutput, (int));
|
|||||||
int FDECL(yyunput, (int));
|
int FDECL(yyunput, (int));
|
||||||
int FDECL(yyoutput, (int));
|
int FDECL(yyoutput, (int));
|
||||||
# endif
|
# endif
|
||||||
#endif /* !FLEX_SCANNER && !FLEXHACK_SCANNER */
|
|
||||||
|
#else /* !FLEX_SCANNER && !FLEXHACK_SCANNER */
|
||||||
|
/* most recent flex allows suppressing yyunput() altogether when not needed */
|
||||||
|
#define YY_NO_UNPUT
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef FLEX_SCANNER
|
#ifdef FLEX_SCANNER
|
||||||
#define YY_MALLOC_DECL \
|
#define YY_MALLOC_DECL \
|
||||||
@@ -106,10 +110,9 @@ RNDLEVEL return(RNDLEVEL);
|
|||||||
CHAINLEVEL return(CHLEVEL);
|
CHAINLEVEL return(CHLEVEL);
|
||||||
RNDCHLEVEL return(RNDCHLEVEL);
|
RNDCHLEVEL return(RNDCHLEVEL);
|
||||||
[-0-9]+ { yylval.i=atoi(yytext); return(INTEGER); }
|
[-0-9]+ { yylval.i=atoi(yytext); return(INTEGER); }
|
||||||
\"[^"]*\" { yytext[yyleng-1] = 0; /* Discard the trailing \" */
|
\"[^"]*\" { yytext[yyleng - 1] = '\0'; /* discard the trailing \" */
|
||||||
yylval.str = (char *) alloc(strlen(yytext+1)+1);
|
yylval.str = dupstr(yytext + 1); /* skip the first \" */
|
||||||
Strcpy(yylval.str, yytext+1); /* Discard the first \" */
|
return STRING; }
|
||||||
return(STRING); }
|
|
||||||
^#.*\n { nh_line_number++; }
|
^#.*\n { nh_line_number++; }
|
||||||
\r?\n { nh_line_number++; }
|
\r?\n { nh_line_number++; }
|
||||||
[ \t]+ ; /* skip trailing tabs & spaces */
|
[ \t]+ ; /* skip trailing tabs & spaces */
|
||||||
@@ -117,21 +120,23 @@ RNDCHLEVEL return(RNDCHLEVEL);
|
|||||||
%%
|
%%
|
||||||
|
|
||||||
/* routine to switch to another input file; needed for flex */
|
/* routine to switch to another input file; needed for flex */
|
||||||
void init_yyin( input_f )
|
void
|
||||||
|
init_yyin( input_f )
|
||||||
FILE *input_f;
|
FILE *input_f;
|
||||||
{
|
{
|
||||||
#if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER)
|
#if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER)
|
||||||
if (yyin)
|
if (yyin)
|
||||||
yyrestart(input_f);
|
yyrestart(input_f);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
yyin = input_f;
|
yyin = input_f;
|
||||||
}
|
}
|
||||||
/* analogous routine (for completeness) */
|
/* analogous routine (for completeness) */
|
||||||
void init_yyout( output_f )
|
void
|
||||||
|
init_yyout( output_f )
|
||||||
FILE *output_f;
|
FILE *output_f;
|
||||||
{
|
{
|
||||||
yyout = output_f;
|
yyout = output_f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*dgn_comp.l*/
|
/*dgn_comp.l*/
|
||||||
|
|||||||
+70
-51
@@ -1,5 +1,5 @@
|
|||||||
%{
|
%{
|
||||||
/* NetHack 3.6 lev_comp.l $NHDT-Date: 1432512785 2015/05/25 00:13:05 $ $NHDT-Branch: master $:$NHDT-Revision: 1.19 $ */
|
/* NetHack 3.6 lev_comp.l $NHDT-Date: 1448710678 2015/11/28 11:37:58 $ $NHDT-Branch: master $:$NHDT-Revision: 1.21 $ */
|
||||||
/* Copyright (c) 1989 by Jean-Christophe Collet */
|
/* Copyright (c) 1989 by Jean-Christophe Collet */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|
||||||
@@ -53,7 +53,11 @@ void FDECL(yyoutput, (int));
|
|||||||
int FDECL(yyunput, (int));
|
int FDECL(yyunput, (int));
|
||||||
int FDECL(yyoutput, (int));
|
int FDECL(yyoutput, (int));
|
||||||
# endif
|
# endif
|
||||||
#endif /* !FLEX_SCANNER && !FLEXHACK_SCANNER */
|
|
||||||
|
#else /* !FLEX_SCANNER && !FLEXHACK_SCANNER */
|
||||||
|
/* most recent flex allows suppressing yyunput() altogether when not needed */
|
||||||
|
#define YY_NO_UNPUT
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef FLEX_SCANNER
|
#ifdef FLEX_SCANNER
|
||||||
#define YY_MALLOC_DECL \
|
#define YY_MALLOC_DECL \
|
||||||
@@ -96,7 +100,7 @@ FILE *orig_yyin = NULL;
|
|||||||
#define ST_RETF(y, x) do { savetoken(yytext); y; return x; } while (0);
|
#define ST_RETF(y, x) do { savetoken(yytext); y; return x; } while (0);
|
||||||
|
|
||||||
%}
|
%}
|
||||||
%e 1500
|
%e 2000
|
||||||
%p 5000
|
%p 5000
|
||||||
%n 700
|
%n 700
|
||||||
%s MAPC
|
%s MAPC
|
||||||
@@ -114,14 +118,15 @@ FILE *orig_yyin = NULL;
|
|||||||
int len = yyleng;
|
int len = yyleng;
|
||||||
savetoken(yytext);
|
savetoken(yytext);
|
||||||
/* convert \r\n to \n */
|
/* convert \r\n to \n */
|
||||||
if (len >= 2 && yytext[len - 2] == '\r') len -= 1;
|
if (len >= 2 && yytext[len - 2] == '\r')
|
||||||
|
len -= 1;
|
||||||
(void) strncpy(map + map_cnt, yytext, len);
|
(void) strncpy(map + map_cnt, yytext, len);
|
||||||
map_cnt += len;
|
map_cnt += len;
|
||||||
map[map_cnt - 1] = '\n';
|
map[map_cnt - 1] = '\n';
|
||||||
map[map_cnt] = '\0';
|
map[map_cnt] = '\0';
|
||||||
newline();
|
newline();
|
||||||
}
|
}
|
||||||
^[ \t]*#.*\n { savetoken(yytext); newline(); }
|
^[ \t]*#.*\n { savetoken(yytext); newline(); }
|
||||||
MESSAGE ST_RET(MESSAGE_ID);
|
MESSAGE ST_RET(MESSAGE_ID);
|
||||||
NOMAP ST_RET(NOMAP_ID);
|
NOMAP ST_RET(NOMAP_ID);
|
||||||
MAZE ST_RET(MAZE_ID);
|
MAZE ST_RET(MAZE_ID);
|
||||||
@@ -287,7 +292,7 @@ cursed { savetoken(yytext); yylval.i=3; return CURSE_TYPE; }
|
|||||||
noteleport { savetoken(yytext); yylval.i=NOTELEPORT; return FLAG_TYPE; }
|
noteleport { savetoken(yytext); yylval.i=NOTELEPORT; return FLAG_TYPE; }
|
||||||
hardfloor { savetoken(yytext); yylval.i=HARDFLOOR; return FLAG_TYPE; }
|
hardfloor { savetoken(yytext); yylval.i=HARDFLOOR; return FLAG_TYPE; }
|
||||||
nommap { savetoken(yytext); yylval.i=NOMMAP; return FLAG_TYPE; }
|
nommap { savetoken(yytext); yylval.i=NOMMAP; return FLAG_TYPE; }
|
||||||
arboreal { savetoken(yytext); yylval.i=ARBOREAL; return FLAG_TYPE; } /* KMH */
|
arboreal { savetoken(yytext); yylval.i=ARBOREAL; return FLAG_TYPE; } /* KMH */
|
||||||
shortsighted { savetoken(yytext); yylval.i=SHORTSIGHTED; return FLAG_TYPE; }
|
shortsighted { savetoken(yytext); yylval.i=SHORTSIGHTED; return FLAG_TYPE; }
|
||||||
mazelevel { savetoken(yytext); yylval.i=MAZELEVEL; return FLAG_TYPE; }
|
mazelevel { savetoken(yytext); yylval.i=MAZELEVEL; return FLAG_TYPE; }
|
||||||
premapped { savetoken(yytext); yylval.i=PREMAPPED; return FLAG_TYPE; }
|
premapped { savetoken(yytext); yylval.i=PREMAPPED; return FLAG_TYPE; }
|
||||||
@@ -297,14 +302,15 @@ icedpools { savetoken(yytext); yylval.i=ICEDPOOLS; return FLAG_TYPE; }
|
|||||||
solidify { savetoken(yytext); yylval.i=SOLIDIFY; return FLAG_TYPE; }
|
solidify { savetoken(yytext); yylval.i=SOLIDIFY; return FLAG_TYPE; }
|
||||||
corrmaze { savetoken(yytext); yylval.i=CORRMAZE; return FLAG_TYPE; }
|
corrmaze { savetoken(yytext); yylval.i=CORRMAZE; return FLAG_TYPE; }
|
||||||
inaccessibles { savetoken(yytext); yylval.i=CHECK_INACCESSIBLES; return FLAG_TYPE; }
|
inaccessibles { savetoken(yytext); yylval.i=CHECK_INACCESSIBLES; return FLAG_TYPE; }
|
||||||
[0-9]+d[0-9]+ { char *p = strchr(yytext, 'd');
|
[0-9]+d[0-9]+ { char *p = index(yytext, 'd');
|
||||||
savetoken(yytext);
|
savetoken(yytext);
|
||||||
if (p) {
|
if (p) {
|
||||||
*p = '\0';
|
*p++ = '\0';
|
||||||
p++;
|
yylval.dice.num = atoi(yytext);
|
||||||
yylval.dice.num=atoi(yytext);
|
yylval.dice.die = atoi(p);
|
||||||
yylval.dice.die=atoi(p);
|
} else {
|
||||||
} else { yylval.dice.num = yylval.dice.die = 1; }
|
yylval.dice.num = yylval.dice.die = 1;
|
||||||
|
}
|
||||||
return DICE;
|
return DICE;
|
||||||
}
|
}
|
||||||
\[\ *[0-9]+\%\ *\] { savetoken(yytext); yylval.i = atoi(yytext + 1);
|
\[\ *[0-9]+\%\ *\] { savetoken(yytext); yylval.i = atoi(yytext + 1);
|
||||||
@@ -319,9 +325,8 @@ inaccessibles { savetoken(yytext); yylval.i=CHECK_INACCESSIBLES; return FLAG_T
|
|||||||
return SPERCENT; }
|
return SPERCENT; }
|
||||||
[0-9]+ { savetoken(yytext); yylval.i=atoi(yytext); return INTEGER; }
|
[0-9]+ { savetoken(yytext); yylval.i=atoi(yytext); return INTEGER; }
|
||||||
\"[^"]*\" { savetoken(yytext);
|
\"[^"]*\" { savetoken(yytext);
|
||||||
yytext[yyleng-1] = 0; /* Discard the trailing \" */
|
yytext[yyleng - 1] = '\0'; /* discard the trailing \" */
|
||||||
yylval.map = (char *) alloc(strlen(yytext+1)+1);
|
yylval.map = dupstr(yytext + 1); /* skip the first \" */
|
||||||
Strcpy(yylval.map, yytext+1); /* Discard the first \" */
|
|
||||||
return STRING; }
|
return STRING; }
|
||||||
\$[a-zA-Z_]+ { savetoken(yytext); return handle_varstring_check(); }
|
\$[a-zA-Z_]+ { savetoken(yytext); return handle_varstring_check(); }
|
||||||
"==" { savetoken(yytext); yylval.i = SPO_JE; return COMPARE_TYPE; }
|
"==" { savetoken(yytext); yylval.i = SPO_JE; return COMPARE_TYPE; }
|
||||||
@@ -339,77 +344,91 @@ inaccessibles { savetoken(yytext); yylval.i=CHECK_INACCESSIBLES; return FLAG_T
|
|||||||
. { savetoken(yytext); return yytext[0]; }
|
. { savetoken(yytext); return yytext[0]; }
|
||||||
%%
|
%%
|
||||||
#ifdef AMIGA
|
#ifdef AMIGA
|
||||||
long *alloc(n)
|
long *
|
||||||
unsigned n;
|
alloc(n)
|
||||||
|
unsigned n;
|
||||||
{
|
{
|
||||||
return ((long *)malloc (n));
|
return (long *) malloc(n);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* routine to switch to another input file; needed for flex */
|
/* routine to switch to another input file; needed for flex */
|
||||||
void init_yyin( input_f )
|
void
|
||||||
|
init_yyin( input_f )
|
||||||
FILE *input_f;
|
FILE *input_f;
|
||||||
{
|
{
|
||||||
#if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER)
|
#if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER)
|
||||||
if (yyin)
|
if (yyin)
|
||||||
yyrestart(input_f);
|
yyrestart(input_f);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
yyin = input_f;
|
yyin = input_f;
|
||||||
if (!orig_yyin) orig_yyin = yyin;
|
|
||||||
|
if (!orig_yyin)
|
||||||
|
orig_yyin = yyin;
|
||||||
}
|
}
|
||||||
/* analogous routine (for completeness) */
|
/* analogous routine (for completeness) */
|
||||||
void init_yyout( output_f )
|
void
|
||||||
|
init_yyout( output_f )
|
||||||
FILE *output_f;
|
FILE *output_f;
|
||||||
{
|
{
|
||||||
yyout = output_f;
|
yyout = output_f;
|
||||||
}
|
}
|
||||||
|
|
||||||
long
|
long
|
||||||
handle_varstring_check()
|
handle_varstring_check()
|
||||||
{
|
{
|
||||||
struct lc_vardefs *vd;
|
struct lc_vardefs *vd;
|
||||||
yylval.map = (char *) alloc(strlen(yytext)+1);
|
|
||||||
Strcpy(yylval.map, yytext);
|
|
||||||
if ((vd = vardef_defined(variable_definitions, yytext, 1))) {
|
|
||||||
long l = vd->var_type;
|
|
||||||
long a = ((l & SPOVAR_ARRAY) == SPOVAR_ARRAY);
|
|
||||||
l = (l & ~SPOVAR_ARRAY);
|
|
||||||
if (l == SPOVAR_INT) return (a ? VARSTRING_INT_ARRAY : VARSTRING_INT);
|
|
||||||
if (l == SPOVAR_STRING) return (a ? VARSTRING_STRING_ARRAY : VARSTRING_STRING);
|
|
||||||
if (l == SPOVAR_VARIABLE) return (a ? VARSTRING_VAR_ARRAY : VARSTRING_VAR);
|
|
||||||
if (l == SPOVAR_COORD) return (a ? VARSTRING_COORD_ARRAY : VARSTRING_COORD);
|
|
||||||
if (l == SPOVAR_REGION) return (a ? VARSTRING_REGION_ARRAY : VARSTRING_REGION);
|
|
||||||
if (l == SPOVAR_MAPCHAR) return (a ? VARSTRING_MAPCHAR_ARRAY : VARSTRING_MAPCHAR);
|
|
||||||
if (l == SPOVAR_MONST) return (a ? VARSTRING_MONST_ARRAY : VARSTRING_MONST);
|
|
||||||
if (l == SPOVAR_OBJ) return (a ? VARSTRING_OBJ_ARRAY : VARSTRING_OBJ);
|
|
||||||
if (l == SPOVAR_SEL) return (a ? VARSTRING_SEL_ARRAY : VARSTRING_SEL);
|
|
||||||
}
|
|
||||||
return VARSTRING;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
yylval.map = dupstr(yytext);
|
||||||
|
if ((vd = vardef_defined(variable_definitions, yytext, 1)) != 0) {
|
||||||
|
long l = vd->var_type;
|
||||||
|
int a = ((l & SPOVAR_ARRAY) == SPOVAR_ARRAY);
|
||||||
|
|
||||||
|
l &= ~SPOVAR_ARRAY;
|
||||||
|
if (l == SPOVAR_INT)
|
||||||
|
return (a ? VARSTRING_INT_ARRAY : VARSTRING_INT);
|
||||||
|
if (l == SPOVAR_STRING)
|
||||||
|
return (a ? VARSTRING_STRING_ARRAY : VARSTRING_STRING);
|
||||||
|
if (l == SPOVAR_VARIABLE)
|
||||||
|
return (a ? VARSTRING_VAR_ARRAY : VARSTRING_VAR);
|
||||||
|
if (l == SPOVAR_COORD)
|
||||||
|
return (a ? VARSTRING_COORD_ARRAY : VARSTRING_COORD);
|
||||||
|
if (l == SPOVAR_REGION)
|
||||||
|
return (a ? VARSTRING_REGION_ARRAY : VARSTRING_REGION);
|
||||||
|
if (l == SPOVAR_MAPCHAR)
|
||||||
|
return (a ? VARSTRING_MAPCHAR_ARRAY : VARSTRING_MAPCHAR);
|
||||||
|
if (l == SPOVAR_MONST)
|
||||||
|
return (a ? VARSTRING_MONST_ARRAY : VARSTRING_MONST);
|
||||||
|
if (l == SPOVAR_OBJ)
|
||||||
|
return (a ? VARSTRING_OBJ_ARRAY : VARSTRING_OBJ);
|
||||||
|
if (l == SPOVAR_SEL)
|
||||||
|
return (a ? VARSTRING_SEL_ARRAY : VARSTRING_SEL);
|
||||||
|
}
|
||||||
|
return VARSTRING;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
newline()
|
newline()
|
||||||
{
|
{
|
||||||
nh_line_number++;
|
nh_line_number++;
|
||||||
token_start_pos = 0;
|
token_start_pos = 0;
|
||||||
memset(curr_token, 0, 512);
|
(void) memset((genericptr_t) curr_token, 0, 512);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
savetoken(s)
|
savetoken(s)
|
||||||
char *s;
|
char *s;
|
||||||
{
|
{
|
||||||
sprintf(curr_token, "%s", s);
|
Sprintf(curr_token, "%s", s);
|
||||||
advancepos(s);
|
advancepos(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
advancepos(s)
|
advancepos(s)
|
||||||
char *s;
|
char *s;
|
||||||
{
|
{
|
||||||
token_start_pos += strlen(s);
|
token_start_pos += strlen(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*lev_comp.l*/
|
/*lev_comp.l*/
|
||||||
|
|||||||
Reference in New Issue
Block a user