Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
- #define UNCLOSED -960
- #define MAXLINE 100
- enum status {OUT,IN_STRING,IN_COMMENT,S_BRACKET,R_BRACKET,CL_BRACKET,CR_BRACKET,NEW_LINE,END};
- char peek(void);
- char pop(void);
- void add(char);
- int c_bracket = 0; /* curly brackets */
- int r_bracket = 0;
- int s_bracket = 0;
- void printerr(char [],int,int);
- void fresh(void);
- int readline(char [],int);
- int main() {
- int c;
- int state = OUT;
- int linenum = 0;
- char line[MAXLINE+1];
- int ind = 0;
- if(readline(line,MAXLINE))
- while((c = line[ind++]) != EOF)
- switch(state){
- case OUT:
- if(c =='(' || c=='[')
- add(c);
- else if(c==')' || c==']')
- c==peek()?pop():printerr(line,linenum,c);
- else if(c=='{')
- state = CL_BRACKET,c_bracket++;
- else if(c=='}')
- state = CR_BRACKET,c_bracket--;
- else if(c=='/')
- state = IN_COMMENT;
- else if(c=='\"')
- state = IN_STRING;
- else if(c=='\n')
- state = NEW_LINE;
- break;
- case IN_COMMENT:
- if(c=='*')
- state = OUT;
- break;
- case IN_STRING:
- if(c=='\"')
- state = OUT;
- break;
- case NEW_LINE:
- if(r_bracket!=0||s_bracket!=0)
- printerr(line,linenum,UNCLOSED);
- fresh();
- readline(line,MAXLINE);
- ind = 0;
- state = OUT;
- break;
- }
- return 0;
- }
- char stack[MAXLINE];
- int ind=-1;
- int readline(char line[],int maxline){
- int ind = 0;
- while((line[ind] = getchar())!= EOF&&line[ind]!='\n')
- ind++;
- if(ind>0)
- line[++ind] = '\0';
- return ind;
- }
- void printerr(char line[],int linenum,int bracket){
- if(bracket==UNCLOSED)
- printf("an error occured at line %d:\n%sbracket left unclosed\n",linenum,line);
- else
- printf("an error occured at line %d:\n%splease examine %c\n",linenum,line,(char)bracket);
- }
- char peek(void){
- if(ind<0)
- return 0;
- return stack[ind];
- }
- char pop(void){
- if(ind<0)
- return 0;
- stack[ind]==')'?r_bracket--:s_bracket--;
- return stack[ind--];
- }
- void add(char a){
- if(a=='(')
- stack[++ind] = ')',r_bracket++;
- if(a==']')
- stack[++ind] = ']',s_bracket++;
- }
- void fresh(){
- ind = -1;
- r_bracket = 0;
- s_bracket = 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement