ING_DB
This commit is contained in:
parent
f65dea1b53
commit
f376daca1a
|
|
@ -0,0 +1,207 @@
|
||||||
|
# include <stdio.h>
|
||||||
|
# include "TABLES"
|
||||||
|
|
||||||
|
/*
|
||||||
|
** INTYACC -- interactive parser for yacc tables
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** insert YACC tables
|
||||||
|
**
|
||||||
|
** short yygo[] = { ... };
|
||||||
|
** short yypgo[] = { ... };
|
||||||
|
** short yyr1[] = { ... };
|
||||||
|
** short yyr2[] = { ... };
|
||||||
|
** short yyact[] = { ... };
|
||||||
|
** short yypact[] = { ... };
|
||||||
|
** char *yysterm[] = { ... };
|
||||||
|
**
|
||||||
|
** as file TABLES !!!
|
||||||
|
*/
|
||||||
|
|
||||||
|
# define ACTION(state) ((state) & 07777)
|
||||||
|
# define OPERATION(state) ((state) >> 12)
|
||||||
|
|
||||||
|
/* the OPERATIONS */
|
||||||
|
# define ERROR 0
|
||||||
|
# define SKIP 1
|
||||||
|
# define SHIFT 2
|
||||||
|
# define REDUCE 3
|
||||||
|
# define ACCEPT 4
|
||||||
|
|
||||||
|
/* SIZE for state and value stack */
|
||||||
|
# define MAXDEPTH 150
|
||||||
|
|
||||||
|
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
register int state; /* current parser state */
|
||||||
|
register int token; /* current input token number */
|
||||||
|
short states[MAXDEPTH]; /* state stack */
|
||||||
|
register short *ps; /* pointer to state stack */
|
||||||
|
int values[10 * MAXDEPTH]; /* token stack */
|
||||||
|
register int *pv; /* pointer to token stack */
|
||||||
|
register short *act; /* pointer to performing action */
|
||||||
|
register int next_state;
|
||||||
|
register int i;
|
||||||
|
int r_ahead; /* read ahead flag */
|
||||||
|
int new_alter; /* flag for a new alternative */
|
||||||
|
int alter[50]; /* alternative stack */
|
||||||
|
int a; /* pointer to alternative stack */
|
||||||
|
char cbuf[6]; /* character buffer */
|
||||||
|
char *c; /* pointer to character buffer */
|
||||||
|
|
||||||
|
newstart:
|
||||||
|
values[0] = -2; /* no TOKEN given ! ! ! */
|
||||||
|
|
||||||
|
restart:
|
||||||
|
printf("\n\n");
|
||||||
|
state = 0;
|
||||||
|
token = -1;
|
||||||
|
ps = &states[-1];
|
||||||
|
pv = &values[-1];
|
||||||
|
|
||||||
|
stack:
|
||||||
|
*++ps = state; /* push state into state stack */
|
||||||
|
|
||||||
|
new_state:
|
||||||
|
/* set act to point to the parsing actions for the new state */
|
||||||
|
i = yypact[state + 1];
|
||||||
|
act = &yyact[i];
|
||||||
|
|
||||||
|
next_action: /* get the next action, and perform it */
|
||||||
|
next_state = ACTION(*act);
|
||||||
|
switch (OPERATION(*act++)) /* switch on operation */
|
||||||
|
{
|
||||||
|
case SKIP:
|
||||||
|
if (r_ahead = token == -1)
|
||||||
|
{
|
||||||
|
/* get next token */
|
||||||
|
token = *++pv;
|
||||||
|
a = 0;
|
||||||
|
new_alter = 1;
|
||||||
|
}
|
||||||
|
if (token == -2)
|
||||||
|
{
|
||||||
|
if (new_alter)
|
||||||
|
printf("\n(%2d)", a);
|
||||||
|
else
|
||||||
|
new_alter = 1;
|
||||||
|
if (next_state)
|
||||||
|
printf(" %s", yysterm[next_state - 256]);
|
||||||
|
else
|
||||||
|
printf(" EOF");
|
||||||
|
alter[a++] = next_state;
|
||||||
|
}
|
||||||
|
if (next_state != token)
|
||||||
|
{
|
||||||
|
act++;
|
||||||
|
if (token != -2)
|
||||||
|
{
|
||||||
|
token = -1;
|
||||||
|
--pv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (r_ahead)
|
||||||
|
{
|
||||||
|
if (next_state)
|
||||||
|
printf(" %s", yysterm[next_state - 256]);
|
||||||
|
else
|
||||||
|
printf(" EOF");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (next_state)
|
||||||
|
printf(" %s", yysterm[next_state - 256]);
|
||||||
|
else
|
||||||
|
printf(" EOF");
|
||||||
|
}
|
||||||
|
goto next_action; /* get next action */
|
||||||
|
|
||||||
|
case SHIFT: /* goto next_state */
|
||||||
|
state = next_state;
|
||||||
|
token = -1;
|
||||||
|
goto stack; /* stack new state and value */
|
||||||
|
|
||||||
|
case REDUCE: /* rule next_state */
|
||||||
|
if (token == -2 && new_alter)
|
||||||
|
{
|
||||||
|
printf("\n(%2d)", a);
|
||||||
|
new_alter = 0;
|
||||||
|
}
|
||||||
|
printf(" R%d", next_state);
|
||||||
|
ps -= yyr2[next_state]; /* pop state stack */
|
||||||
|
|
||||||
|
/* consult goto table to find next state */
|
||||||
|
i = yyr1[next_state];
|
||||||
|
i = yypgo[i];
|
||||||
|
act = &yygo[i];
|
||||||
|
next_state = *ps;
|
||||||
|
for ( ; *act != next_state && *act >= 0; act += 2)
|
||||||
|
continue;
|
||||||
|
state = act[1];
|
||||||
|
goto stack; /* stack new state and value */
|
||||||
|
|
||||||
|
case ACCEPT:
|
||||||
|
printf("\n\nE N D[J O F G R A M M A R\n");
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
case ERROR:
|
||||||
|
if (token != -2)
|
||||||
|
{
|
||||||
|
printf("\n\nU N E X P E C T E D E R R O R\n");
|
||||||
|
return (2);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = a - 1;
|
||||||
|
if (a == 1)
|
||||||
|
goto suggest;
|
||||||
|
|
||||||
|
/* read alternative */
|
||||||
|
printf("\n(??) ");
|
||||||
|
fflush(stdout);
|
||||||
|
c = cbuf;
|
||||||
|
while (*c = getchar())
|
||||||
|
{
|
||||||
|
switch (*c)
|
||||||
|
{
|
||||||
|
case '\n':
|
||||||
|
*c = 0;
|
||||||
|
goto newtoken;
|
||||||
|
|
||||||
|
case '\b':
|
||||||
|
*--pv = -2;
|
||||||
|
printf("q");
|
||||||
|
break;
|
||||||
|
case '\033':
|
||||||
|
goto restart;
|
||||||
|
|
||||||
|
case '\025':
|
||||||
|
goto newstart;
|
||||||
|
|
||||||
|
case '0':
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
c++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
newtoken:
|
||||||
|
i = atoi(cbuf);
|
||||||
|
suggest:
|
||||||
|
if (i >= a)
|
||||||
|
{
|
||||||
|
printf("\n\nG R A M M A R I N T E R R U P T E D\n");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
*pv++ = alter[i];
|
||||||
|
*pv = -2;
|
||||||
|
goto restart;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue