Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Lab7 Parser Zstepujacy
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #define max_il_synow 3
- #define max_szer_druku 100
- #define max_wys_druku 40
- typedef enum { FALSE = 0, TRUE = 1 } Boolean;
- typedef enum {
- Xx = 0,
- } nieterminal;
- typedef struct dr {
- Boolean czyterm;
- int ile;
- char lk; // o ile czyterm = TRUE
- nieterminal ntm; // o ile czyterm = FALSE
- int il_syn; // o ile czyterm = FALSE
- struct dr* syn[max_il_synow]; // o ile czyterm = FALSE
- } drzewo;
- //------------------------------------------------------
- // POMOCNICZE:
- char leks;
- Boolean nowyleks(char c, char* nleks) {
- // jesli na wejsciu stoi znak c , to go sczytuje,
- // zapamietuje w nleks i oddaje TRUE;
- // jesli tam stoi inny znak, to nic nie wczytuje i oddaje FALSE
- if (leks == c) {
- *nleks = c;
- do { scanf("%c", &leks); }
- while ((leks < '!' || leks > '~') && leks != '\n');
- return TRUE;
- }
- else return FALSE;
- }
- Boolean blad (char s[]) {
- // sygnalizacja bledu:
- // drukuje napis s a nastepnie przerywa wykonanie programu
- printf ("\n BLAD: %s\n\n", s); exit(1);
- return FALSE;
- }
- //------------------------------------------------------
- // Serce parsera:
- // PO JEDNEJ PROCEDURZE REKURSYWNEJ NA KAZDY NIETERMINAL
- //x(drzewo* drz);
- Boolean xniet(drzewo* drz){
- drzewo drz1; char nleks;
- if(nowyleks('a', &nleks)){
- // Jesli po a nie ma nic to terminal a jest ok
- // Jesli jest b to może ono wystapic dowolna n liczbe razy, potem terminal a,
- // nastepnie terminal c n liczbe razy i ok
- drz-> czyterm = TRUE;
- drz->syn[0]->lk = nleks;
- if(nowyleks(' ',&nleks)){
- return TRUE;
- }
- while(nowyleks('b', &nleks)){
- drz->czyterm = TRUE;
- drz->ile++;
- drz->syn[0]->lk = nleks;
- }
- if(!nowyleks('a',&nleks)){
- return FALSE;
- }
- while(nowyleks('b', &nleks)){
- drz1 = *drz;
- drz->czyterm = TRUE;
- drz->ile++;
- drz->syn[0]->lk = nleks;
- }
- //if(drz.ile!=drz1.ile) return FALSE;
- return TRUE;
- }
- return FALSE;
- }
- Boolean XX(drzewo* drz){
- drzewo drz1,drz2;
- char nleks;
- if(nowyleks('a',&nleks)){
- drz->czyterm=FALSE;
- drz->ntm=Xx;
- drz->il_syn=1;
- drz->syn[0]=(drzewo*)malloc(sizeof(drzewo));
- drz->syn[0]->czyterm=TRUE;
- drz->syn[0]->lk='a';
- while(nowyleks('b',&nleks)){
- if(XX(&drz1)){
- if(nowyleks('c',&nleks)){
- drz2=*drz;
- drz->czyterm=FALSE;
- drz->ntm=Xx;
- drz->il_syn=4;
- drz->syn[0] = (drzewo*)malloc(sizeof(drzewo));
- *(drz->syn[0])=drz2;
- }
- else blad("zle");}
- else blad("zle2");
- }
- return TRUE;
- }
- else return FALSE;
- }
- //------------------------------------------------------
- // Pomocnicze: DRUKOWANIE DRZEWA
- char druk [max_szer_druku][max_wys_druku];
- void dr_drz (drzewo drz, int* szer, int* wys) {
- int szer_syna[max_il_synow], wys_syna[max_il_synow], i,j;
- if (drz.czyterm) {
- *szer=*szer+3; *wys=1; druk[*szer-1][*wys-1] = drz.lk;
- }
- else { // Drzewo nieterminalowe:
- *wys = 0;
- for (i=0; i<drz.il_syn; i++) {
- dr_drz (*drz.syn[i], szer, &wys_syna[i]);
- szer_syna[i] = *szer;
- if (*wys < wys_syna[i]) *wys = wys_syna[i];
- }
- switch (drz.ntm) {
- case Xx : druk[*szer-1][*wys+1] = 'Xx'; break;
- }
- if (drz.il_syn > 0) {
- for (i=0; i<drz.il_syn; i++)
- for (j=wys_syna[i]; j<*wys+1; j++)
- druk[szer_syna[i]-1][j] = '|';
- for (i=szer_syna[0]; i<*szer-1; i++) druk[i][*wys+1] = '-';
- for (i=0; i<drz.il_syn-1; i++)
- druk[szer_syna[i]-1][*wys+1] = ',';
- }
- *wys = *wys+2;
- }
- }
- void drukuj_drzewo (drzewo drz) {
- int szer,wys,i,j;
- for (i=0; i<max_szer_druku; i++)
- for (j=0; j<max_wys_druku; j++) druk[i][j] = ' ';
- szer=0; dr_drz (drz, &szer, &wys);
- for (j=wys-1; j>=0; j--) {
- for (i=0; i<szer; i++) printf("%c",druk[i][j]);
- printf("\n");
- }
- printf("\n");
- }
- //------------------------------------------------------
- // Program glowny:
- int main() {
- drzewo drz; Boolean ok;
- // Wczytanie pierwszego znaku (z pominieciem niewidocznych:
- do { scanf("%c", &leks); }
- while ((leks < '!' || leks > '~') && leks != '\n');
- ok = XX(&drz); printf ("\n");
- if (ok && leks == '\n') drukuj_drzewo (drz);
- else
- if (ok && leks != '\n') {
- drukuj_drzewo (drz);
- printf (" SMIECI NA KONCU: %c\n\n", leks);
- }
- else printf (" WYRAZENIE BLEDNE\n\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement