Advertisement
naorzr

Untitled

Apr 5th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.79 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4. #define UNCLOSED -960
  5. #define MAXLINE 100
  6.  
  7. enum status {OUT,IN_STRING,IN_COMMENT,S_BRACKET,R_BRACKET,CL_BRACKET,CR_BRACKET,NEW_LINE,END};
  8. char peek(void);
  9. char pop(void);
  10. void add(char);
  11. int c_bracket = 0;       /* curly brackets */
  12. int r_bracket = 0;
  13. int s_bracket = 0;
  14. void printerr(char [],int,int);
  15. void fresh(void);
  16. int readline(char [],int);
  17.  
  18. int main() {
  19.     int c;
  20.     int state = OUT;
  21.     int linenum = 0;
  22.     char line[MAXLINE+1];
  23.     int ind = 0;
  24.     if(readline(line,MAXLINE))
  25.         while((c = line[ind++]) != EOF)
  26.             switch(state){
  27.                 case OUT:
  28.                     if(c =='(' || c=='[')
  29.                         add(c);
  30.                     else if(c==')' || c==']')
  31.                         c==peek()?pop():printerr(line,linenum,c);
  32.                     else if(c=='{')
  33.                         state = CL_BRACKET,c_bracket++;
  34.                     else if(c=='}')
  35.                         state = CR_BRACKET,c_bracket--;
  36.                     else if(c=='/')
  37.                         state = IN_COMMENT;
  38.                     else if(c=='\"')
  39.                         state = IN_STRING;
  40.                     else if(c=='\n')
  41.                         state = NEW_LINE;
  42.                     break;
  43.                 case IN_COMMENT:
  44.                     if(c=='*')
  45.                         state = OUT;
  46.                     break;
  47.                 case IN_STRING:
  48.                     if(c=='\"')
  49.                         state = OUT;
  50.                     break;
  51.                 case NEW_LINE:
  52.                     if(r_bracket!=0||s_bracket!=0)
  53.                         printerr(line,linenum,UNCLOSED);
  54.                     fresh();
  55.                     readline(line,MAXLINE);
  56.                     ind = 0;
  57.                     state = OUT;
  58.                     break;
  59.             }
  60.  
  61.  
  62.     return 0;
  63. }
  64.  
  65.  
  66. char stack[MAXLINE];
  67. int ind=-1;
  68.  
  69. int readline(char line[],int maxline){
  70.     int ind = 0;
  71.     while((line[ind] = getchar())!= EOF&&line[ind]!='\n')
  72.         ind++;
  73.     if(ind>0)
  74.         line[++ind] = '\0';
  75.     return ind;
  76. }
  77.  
  78. void printerr(char line[],int linenum,int bracket){
  79.     if(bracket==UNCLOSED)
  80.         printf("an error occured at line %d:\n%sbracket left unclosed\n",linenum,line);
  81.     else   
  82.         printf("an error occured at line %d:\n%splease examine %c\n",linenum,line,(char)bracket);
  83. }
  84.  
  85. char peek(void){
  86.     if(ind<0)
  87.         return 0;
  88.     return stack[ind];
  89. }
  90.  
  91. char pop(void){
  92.     if(ind<0)
  93.         return 0;
  94.     stack[ind]==')'?r_bracket--:s_bracket--;
  95.     return stack[ind--];
  96. }
  97.  
  98. void add(char a){
  99.     if(a=='(')
  100.         stack[++ind] = ')',r_bracket++;
  101.     if(a==']')
  102.         stack[++ind] = ']',s_bracket++;
  103. }
  104.  
  105. void fresh(){
  106.     ind = -1;
  107.     r_bracket = 0;
  108.     s_bracket = 0;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement