LL(1)- Pascal, :
- Pascal pascal_scaner(), . , EOF . lexema[], .
- index_elem () ( ) .
#include <stdio.h>
#include "mystand.h"
/* i */
#define MAX_STACK 200
int STACK[MAX_STACK], POS_STACK=0;
#define NULL_STACK() (POS_STACK? 0: 1)
#define COPY_STACK() (STACK[POS_STACK])
#define PUSH_STACK() (POS_STACK? --POS_STACK:0)
#define DOWN_STACK(c) (POS_STACK < MAX_STACK? STACK[++POS_STACK]=c,1: 0)
extern int pascal_scaner(void); //
extern void scaner_close(void); // ,
extern char lexema[]; //
extern int lexema_code; //
extern int lexema_line; // ,
extern int lexema_pos; //
extern int index_elem(int *, int, int);
// :
// - LL(1) - - TABL_LL1_UPR.
// ʳ numnet - ,
// - (numtrm+1) -
// ,
// .
int index_elem(int *net_term, int num, int elem)
{ int i;
for (i=0; i < num; i++) if (*(net_term+i) = = elem) return i;
}
// i:
// - i lexema,
// - lexema_code .
// - E- (lexema_code==0), OF,
// i i lexema_code
// lexema_line , .
// lexema_pos , .
int ll1_parser_pascal(q,r)
struct node *q;
struct dnode *r;
{ struct node *qw; int i, line0, colomn, ind;
int upr;
/* i i */
STACK[0]=0; STACK[1]=*(q->pd); POS_STACK=1; ind=0; lexema_code=0;
/* i */
while (! NULL_STACK()) //
{ if (!ind) ind=1, pascal_scaner();
// A. i, i i
if (COPY_STACK() >= 0)
{ if (COPY_STACK() == lexema_code)
{ ind=0; PUSH_STACK(); continue; }
// if
if (strcmp(NAME_ELEM(COPY_STACK()),"else") == 0)
{ PUSH_STACK(); PUSH_STACK(); continue; } // if
//
|
|
printf(" : - %5.5i, i -
%3.3i\n",lexema_line,lexema_pos);
printf(" %s\n",NAME_ELEM(COPY_STACK()));
printf(" - %s, i - %s -
%s\n",NAME_ELEM(COPY_STACK()),lexema,NAME_ELEM(lexema_code));
scaner_close(); return(0);
}
// B. i, i i
line0=index_elem(netname,numnet,COPY_STACK());
if (lexema_code) colomn=index_elem(terminal,numtrm,lexema_code);
else colomn=numtrm;
if (upr= *(TABL_LL1_UPR+line0*(numtrm+1)+colomn))
{ PUSH_STACK();
//
for(qw=q,i=1; i < upr; i++,qw=qw->next);
//
for (i=qw->len-1; i > 0; i--) DOWN_STACK(*(qw->pd+i));
continue;
}
// i
printf(" : - %5.5i, i -
%3.3i\n",lexema_line,lexema_pos);
printf(" - %s, i - %s -
%s\n",NAME_ELEM(COPY_STACK()),lexema,NAME_ELEM(lexema_code));
scaner_close(); return(0);
} // i
// : i i
if (! ind) pascal_scaner(); scaner_close();
if (lexema_code == 0) {
printf("\n i \n");return(1);
}
else {
printf("\ni i i i \n");
return(0);
}
} // i