alexarcan

lexical_analiser

Mar 23rd, 2016
281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 14.62 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdarg.h>
  4. #include <string.h>
  5. #include <malloc.h>
  6. #define SIZE 2046
  7.  
  8. #define SAFEALLOC(var,Type) if((var=(Type*)malloc(sizeof(Type)))==NULL)err("not enough memory");
  9.  
  10. enum{
  11.     ID, END,
  12.     //constants
  13.     CT_INT, CT_REAL, CT_CHAR, CT_STRING,
  14.     //keywords
  15.     BREAK, CHAR, DOUBLE, ELSE, FOR, IF, INT, RETURN, STRUCT, VOID, WHILE,
  16.     //delimiters
  17.     COMMA, SEMICOLON, LPAR, RPAR, LBRACKET, RBRACKET, LACC, RACC,
  18.     //operators
  19.     ADD, SUB, MUL, DIV, DOT, AND, OR, NOT, ASSIGN, EQUAL, NOTEQ, LESS, LESSEQ, GREATER, GREATEREQ,
  20.     SPACE, LINECOMMENT, COMMENT
  21. }; //tokens codes
  22.  
  23. typedef struct _Token
  24. {
  25.     int code;
  26.     union{
  27.         char *text;
  28.         long int i;
  29.         double r;
  30.         };
  31.     int line;
  32.     struct _Token *next;
  33. }Token;
  34.  
  35. Token *tokens;
  36. Token *lastToken = NULL;
  37. const char *pCrtCh;
  38. int line;
  39.  
  40. void err(const char *fmt,...)
  41. {
  42.     va_list va;
  43.     va_start(va,fmt);
  44.     fprintf(stderr,"error: ");
  45.     vfprintf(stderr,fmt,va);
  46.     fputc('\n',stderr);
  47.     va_end(va);
  48.     exit(-1);
  49. }
  50.  
  51.  
  52. void tkerr(const Token *tk,const char *fmt,...)
  53. {
  54.     va_list va;
  55.     va_start(va,fmt);
  56.     fprintf(stderr,"error in line %d: ",tk->line);
  57.     vfprintf(stderr,fmt,va);
  58.     fputc('\n',stderr);
  59.     va_end(va);
  60.     exit(-1);
  61. }
  62.  
  63.  
  64. Token *addTk(int code)
  65. {
  66.     Token *tk;
  67.     SAFEALLOC(tk,Token)
  68.     tk->code=code;
  69.     tk->line=line;
  70.     tk->next=NULL;
  71.     if(lastToken)
  72.     {
  73.         lastToken->next=tk;
  74.     }
  75.     else
  76.     {
  77.         tokens=tk;
  78.     }
  79.     lastToken=tk;
  80.     return tk;
  81. }
  82.  
  83. char* createString(const char *pStartCh,const char *pCrtCh)
  84. {
  85.     int nCh=pCrtCh-pStartCh+1;
  86.     char *str;
  87.     str=(char *)malloc(nCh*sizeof(char));
  88.     snprintf(str,nCh,"%s",pStartCh);
  89.     return str;
  90. }
  91.  
  92. char escCode(char ch)
  93. {
  94.     char newCh;
  95.     switch(ch)
  96.     {
  97.         case 'a': newCh='\a'; break;
  98.         case 'b': newCh='\b'; break;
  99.         case 'f': newCh='\f'; break;
  100.         case 'n': newCh='\n'; break;
  101.         case 'r': newCh='\r'; break;
  102.         case 't': newCh='\t'; break;
  103.         case '\'': newCh='\''; break;
  104.         case '\?': newCh='\?'; break;
  105.         case '\"': newCh='\"'; break;
  106.         case '\\': newCh='\\'; break;
  107.         case '0': newCh='\0'; break;
  108.     }
  109.     return newCh;
  110. }
  111.  
  112. void printTokens()
  113. {
  114.     Token *current=tokens;
  115.     while(current!=NULL)
  116.     {
  117.         printf("%i", current->code);
  118.         switch(current->code)
  119.         {
  120.             case ID:
  121.             case CT_STRING:
  122.                 printf(":%s",current->text);
  123.                 break;
  124.             case CT_CHAR:
  125.                 printf(":%c",(int)current->i);
  126.                 break;
  127.             case CT_INT:
  128.                 printf(":%li",current->i);
  129.                 break;
  130.             case CT_REAL:
  131.                 printf(":%lf",current->r);
  132.                 break;
  133.         }
  134.         printf(" ");
  135.         current=current->next;
  136.     }
  137.     printf("\n");
  138. }
  139.  
  140. int getNextToken()
  141. {
  142.     int state=0,nCh;
  143.     char ch;
  144.     const char *pStartCh;
  145.     Token *tk;
  146.  
  147.     long int ct_int;
  148.     double ct_real;
  149.     int ct_char;
  150.     char *ct_string;
  151.     char *p;
  152.     int noBacks=0;
  153.     int i;
  154.  
  155.     while(1)
  156.     {
  157.         ch=*pCrtCh;
  158.         //if(ch=='\0')printf("ch e null in state %i\n",state);
  159.         //printf("ch=%c\n",ch);
  160.         switch(state)
  161.         {
  162.             case 0:
  163.                 if(ch<='9'&&ch>='1')
  164.                 {
  165.                     pStartCh=pCrtCh;
  166.                     pCrtCh++;
  167.                     state=1;
  168.                 }
  169.                 else if(ch=='0')
  170.                 {
  171.                     pStartCh=pCrtCh;
  172.                     pCrtCh++;
  173.                     state=2;
  174.                 }
  175.                 else if(ch=='/')
  176.                 {
  177.                     pCrtCh++;
  178.                     state=14;
  179.                 }
  180.                 else if(ch==' '||ch=='\r'||ch=='\t')
  181.                 {
  182.                     pCrtCh++;
  183.                     //state=0;
  184.                 }
  185.                 else if(ch=='\n')
  186.                 {
  187.                     line++;
  188.                     pCrtCh++;
  189.                     //state=0;
  190.                 }
  191.                 else if(ch=='\'')
  192.                 {
  193.                     pStartCh=pCrtCh; // ?
  194.                     pCrtCh++;
  195.                     state=18;
  196.                 }
  197.                 else if(ch=='\"')
  198.                 {
  199.                     pStartCh=pCrtCh; // ?
  200.                     pCrtCh++;
  201.                     state=22;
  202.                 }
  203.                 else if(ch==',')
  204.                 {
  205.                     pCrtCh++;
  206.                     state=26;
  207.                 }
  208.                 else if(ch==';')
  209.                 {
  210.                     pCrtCh++;
  211.                     state=27;
  212.                 }
  213.                 else if(ch=='(')
  214.                 {
  215.                     pCrtCh++;
  216.                     state=28;
  217.                 }
  218.                 else if(ch==')')
  219.                 {
  220.                     pCrtCh++;
  221.                     state=29;
  222.                 }
  223.                 else if(ch=='[')
  224.                 {
  225.                     pCrtCh++;
  226.                     state=30;
  227.                 }else if(ch==']')
  228.                 {
  229.                     pCrtCh++;
  230.                     state=31;
  231.                 }else if(ch=='{')
  232.                 {
  233.                     pCrtCh++;
  234.                     state=32;
  235.                 }
  236.                 else if(ch=='}')
  237.                 {
  238.                     pCrtCh++;
  239.                     state=33;
  240.                 }
  241.                 else if(ch=='+')
  242.                 {
  243.                     pCrtCh++;
  244.                     state=34;
  245.                 }
  246.                 else if(ch=='-')
  247.                 {
  248.                     pCrtCh++;
  249.                     state=35;
  250.                 }
  251.                 else if(ch=='*')
  252.                 {
  253.                     pCrtCh++;
  254.                     state=36;
  255.                 }
  256.                 else if(ch=='.')
  257.                 {
  258.                     pCrtCh++;
  259.                     state=38;
  260.                 }
  261.                 else if(ch=='&')
  262.                 {
  263.                     pCrtCh++;
  264.                     state=39;
  265.                 }
  266.                 else if(ch=='|')
  267.                 {
  268.                     pCrtCh++;
  269.                     state=41;
  270.                 }
  271.                 else if(ch=='!')
  272.                 {
  273.                     pCrtCh++;
  274.                     state=43;
  275.                 }
  276.                 else if(ch=='=')
  277.                 {
  278.                     pCrtCh++;
  279.                     state=46;
  280.                 }
  281.                 else if(ch=='<')
  282.                 {
  283.                     pCrtCh++;
  284.                     state=49;
  285.                 }
  286.                 else if(ch=='>')
  287.                 {
  288.                     pCrtCh++;
  289.                     state=52;
  290.                 }
  291.                 else if(ch=='_' || (ch>='a'&&ch<='z') || (ch>='A'&&ch<='Z'))
  292.                 {
  293.                     pStartCh=pCrtCh;
  294.                     pCrtCh++;
  295.                     state=55;
  296.                 }
  297.  
  298.                 else if(ch=='\0') // the end of the input string
  299.                 {
  300.                     printf("At END.\n");
  301.                     addTk(END);
  302.                     return END;
  303.                 }
  304.                 else
  305.                 {   printf("invalid character ch=%c\n",ch);
  306.                     tkerr(addTk(END),"invalid character");}
  307.                 break;
  308.             case 1:
  309.                 if(ch>='0'&&ch<='9')
  310.                 {
  311.                     pCrtCh++;
  312.                     //state=1;
  313.                 }
  314.                 else if(ch=='.')
  315.                 {
  316.                     pCrtCh++;
  317.                     state=8;
  318.                 }
  319.                 else if(ch=='e'||ch=='E')
  320.                 {
  321.                     pCrtCh++;
  322.                     state=10;
  323.                 }
  324.                 else
  325.                     state=6;
  326.                 break;
  327.             case 2:
  328.                 if(ch=='x'||ch=='X')
  329.                 {
  330.                     pCrtCh++;
  331.                     state=4;
  332.                 }
  333.                 else
  334.                     state=3;
  335.                 break;
  336.             case 3:
  337.                 if(ch>='0'&&ch<='7')
  338.                 {
  339.                     pCrtCh++;
  340.                     //state=3;
  341.                 }
  342.                 else if(ch=='.')
  343.                 {
  344.                     pCrtCh++;
  345.                     state=8;
  346.                 }
  347.                 else if(ch=='e'||ch=='E')
  348.                 {
  349.                     pCrtCh++;
  350.                     state=10;
  351.                 }
  352.                 else
  353.                     state=6;
  354.                 break;
  355.             case 4:
  356.                 if((ch>='0'&&ch<='9') || (ch>='a'&&ch<='f') || (ch>='A'&&ch<='F'))
  357.                 {
  358.                     pCrtCh++;
  359.                     state=5;
  360.                 }
  361.                 //Am nevoie de error?
  362.                 else
  363.                     tkerr(addTk(END),"not a valid int");
  364.                 break;
  365.             case 5:
  366.                 if((ch>='0'&&ch<='9') || (ch>='a'&&ch<='f') || (ch>='A'&&ch<='F'))
  367.                 {
  368.                     pCrtCh++;
  369.                     //state=5;
  370.                 }
  371.                 else
  372.                     state=6;
  373.                 break;
  374.             case 6: //CT_INT
  375.                 //nCh=pCrtCh-pStartCh;
  376.                 //Char *ct_int=createString(pStartCh,pCrtCh);
  377.                 ct_int=strtol(pStartCh,NULL,0);
  378.                 tk=addTk(CT_INT);
  379.                 tk->i=ct_int;
  380.                 return CT_INT;
  381.             case 8:
  382.                 if(ch>='0'&&ch<='9')
  383.                 {
  384.                     pCrtCh++;
  385.                     state=9;
  386.                 }
  387.                 // error?
  388.                 else
  389.                     tkerr(addTk(END),"after a point should be a digit");
  390.                 break;
  391.             case 9:
  392.                 if(ch=='e'||ch=='E')
  393.                 {
  394.                     pCrtCh++;
  395.                     state=10;
  396.                 }
  397.                 else if(ch>='0'&&ch<='9')
  398.                 {
  399.                     pCrtCh++;
  400.                     //state=9;
  401.                 }
  402.                 else state=13;
  403.                 break;
  404.             case 10:
  405.                 if(ch=='+'||ch=='-')
  406.                 {
  407.                     pCrtCh++;
  408.                     state=11;
  409.                 }
  410.                 else
  411.                     state=11;
  412.                 break;
  413.             case 11:
  414.                 if(ch>='0'&&ch<='9')
  415.                 {
  416.                     pCrtCh++;
  417.                     state=12;
  418.                 }
  419.                 // error?
  420.                 else
  421.                     //printf("at error ch=%c\n",ch);
  422.                     tkerr(addTk(END),"after + or - should come a digit");
  423.                 break;
  424.             case 12:
  425.                 if(ch>='0'&&ch<='9')
  426.                 {
  427.                     pCrtCh++;
  428.                     //state=12;
  429.                 }
  430.                 else
  431.                     state=13;
  432.                 break;
  433.             case 13:
  434.                 ct_real=strtod(pStartCh,NULL);
  435.                 tk=addTk(CT_REAL);
  436.                 tk->r=ct_real;
  437.                 return CT_REAL;
  438.             case 14:
  439.                 if(ch=='*')
  440.                 {
  441.                     pCrtCh++;
  442.                     state=15;
  443.                 }
  444.                 else if(ch=='/')
  445.                 {
  446.                     pCrtCh++;
  447.                     state=17;
  448.                 }
  449.                 else
  450.                     state=37;
  451.                 break;
  452.             case 15:
  453.                 if(ch=='*')
  454.                 {
  455.                     pCrtCh++;
  456.                     state=16;
  457.                 }
  458.                 else
  459.                 {
  460.                     pCrtCh++;
  461.                     //state=15;
  462.                 }
  463.                 break;
  464.             case 16:
  465.                 if(ch=='*')
  466.                 {
  467.                     pCrtCh++;
  468.                     //state=16;
  469.                 }
  470.                 else if(ch=='/')
  471.                 {
  472.                     pCrtCh++;
  473.                     state=0;
  474.                 }
  475.                 else
  476.                     state=15;
  477.                 break;
  478.             case 17:
  479.                 if(ch=='\r'||ch=='\0')
  480.                 {
  481.                     pCrtCh++;
  482.                     state=0;
  483.                 }
  484.                 else if(ch=='\n')
  485.                 {
  486.                     line++;
  487.                     pCrtCh++;
  488.                     state=0;
  489.                 }
  490.                 else
  491.                 {
  492.                     pCrtCh++;
  493.                     //state=17;
  494.                 }
  495.                 break;
  496.             case 18:
  497.                 if(ch=='\\')
  498.                 {
  499.                     //pStartCh=pCrtCh; // ?
  500.  
  501.                     pCrtCh++;
  502.                     state=19;
  503.                 }
  504.                 else if(ch!='\'')
  505.                 {
  506.                     //pStartCh=pCrtCh; // ?
  507.  
  508.                     ct_char=ch;
  509.                     pCrtCh++;
  510.                     state=20;
  511.                 }
  512.                 // ch=='\''
  513.                 // else error?
  514.                 else
  515.                     tkerr(addTk(END)," empty character constant");
  516.                 break;
  517.             case 19:
  518.                 //if(ch=='\a'||ch=='\b'||ch=='\f'||ch=='\n'||ch=='\r'||ch=='\t'||ch=='\v'||ch=='\''||ch=='\"'||ch=='\?'||ch=='\\'||ch=='\0')
  519.                 if(strchr("abfnrtv'?\"\\0", ch))
  520.                 {
  521.                     ct_char=escCode(ch);
  522.                     pCrtCh++;
  523.                     state=20;
  524.                 }
  525.                 // error?
  526.                 else
  527.                     tkerr(addTk(END),"should come a character to be escaped");
  528.                 break;
  529.             case 20:
  530.                 if(ch=='\'')
  531.                 {
  532.                     pCrtCh++;
  533.                     state=21;
  534.                 }
  535.                 // error?
  536.                 else
  537.                     //printf("not a qoute ch=%c",ch);
  538.                     tkerr(addTk(END),"not a quote");
  539.                 break;
  540.             case 21:
  541.                 //nCh=pCrtCh-pStartCh;
  542.                 //ct_char=createString(pStartCh+1,pCrtCh-1);
  543.                 //tk=addTk(CT_CHAR);
  544.                 //tk->text=ct_char;
  545.                 //ct_char=(int)(*(pStartCh+1));
  546.                 //ct_char=strtol(pStartCh+1,NULL,0);
  547.                 tk=addTk(CT_CHAR);
  548.                 tk->i=ct_char;
  549.                 return CT_CHAR;
  550.             case 22:
  551.                 if(ch=='\\')
  552.                 {
  553.                     //pStartCh=pCrtCh; // ?
  554.                     noBacks++;
  555.                     pCrtCh++;
  556.                     state=23;
  557.                 }
  558.                 else if(ch!='\"')
  559.                 {
  560.                     //pStartCh=pCrtCh; // ?
  561.                     pCrtCh++;
  562.                     state=24;
  563.                 }
  564.                 else if (ch=='\"')
  565.                 {
  566.                     pCrtCh++;
  567.                     state=25;
  568.                 }
  569.                 break;
  570.             case 23:
  571.                 //if(ch=='\a'||ch=='\b'||ch=='\f'||ch=='\n'||ch=='\r'||ch=='\t'||ch=='\v'||ch=='\''||ch=='\"'||ch=='\?'||ch=='\\'||ch=='\0')
  572.                 if(strchr("abfnrtv'?\"\\0", ch))
  573.                 {
  574.                     pCrtCh++;
  575.                     state=24;
  576.                 }
  577.                 //else error?
  578.                 else
  579.                     tkerr(addTk(END),"should come a character to be escaped");
  580.                 break;
  581.             case 24:
  582.                 if(ch=='\"')
  583.                 {
  584.                     pCrtCh++;
  585.                     state=25;
  586.                 }
  587.                 else
  588.                     state=22;
  589.                 break;
  590.             case 25:
  591.                 ct_string=createString(pStartCh+1,pCrtCh-1);
  592.  
  593.                 while((p=strchr(ct_string,'\\'))!=NULL)
  594.                 {
  595.                     //p=strchr(ct_string,'\\');
  596.                     //puts(p);
  597.                     memmove(p,p+1,strlen(p));
  598.                     *p=escCode(*p);
  599.                 }
  600.                 /*
  601.                 printf("No of \\ is %i\n",noBacks);
  602.                 printf("String before is %s\n",ct_string);
  603.                 for(i=0;i<noBacks;i++)
  604.                 {
  605.                     p=strchr(ct_string,'\\');
  606.                     strcpy(p,p+1);
  607.                     *p=escCode(*p);
  608.                     printf("Escaped %c\n",*p);
  609.                     printf("String at %i is %s\n",i,ct_string);
  610.                 }
  611.                 */
  612.                 tk=addTk(CT_STRING);
  613.                 tk->text=ct_string;
  614.                 return CT_STRING;
  615.             case 26:
  616.                 addTk(COMMA);
  617.                 return COMMA;
  618.             case 27:
  619.                 addTk(SEMICOLON);
  620.                 return SEMICOLON;
  621.             case 28:
  622.                 addTk(LPAR);
  623.                 return LPAR;
  624.             case 29:
  625.                 addTk(RPAR);
  626.                 return RPAR;
  627.             case 30:
  628.                 addTk(LBRACKET);
  629.                 return LBRACKET;
  630.             case 31:
  631.                 addTk(RBRACKET);
  632.                 return RBRACKET;
  633.             case 32:
  634.                 addTk(LACC);
  635.                 return LACC;
  636.             case 33:
  637.                 addTk(RACC);
  638.                 return RACC;
  639.             case 34:
  640.                 addTk(ADD);
  641.                 return ADD;
  642.             case 35:
  643.                 addTk(SUB);
  644.                 return SUB;
  645.             case 36:
  646.                 addTk(MUL);
  647.                 return MUL;
  648.             case 37:
  649.                 addTk(DIV);
  650.                 return DIV;
  651.             case 38:
  652.                 addTk(DOT);
  653.                 return DOT;
  654.             case 39:
  655.                 if(ch=='&')
  656.                 {
  657.                     pCrtCh++;
  658.                     state=40;
  659.                 }
  660.                 //else error?
  661.                 else
  662.                     tkerr(addTk(END),"should come a &");
  663.                 break;
  664.             case 40:
  665.                 addTk(AND);
  666.                 return AND;
  667.             case 41:
  668.                 if(ch=='|')
  669.                 {
  670.                     pCrtCh++;
  671.                     state=42;
  672.                 }
  673.                 //else error?
  674.                 else
  675.                     tkerr(addTk(END),"should come a |");
  676.                 break;
  677.             case 42:
  678.                 addTk(OR);
  679.                 return OR;
  680.             case 43:
  681.                 if(ch=='=')
  682.                 {
  683.                     pCrtCh++;
  684.                     state=45;
  685.                 }
  686.                 else
  687.                     state=44;
  688.                 break;
  689.             case 44:
  690.                 addTk(NOT);
  691.                 return NOT;
  692.             case 45:
  693.                 addTk(NOTEQ);
  694.                 return NOTEQ;
  695.             case 46:
  696.                 if(ch=='=')
  697.                 {
  698.                     pCrtCh++;
  699.                     state=48;
  700.                 }
  701.                 else
  702.                     state=47;
  703.                 break;
  704.             case 47:
  705.                 addTk(ASSIGN);
  706.                 return ASSIGN;
  707.             case 48:
  708.                 addTk(EQUAL);
  709.                 return EQUAL;
  710.             case 49:
  711.                 if(ch=='=')
  712.                 {
  713.                     pCrtCh++;
  714.                     state=51;
  715.                 }
  716.                 else
  717.                     state=50;
  718.                 break;
  719.             case 50:
  720.                 addTk(LESS);
  721.                 return LESS;
  722.             case 51:
  723.                 addTk(LESSEQ);
  724.                 return LESSEQ;
  725.             case 52:
  726.                 if(ch=='=')
  727.                 {
  728.                     pCrtCh++;
  729.                     state=54;
  730.                 }
  731.                 else
  732.                     state=53;
  733.                 break;
  734.             case 53:
  735.                 addTk(GREATER);
  736.                 return GREATER;
  737.             case 54:
  738.                 addTk(GREATEREQ);
  739.                 return GREATEREQ;
  740.             case 55:
  741.                 if(ch=='_' || (ch>='a'&&ch<='z') || (ch>='A'&&ch<='Z'))
  742.                 {
  743.                     pCrtCh++;
  744.                     //state=55;
  745.                 }
  746.                 else
  747.                     state=56;
  748.                 break;
  749.             case 56:
  750.                 // the id length
  751.                 nCh=pCrtCh-pStartCh;
  752.                 // keywords tests
  753.                 if(nCh==5&&!memcmp(pStartCh,"break",5))
  754.                     tk=addTk(BREAK);
  755.                 else if(nCh==4&&!memcmp(pStartCh,"char",4))
  756.                     tk=addTk(CHAR);
  757.                 else if(nCh==6&&!memcmp(pStartCh,"double",6))
  758.                     tk=addTk(DOUBLE);
  759.                 else if(nCh==4&&!memcmp(pStartCh,"else",4))
  760.                     tk=addTk(ELSE);
  761.                 else if(nCh==3&&!memcmp(pStartCh,"for",3))
  762.                     tk=addTk(FOR);
  763.                 else if(nCh==2&&!memcmp(pStartCh,"if",2))
  764.                     tk=addTk(IF);
  765.                 else if(nCh==3&&!memcmp(pStartCh,"int",3))
  766.                     tk=addTk(INT);
  767.                 else if(nCh==6&&!memcmp(pStartCh,"return",6))
  768.                     tk=addTk(RETURN);
  769.                 else if(nCh==6&&!memcmp(pStartCh,"struct",6))
  770.                     tk=addTk(STRUCT);
  771.                 else if(nCh==4&&!memcmp(pStartCh,"void",4))
  772.                     tk=addTk(VOID);
  773.                 else if(nCh==5&&!memcmp(pStartCh,"while",5))
  774.                     tk=addTk(WHILE);
  775.                 // if no keyword, then it is an ID
  776.                 else
  777.                 {
  778.                     tk=addTk(ID);
  779.                     tk->text=createString(pStartCh,pCrtCh);
  780.  
  781.                 }
  782.                 return tk->code;
  783.  
  784.         }
  785.         //printf("state=%i\n",state);
  786.     }
  787. }
  788.  
  789. void getTokens()
  790. {
  791.     do
  792.     {
  793.         getNextToken();
  794.     }while(*pCrtCh);
  795. }
  796.  
  797. /*
  798. int main()
  799. {
  800.     FILE *file=fopen("code.c","r+");
  801.     if(file==NULL)
  802.     {
  803.         printf("The file could not be opened.\n");
  804.         exit(1);
  805.     }
  806.     char *buffer;
  807.     char *input;
  808.     int no;
  809.  
  810.     input=(char *)malloc(SIZE*sizeof(char));
  811.     buffer=(char *)malloc(SIZE*sizeof(char));
  812.     strcpy(input,"");
  813.     while((no=fread(buffer,sizeof(char),SIZE,file))>0)
  814.     {
  815.         input=(char *)realloc(input, no*sizeof(char));
  816.         strcat(input, buffer);
  817.     }
  818.     input=(char *)realloc(input, (strlen(input)+1)*sizeof(char));
  819.     input[strlen(input)]='\0';
  820.     pCrtCh=input;
  821.     getTokens();
  822.     printTokens();
  823.     return 0;
  824. }
  825. */
  826.  
  827. int main()
  828. {
  829.     FILE *file=fopen("8.c","r+");
  830.     if(file==NULL)
  831.     {
  832.         printf("The file could not be opened.\n");
  833.         exit(1);
  834.     }
  835.     char *input;
  836.     int size;
  837.  
  838.     fseek(file, 0, SEEK_END); // seek to end of file
  839.     size = ftell(file); // get current file pointer
  840.     fseek(file, 0, SEEK_SET); // seek back to beginning of file
  841.  
  842.     input=(char *)malloc((size+1)*sizeof(char));
  843.     fread(input,sizeof(char),size,file);
  844.     input[size]='\0';
  845.     pCrtCh=input;
  846.     getTokens();
  847.     printTokens();
  848.     fclose(file);
  849.     return 0;
  850. }
Add Comment
Please, Sign In to add comment