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:
PatR
2015-11-28 03:38:03 -08:00
parent e5e9ca8122
commit c134af7a77
2 changed files with 88 additions and 64 deletions

View File

@@ -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) 1990 by M. Stephenson */
/* NetHack may be freely redistributed. See license for details. */
@@ -55,7 +55,11 @@ void FDECL(yyoutput, (int));
int FDECL(yyunput, (int));
int FDECL(yyoutput, (int));
# 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
#define YY_MALLOC_DECL \
@@ -106,10 +110,9 @@ RNDLEVEL return(RNDLEVEL);
CHAINLEVEL return(CHLEVEL);
RNDCHLEVEL return(RNDCHLEVEL);
[-0-9]+ { yylval.i=atoi(yytext); return(INTEGER); }
\"[^"]*\" { yytext[yyleng-1] = 0; /* Discard the trailing \" */
yylval.str = (char *) alloc(strlen(yytext+1)+1);
Strcpy(yylval.str, yytext+1); /* Discard the first \" */
return(STRING); }
\"[^"]*\" { yytext[yyleng - 1] = '\0'; /* discard the trailing \" */
yylval.str = dupstr(yytext + 1); /* skip the first \" */
return STRING; }
^#.*\n { nh_line_number++; }
\r?\n { nh_line_number++; }
[ \t]+ ; /* skip trailing tabs & spaces */
@@ -117,21 +120,23 @@ RNDCHLEVEL return(RNDCHLEVEL);
%%
/* routine to switch to another input file; needed for flex */
void init_yyin( input_f )
void
init_yyin( input_f )
FILE *input_f;
{
#if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER)
if (yyin)
yyrestart(input_f);
else
if (yyin)
yyrestart(input_f);
else
#endif
yyin = input_f;
yyin = input_f;
}
/* analogous routine (for completeness) */
void init_yyout( output_f )
void
init_yyout( output_f )
FILE *output_f;
{
yyout = output_f;
yyout = output_f;
}
/*dgn_comp.l*/

View File

@@ -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 */
/* NetHack may be freely redistributed. See license for details. */
@@ -53,7 +53,11 @@ void FDECL(yyoutput, (int));
int FDECL(yyunput, (int));
int FDECL(yyoutput, (int));
# 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
#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);
%}
%e 1500
%e 2000
%p 5000
%n 700
%s MAPC
@@ -114,14 +118,15 @@ FILE *orig_yyin = NULL;
int len = yyleng;
savetoken(yytext);
/* 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);
map_cnt += len;
map[map_cnt - 1] = '\n';
map[map_cnt] = '\0';
newline();
}
^[ \t]*#.*\n { savetoken(yytext); newline(); }
^[ \t]*#.*\n { savetoken(yytext); newline(); }
MESSAGE ST_RET(MESSAGE_ID);
NOMAP ST_RET(NOMAP_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; }
hardfloor { savetoken(yytext); yylval.i=HARDFLOOR; 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; }
mazelevel { savetoken(yytext); yylval.i=MAZELEVEL; 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; }
corrmaze { savetoken(yytext); yylval.i=CORRMAZE; 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);
if (p) {
*p = '\0';
p++;
yylval.dice.num=atoi(yytext);
yylval.dice.die=atoi(p);
} else { yylval.dice.num = yylval.dice.die = 1; }
*p++ = '\0';
yylval.dice.num = atoi(yytext);
yylval.dice.die = atoi(p);
} else {
yylval.dice.num = yylval.dice.die = 1;
}
return DICE;
}
\[\ *[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; }
[0-9]+ { savetoken(yytext); yylval.i=atoi(yytext); return INTEGER; }
\"[^"]*\" { savetoken(yytext);
yytext[yyleng-1] = 0; /* Discard the trailing \" */
yylval.map = (char *) alloc(strlen(yytext+1)+1);
Strcpy(yylval.map, yytext+1); /* Discard the first \" */
yytext[yyleng - 1] = '\0'; /* discard the trailing \" */
yylval.map = dupstr(yytext + 1); /* skip the first \" */
return STRING; }
\$[a-zA-Z_]+ { savetoken(yytext); return handle_varstring_check(); }
"==" { 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]; }
%%
#ifdef AMIGA
long *alloc(n)
unsigned n;
long *
alloc(n)
unsigned n;
{
return ((long *)malloc (n));
return (long *) malloc(n);
}
#endif
/* routine to switch to another input file; needed for flex */
void init_yyin( input_f )
void
init_yyin( input_f )
FILE *input_f;
{
#if defined(FLEX_SCANNER) || defined(FLEXHACK_SCANNER)
if (yyin)
yyrestart(input_f);
else
if (yyin)
yyrestart(input_f);
else
#endif
yyin = input_f;
if (!orig_yyin) orig_yyin = yyin;
yyin = input_f;
if (!orig_yyin)
orig_yyin = yyin;
}
/* analogous routine (for completeness) */
void init_yyout( output_f )
void
init_yyout( output_f )
FILE *output_f;
{
yyout = output_f;
yyout = output_f;
}
long
handle_varstring_check()
{
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;
}
struct lc_vardefs *vd;
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
newline()
{
nh_line_number++;
token_start_pos = 0;
memset(curr_token, 0, 512);
nh_line_number++;
token_start_pos = 0;
(void) memset((genericptr_t) curr_token, 0, 512);
}
void
savetoken(s)
char *s;
{
sprintf(curr_token, "%s", s);
advancepos(s);
Sprintf(curr_token, "%s", s);
advancepos(s);
}
void
advancepos(s)
char *s;
{
token_start_pos += strlen(s);
token_start_pos += strlen(s);
}
/*lev_comp.l*/