.


:




:

































 

 

 

 


LL(1)- Pascal




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

 





:


: 2015-11-05; !; : 543 |


:

:

: , .
==> ...

2146 - | 1782 -


© 2015-2024 lektsii.org - -

: 0.013 .