Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include<string.h>
- #include <ctype.h>
- #include<stdarg.h>
- typedef struct
- {
- int cod;
- int linie;
- union
- {
- char text[50];
- int vi;
- double vr;
- };
- } Atom;
- Atom atomi[1000];
- int nAtomi=0;
- int linie=1;
- char inbuf[10000];
- char *pch=inbuf;
- FILE *fis=NULL;
- enum {ID,VAL_INT,VAL_REAL,VAL_STR,VAR,FUNCTION,IF,ELSE,WHILE,END,RETURN,INT,REAL,STR,
- COLON,SEMICOLON,LPAR,RPAR,COMMA,OR,AND,NOT,EQUAL,NOTEQUAL,LESS,ASSIGN,ADD,SUB,MUL,DIV,FINISH
- };
- void err(const char *fmt,...)
- {
- va_list va;
- va_start(va,fmt);
- fprintf(stderr,"error: ");
- vfprintf(stderr,fmt,va);
- fputc('\n',stderr);
- va_end(va);
- exit(-1);
- }
- void addAtom(int codul)
- {
- atomi[nAtomi].cod=codul;
- atomi[nAtomi].linie=linie;
- nAtomi++;
- }
- int getNextTK()
- {
- int s=0;
- char ch;
- char buf[50];
- int n=0;
- for(;;)
- {
- ch=*pch;
- //printf("#%d %c (%d)\n",s,ch,ch);
- switch(s)
- {
- case 0:
- if(ch==' '|| ch=='\n'|| ch=='\r'|| ch=='\t')
- {
- if(ch=='\n')
- ++linie;
- ++pch;
- }
- else if(ch==':')
- {
- ++pch;
- s=1;
- }
- else if(ch==';')
- {
- ++pch;
- s=2;
- }
- else if(ch=='(')
- {
- ++pch;
- s=3;
- }
- else if(ch==')')
- {
- ++pch;
- s=4;
- }
- else if(ch==',')
- {
- ++pch;
- s=5;
- }
- else if(ch=='-')
- {
- ++pch;
- s=6;
- }
- else if(ch=='&')
- {
- ++pch;
- s=7;
- }
- else if(ch=='!')
- {
- ++pch;
- s=9;
- }
- else if(ch=='=')
- {
- ++pch;
- s=12;
- }
- else if(ch=='<')
- {
- ++pch;
- s=15;
- }
- else if(ch=='+')
- {
- ++pch;
- s=16;
- }
- else if(ch=='*')
- {
- ++pch;
- s=17;
- }
- else if(ch=='/')
- {
- ++pch;
- s=18;
- }
- else if(isalpha(ch)||ch=='_')
- {
- buf[n++]=ch;
- ++pch;
- s=19;
- }
- else if(isdigit(ch))
- {
- buf[n++]=ch;
- ++pch;
- s=21;
- }
- else if(ch=='\"')
- {
- ++pch;
- s=26;
- }
- else if(ch=='\0')
- {
- ++pch;
- s=28;
- }
- else if(ch=='#')
- {
- ++pch;
- s=29;
- }
- else if(ch=='|')
- {
- ++pch;
- s=30;
- }
- else
- err("Caracter necunoscut %s \n",ch);
- break;
- case 1:
- addAtom(COLON);
- return COLON;
- case 2:
- addAtom(SEMICOLON);
- return SEMICOLON;
- case 3:
- addAtom(LPAR);
- return LPAR;
- case 4:
- addAtom(RPAR);
- return RPAR;
- case 5:
- addAtom(COMMA);
- return COMMA;
- case 6:
- addAtom(SUB);
- return SUB;
- case 7:
- if(ch=='&')
- s=8;
- case 8:
- addAtom(AND);
- return AND;
- case 9:
- if(ch=='!')
- {
- ++pch;
- s=10;
- }
- else
- s=11;
- break;
- case 10:
- addAtom(NOTEQUAL);
- return NOTEQUAL;
- case 11:
- addAtom(NOT);
- return NOT;
- case 12:
- if(ch=='=')
- {
- ++pch;
- s=13;
- }
- else
- s=14;
- break;
- case 13:
- addAtom(EQUAL);
- return EQUAL;
- case 14:
- addAtom(ASSIGN);
- return ASSIGN;
- case 15:
- addAtom(LESS);
- return LESS;
- case 16:
- addAtom(ADD);
- return ADD;
- case 17:
- addAtom(MUL);
- return MUL;
- case 18:
- addAtom(DIV);
- return DIV;
- case 19:
- if(isalnum(ch)||ch=='_')
- {
- buf[n++]=ch;
- ++pch;
- }
- else
- s=20;
- break;
- case 20:
- buf[n]='\0';
- if(!strcmp(buf,"var"))
- {
- addAtom(VAR);
- return VAR;
- }
- else if(!strcmp(buf,"function"))
- {
- addAtom(FUNCTION);
- return FUNCTION;
- }
- else if(!strcmp(buf,"if"))
- {
- addAtom(IF);
- return IF;
- }
- else if(!strcmp(buf,"else"))
- {
- addAtom(ELSE);
- return ELSE;
- }
- else if(!strcmp(buf,"while"))
- {
- addAtom(WHILE);
- return WHILE;
- }
- else if(!strcmp(buf,"end"))
- {
- addAtom(END);
- return END;
- }
- else if(!strcmp(buf,"return"))
- {
- addAtom(RETURN);
- return RETURN;
- }
- else if(!strcmp(buf,"int"))
- {
- addAtom(INT);
- return INT;
- }
- else if(!strcmp(buf,"real"))
- {
- addAtom(REAL);
- return REAL;
- }
- else if(!strcmp(buf,"str"))
- {
- addAtom(STR);
- return STR;
- }
- else
- {
- addAtom(ID);
- strcpy(atomi[nAtomi-1].text,buf);
- return ID;
- }
- break;
- case 21:
- if(isdigit(ch))
- {
- buf[n++]=ch;
- ++pch;
- }
- else if(ch=='.')
- {
- buf[n++]=ch;
- ++pch;
- s=23;
- }
- else
- s=22;
- break;
- case 22:
- addAtom(VAL_INT);
- strcpy(atomi[nAtomi-1].text,buf);
- atomi[nAtomi-1].vi=atoi(buf);
- return VAL_INT;
- case 23:
- if(isdigit(ch))
- {
- buf[n++]=ch;
- ++pch;
- s=24;
- }
- break;
- case 24:
- if(isdigit(ch))
- {
- ++pch;
- buf[n++]=ch;
- }
- else
- s=25;
- break;
- case 25:
- addAtom(VAL_REAL);
- strcpy(atomi[nAtomi-1].text,buf);
- atomi[nAtomi-1].vr=atof(buf);
- return VAL_REAL;
- case 26:
- if(ch!='\"')
- { ++pch;
- buf[n++]=ch;
- }
- else if(ch=='\"'){
- ++pch;
- s=27;}
- break;
- case 27:
- buf[n]=0;
- addAtom(VAL_STR);
- strcpy(atomi[nAtomi-1].text,buf);
- return VAL_STR;
- case 28:
- addAtom(FINISH);
- return FINISH;
- case 29:
- if(ch!='\r'&&ch!='\n'&&ch!='\0')
- {
- ++pch;
- }
- else
- s=0;
- break;
- case 30:
- if(ch=='|')
- s=31;
- break;
- case 31:
- addAtom(OR);
- return OR;
- default:
- err("Stare necunoscuta %d \n",s);
- break;
- }
- }
- }
- char *Afisare(int c)
- {
- if(c==0)
- return("ID");
- else if(c==1)
- return("VAL_INT");
- else if(c==2)
- return("VAL_REAL");
- else if(c==3)
- return("VAL_STR");
- else if(c==4)
- return("VAR");
- else if(c==5)
- return("FUNCTION");
- else if(c==6)
- return("IF");
- else if(c==7)
- return("ELSE");
- else if(c==8)
- return("WHILE");
- else if(c==9)
- return("END");
- else if(c==10)
- return("RETURN");
- else if(c==11)
- return("INT");
- else if(c==12)
- return("REAL");
- else if(c==13)
- return("STR");
- else if(c==14)
- return("COLON");
- else if(c==15)
- return("SEMICOLON");
- else if(c==16)
- return("LPAR");
- else if(c==17)
- return("RPAR");
- else if(c==18)
- return("COMMA");
- else if(c==19)
- return("OR");
- else if(c==20)
- return("AND");
- else if(c==21)
- return("NOT");
- else if(c==22)
- return("EQUAL");
- else if(c==23)
- return("NOTEQUAL");
- else if(c==24)
- return("LESS");
- else if(c==25)
- return("ASSIGN");
- else if(c==26)
- return("ADD");
- else if(c==27)
- return("SUB");
- else if(c==28)
- return("MUL");
- else if(c==29)
- return("DIV");
- else if(c==30)
- return("FINISH");
- }
- int main()
- {
- fis=fopen("a.q","r");
- if(fis==NULL)
- printf("eroare");
- int m=fread(inbuf,1,20000,fis);
- inbuf[m]='\0';
- while(getNextTK()!=FINISH)
- {
- printf("%d ",atomi[nAtomi-1].linie);
- if(atomi[nAtomi-1].cod==1)
- {
- printf("%s %d \n",Afisare(atomi[nAtomi-1].cod),atomi[nAtomi-1].vi);
- }
- else if(atomi[nAtomi-1].cod==2)
- {
- printf("%s %f \n",Afisare(atomi[nAtomi-1].cod),atomi[nAtomi-1].vr);
- }
- else
- {
- printf("%s %s \n",Afisare(atomi[nAtomi-1].cod),atomi[nAtomi-1].text);
- }
- }
- fclose(fis);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement