Advertisement
sanpai

Lexical Analyser

Feb 24th, 2013
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.64 KB | None | 0 0
  1.  
  2. /*Sample lex code for imaginary language
  3.  
  4. *-accepts only 5 keywords namely int,float,char .
  5. *4-arith operators +,-,/,*
  6. *logical operators &-AND,!-NOT,|-OR
  7. */
  8.  
  9.  
  10. Author : Santhosh Pai :)
  11.  
  12.  
  13. #include<stdio.h>
  14.  
  15. void scan();
  16. void iden(char);
  17. void digit(char);
  18. void arithop();
  19. void logicop();
  20. void delimiter();
  21. int iskey(char str[]); //funtion to check a keyword
  22. FILE *fp;
  23.  
  24. int arith=0,logic=0,del=0;
  25.  
  26. int main()
  27. {
  28.  
  29.  
  30. fp=fopen("input.txt","r+");
  31. scan();
  32. }
  33.  
  34. void scan()
  35. {
  36.  
  37. char ch;
  38. while(1)
  39. {
  40. ch=fgetc(fp);
  41. if((ch>=65 && ch<=90)||(ch>=97 && ch<=122))
  42. {
  43. iden(ch);
  44. }
  45.  
  46. else if(ch>=48 && ch<=57)
  47. {
  48. digit(ch);
  49. }
  50.  
  51. else if(ch=='*'||ch=='+'||ch=='-'||ch=='/')
  52. {
  53. arithop();
  54. }
  55.  
  56. else if(ch=='&'||ch=='|'||ch=='!')
  57. {
  58. logicop();
  59. }
  60.  
  61. else if(ch==' '||ch==','||ch==';')
  62. {
  63. delimiter();
  64.  
  65. }
  66.  
  67.  
  68. else if(ch==EOF)
  69. break;
  70. }
  71.  
  72. printf("\n The number of occurences of arithmetic operators +,*,/,-= %d ",arith);
  73. printf("\n The number of occurences of logical operators &,!,| = %d",logic);
  74. printf("\n The number of occurences of delimiter (SPACE),';' = %d",del);
  75.  
  76. }
  77.  
  78.  
  79. void iden(char ch)
  80. {
  81. char ident[10];
  82.  
  83. int i=0;
  84.  
  85. do
  86. {
  87. ident[i]=ch;
  88. ++i;
  89. ch=fgetc(fp);
  90. }while((ch>=65 && ch<=90)||(ch>=97 & ch<=122)||(ch>=48 & ch<=57)); //keep scanning
  91.  
  92. //++i;
  93. ident[i]='\0';
  94.  
  95. if(iskey(ident))
  96. {
  97. printf("\n %s is an keyword ",ident);
  98. }
  99. else
  100. {
  101. printf("\n %s is an identifier ",ident);
  102. }
  103. fseek(fp,-1,SEEK_CUR);//Move filepointer one step backwards
  104.  
  105.  
  106. }
  107.  
  108.  
  109. void digit(char ch)
  110. {
  111. char dig[10];
  112. int i=0;
  113. dig[i]=ch;
  114.  
  115. do
  116. {
  117.  
  118.  
  119. ch=fgetc(fp);
  120. if((ch>=48 && ch<=57)||ch=='.')
  121. {
  122. ++i;
  123. dig[i]=ch;
  124. }
  125. else if(ch=='*'||ch=='+'||ch=='-'||ch=='/')
  126. {
  127. arithop();
  128. break;
  129. }
  130.  
  131. else if(ch=='&'||ch=='|'||ch=='!')
  132. {
  133. logicop();
  134. break;
  135. }
  136.  
  137. else if(ch==' '||ch==','||ch==';')
  138. {
  139. delimiter();
  140. break;
  141. }
  142.  
  143.  
  144.  
  145.  
  146. }while(1);
  147.  
  148. ++i;
  149. dig[i]='\0';
  150.  
  151. printf(" \n %s is an number ",dig);
  152.  
  153. }
  154.  
  155. void arithop()
  156. {
  157. arith++;
  158. }
  159.  
  160.  
  161. void logicop()
  162. {
  163. logic++;
  164. }
  165. void delimiter()
  166. {
  167. del++;
  168. }
  169.  
  170. int iskey(char str[10])
  171. {
  172. char ch;
  173. int i=0;
  174. while(1)
  175. {
  176. ch=str[i];
  177. if(ch=='i')
  178. {
  179. ++i;
  180. ch=str[i];
  181. if(ch=='n')
  182. {
  183. ++i;
  184. ch=str[i];
  185.  
  186. if(ch=='t')
  187. {
  188. return 1;
  189. }
  190. }
  191.  
  192. else if(ch=='f')
  193. {
  194. return 1;
  195. }
  196. }
  197.  
  198.  
  199. else if(ch=='c')
  200. {
  201. ++i;
  202. ch=str[i];
  203. if(ch=='h')
  204. {
  205. ++i;
  206. ch=str[i];
  207.  
  208. if(ch=='a')
  209. {
  210. ++i;
  211. ch=str[i];
  212.  
  213. if(ch=='r')
  214. {
  215. return 1;
  216. }
  217. }
  218. }
  219. }
  220.  
  221. else if(ch=='f')
  222. {
  223. ++i;
  224. ch=str[i];
  225. if(ch=='l')
  226. {
  227. ++i;
  228. ch=str[i];
  229.  
  230. if(ch=='o')
  231. {
  232. ++i;
  233. ch=str[i];
  234.  
  235. if(ch=='a')
  236. {
  237. ++i;
  238. ch=str[i];
  239. if(ch=='t')
  240. {
  241. return 1;
  242. }
  243. }
  244. }
  245. }
  246. }
  247.  
  248.  
  249. else if(ch=='e')
  250. {
  251. ++i;
  252. ch=str[i];
  253. if(ch=='l')
  254. {
  255. ++i;
  256. ch=str[i];
  257.  
  258. if(ch=='s')
  259. {
  260. ++i;
  261. ch=str[i];
  262. if(ch=='e')
  263. {
  264. return 1;
  265. }
  266. }
  267. }
  268.  
  269.  
  270. else if(ch=='n')
  271. {
  272. ++i;
  273. ch=str[i];
  274. if(ch=='d')
  275. {
  276. return 1;
  277. }
  278.  
  279. }
  280. }
  281.  
  282. else if(ch=='b')
  283. {
  284. ++i;
  285. ch=str[i];
  286. if(ch=='e')
  287. {
  288. ++i;
  289. ch=str[i];
  290.  
  291. if(ch=='g')
  292. {
  293. ++i;
  294. ch=str[i];
  295.  
  296. if(ch=='i')
  297. {
  298. ++i;
  299. ch=str[i];
  300. if(ch=='n')
  301. {
  302. return 1;
  303. }
  304. }
  305. }
  306. }
  307. }
  308.  
  309.  
  310.  
  311. break;
  312. }
  313.  
  314. return 0;
  315. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement