Advertisement
Guest User

Untitled

a guest
Dec 11th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.47 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<string.h>
  4. #include <ctype.h>
  5. #include<stdarg.h>
  6. typedef struct
  7. {
  8. int cod;
  9. int linie;
  10. union
  11. {
  12. char text[50];
  13. int vi;
  14. double vr;
  15. };
  16. } Atom;
  17. Atom atomi[1000];
  18. int nAtomi=0;
  19. int linie=1;
  20. char inbuf[10000];
  21. char *pch=inbuf;
  22. FILE *fis=NULL;
  23.  
  24. enum {ID,VAL_INT,VAL_REAL,VAL_STR,VAR,FUNCTION,IF,ELSE,WHILE,END,RETURN,INT,REAL,STR,
  25. COLON,SEMICOLON,LPAR,RPAR,COMMA,OR,AND,NOT,EQUAL,NOTEQUAL,LESS,ASSIGN,ADD,SUB,MUL,DIV,FINISH
  26. };
  27.  
  28. void err(const char *fmt,...)
  29. {
  30. va_list va;
  31. va_start(va,fmt);
  32. fprintf(stderr,"error: ");
  33. vfprintf(stderr,fmt,va);
  34. fputc('\n',stderr);
  35. va_end(va);
  36. exit(-1);
  37. }
  38.  
  39. void addAtom(int codul)
  40. {
  41. atomi[nAtomi].cod=codul;
  42. atomi[nAtomi].linie=linie;
  43. nAtomi++;
  44. }
  45.  
  46. int getNextTK()
  47. {
  48. int s=0;
  49. char ch;
  50. char buf[50];
  51. int n=0;
  52. for(;;)
  53. {
  54. ch=*pch;
  55. //printf("#%d %c (%d)\n",s,ch,ch);
  56. switch(s)
  57. {
  58. case 0:
  59. if(ch==' '|| ch=='\n'|| ch=='\r'|| ch=='\t')
  60. {
  61. if(ch=='\n')
  62. ++linie;
  63. ++pch;
  64. }
  65. else if(ch==':')
  66. {
  67. ++pch;
  68. s=1;
  69. }
  70. else if(ch==';')
  71. {
  72. ++pch;
  73. s=2;
  74. }
  75. else if(ch=='(')
  76. {
  77. ++pch;
  78. s=3;
  79. }
  80. else if(ch==')')
  81. {
  82. ++pch;
  83. s=4;
  84. }
  85. else if(ch==',')
  86. {
  87. ++pch;
  88. s=5;
  89. }
  90. else if(ch=='-')
  91. {
  92. ++pch;
  93. s=6;
  94. }
  95. else if(ch=='&')
  96. {
  97. ++pch;
  98. s=7;
  99.  
  100. }
  101. else if(ch=='!')
  102. {
  103. ++pch;
  104. s=9;
  105.  
  106. }
  107. else if(ch=='=')
  108. {
  109. ++pch;
  110. s=12;
  111.  
  112. }
  113. else if(ch=='<')
  114. {
  115. ++pch;
  116. s=15;
  117. }
  118. else if(ch=='+')
  119. {
  120. ++pch;
  121. s=16;
  122. }
  123. else if(ch=='*')
  124. {
  125. ++pch;
  126. s=17;
  127. }
  128. else if(ch=='/')
  129. {
  130. ++pch;
  131. s=18;
  132. }
  133. else if(isalpha(ch)||ch=='_')
  134. {
  135. buf[n++]=ch;
  136. ++pch;
  137. s=19;
  138.  
  139. }
  140. else if(isdigit(ch))
  141. {
  142. buf[n++]=ch;
  143. ++pch;
  144. s=21;
  145.  
  146. }
  147. else if(ch=='\"')
  148. {
  149.  
  150. ++pch;
  151. s=26;
  152.  
  153. }
  154. else if(ch=='\0')
  155. {
  156. ++pch;
  157. s=28;
  158. }
  159. else if(ch=='#')
  160. {
  161. ++pch;
  162. s=29;
  163. }
  164. else if(ch=='|')
  165. {
  166. ++pch;
  167. s=30;
  168.  
  169. }
  170. else
  171. err("Caracter necunoscut %s \n",ch);
  172. break;
  173. case 1:
  174. addAtom(COLON);
  175. return COLON;
  176. case 2:
  177. addAtom(SEMICOLON);
  178. return SEMICOLON;
  179. case 3:
  180. addAtom(LPAR);
  181. return LPAR;
  182. case 4:
  183. addAtom(RPAR);
  184. return RPAR;
  185. case 5:
  186. addAtom(COMMA);
  187. return COMMA;
  188. case 6:
  189. addAtom(SUB);
  190. return SUB;
  191. case 7:
  192. if(ch=='&')
  193. s=8;
  194. case 8:
  195. addAtom(AND);
  196. return AND;
  197. case 9:
  198. if(ch=='!')
  199. {
  200. ++pch;
  201. s=10;
  202. }
  203. else
  204. s=11;
  205. break;
  206. case 10:
  207. addAtom(NOTEQUAL);
  208. return NOTEQUAL;
  209. case 11:
  210. addAtom(NOT);
  211. return NOT;
  212. case 12:
  213. if(ch=='=')
  214. {
  215. ++pch;
  216. s=13;
  217. }
  218. else
  219. s=14;
  220. break;
  221. case 13:
  222. addAtom(EQUAL);
  223. return EQUAL;
  224. case 14:
  225. addAtom(ASSIGN);
  226. return ASSIGN;
  227. case 15:
  228. addAtom(LESS);
  229. return LESS;
  230. case 16:
  231. addAtom(ADD);
  232. return ADD;
  233. case 17:
  234. addAtom(MUL);
  235. return MUL;
  236. case 18:
  237. addAtom(DIV);
  238. return DIV;
  239. case 19:
  240. if(isalnum(ch)||ch=='_')
  241. {
  242. buf[n++]=ch;
  243. ++pch;
  244. }
  245. else
  246. s=20;
  247. break;
  248. case 20:
  249. buf[n]='\0';
  250. if(!strcmp(buf,"var"))
  251. {
  252. addAtom(VAR);
  253. return VAR;
  254. }
  255. else if(!strcmp(buf,"function"))
  256. {
  257. addAtom(FUNCTION);
  258. return FUNCTION;
  259. }
  260. else if(!strcmp(buf,"if"))
  261. {
  262. addAtom(IF);
  263. return IF;
  264. }
  265. else if(!strcmp(buf,"else"))
  266. {
  267. addAtom(ELSE);
  268. return ELSE;
  269. }
  270. else if(!strcmp(buf,"while"))
  271. {
  272. addAtom(WHILE);
  273. return WHILE;
  274. }
  275. else if(!strcmp(buf,"end"))
  276. {
  277. addAtom(END);
  278. return END;
  279. }
  280. else if(!strcmp(buf,"return"))
  281. {
  282. addAtom(RETURN);
  283. return RETURN;
  284. }
  285. else if(!strcmp(buf,"int"))
  286. {
  287. addAtom(INT);
  288. return INT;
  289. }
  290. else if(!strcmp(buf,"real"))
  291. {
  292. addAtom(REAL);
  293. return REAL;
  294. }
  295. else if(!strcmp(buf,"str"))
  296. {
  297. addAtom(STR);
  298. return STR;
  299. }
  300. else
  301. {
  302. addAtom(ID);
  303. strcpy(atomi[nAtomi-1].text,buf);
  304. return ID;
  305. }
  306. break;
  307. case 21:
  308. if(isdigit(ch))
  309. {
  310. buf[n++]=ch;
  311. ++pch;
  312. }
  313. else if(ch=='.')
  314. {
  315. buf[n++]=ch;
  316. ++pch;
  317. s=23;
  318. }
  319. else
  320. s=22;
  321. break;
  322. case 22:
  323. addAtom(VAL_INT);
  324. strcpy(atomi[nAtomi-1].text,buf);
  325. atomi[nAtomi-1].vi=atoi(buf);
  326. return VAL_INT;
  327. case 23:
  328. if(isdigit(ch))
  329. {
  330. buf[n++]=ch;
  331. ++pch;
  332. s=24;
  333. }
  334. break;
  335. case 24:
  336. if(isdigit(ch))
  337. {
  338. ++pch;
  339. buf[n++]=ch;
  340.  
  341. }
  342. else
  343. s=25;
  344. break;
  345. case 25:
  346. addAtom(VAL_REAL);
  347. strcpy(atomi[nAtomi-1].text,buf);
  348. atomi[nAtomi-1].vr=atof(buf);
  349. return VAL_REAL;
  350. case 26:
  351. if(ch!='\"')
  352. { ++pch;
  353. buf[n++]=ch;
  354.  
  355.  
  356. }
  357. else if(ch=='\"'){
  358. ++pch;
  359. s=27;}
  360. break;
  361. case 27:
  362. buf[n]=0;
  363. addAtom(VAL_STR);
  364. strcpy(atomi[nAtomi-1].text,buf);
  365. return VAL_STR;
  366. case 28:
  367. addAtom(FINISH);
  368. return FINISH;
  369. case 29:
  370. if(ch!='\r'&&ch!='\n'&&ch!='\0')
  371. {
  372. ++pch;
  373. }
  374. else
  375. s=0;
  376. break;
  377. case 30:
  378. if(ch=='|')
  379. s=31;
  380. break;
  381. case 31:
  382. addAtom(OR);
  383. return OR;
  384. default:
  385. err("Stare necunoscuta %d \n",s);
  386. break;
  387. }
  388.  
  389. }
  390. }
  391.  
  392. char *Afisare(int c)
  393. {
  394. if(c==0)
  395. return("ID");
  396. else if(c==1)
  397. return("VAL_INT");
  398. else if(c==2)
  399. return("VAL_REAL");
  400. else if(c==3)
  401. return("VAL_STR");
  402. else if(c==4)
  403. return("VAR");
  404. else if(c==5)
  405. return("FUNCTION");
  406. else if(c==6)
  407. return("IF");
  408. else if(c==7)
  409. return("ELSE");
  410. else if(c==8)
  411. return("WHILE");
  412. else if(c==9)
  413. return("END");
  414. else if(c==10)
  415. return("RETURN");
  416. else if(c==11)
  417. return("INT");
  418. else if(c==12)
  419. return("REAL");
  420. else if(c==13)
  421. return("STR");
  422. else if(c==14)
  423. return("COLON");
  424. else if(c==15)
  425. return("SEMICOLON");
  426. else if(c==16)
  427. return("LPAR");
  428. else if(c==17)
  429. return("RPAR");
  430. else if(c==18)
  431. return("COMMA");
  432. else if(c==19)
  433. return("OR");
  434. else if(c==20)
  435. return("AND");
  436. else if(c==21)
  437. return("NOT");
  438. else if(c==22)
  439. return("EQUAL");
  440. else if(c==23)
  441. return("NOTEQUAL");
  442. else if(c==24)
  443. return("LESS");
  444. else if(c==25)
  445. return("ASSIGN");
  446. else if(c==26)
  447. return("ADD");
  448. else if(c==27)
  449. return("SUB");
  450. else if(c==28)
  451. return("MUL");
  452. else if(c==29)
  453. return("DIV");
  454. else if(c==30)
  455. return("FINISH");
  456. }
  457.  
  458. int main()
  459. {
  460. fis=fopen("a.q","r");
  461. if(fis==NULL)
  462. printf("eroare");
  463. int m=fread(inbuf,1,20000,fis);
  464. inbuf[m]='\0';
  465. while(getNextTK()!=FINISH)
  466. {
  467. printf("%d ",atomi[nAtomi-1].linie);
  468. if(atomi[nAtomi-1].cod==1)
  469. {
  470. printf("%s %d \n",Afisare(atomi[nAtomi-1].cod),atomi[nAtomi-1].vi);
  471. }
  472. else if(atomi[nAtomi-1].cod==2)
  473. {
  474. printf("%s %f \n",Afisare(atomi[nAtomi-1].cod),atomi[nAtomi-1].vr);
  475. }
  476. else
  477. {
  478. printf("%s %s \n",Afisare(atomi[nAtomi-1].cod),atomi[nAtomi-1].text);
  479. }
  480. }
  481. fclose(fis);
  482. return 0;
  483. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement