int varflag; int num_args; int num_actual; int program(); int global_elements(); int global_element(); int var_decl(); int fparam_list(); int fparams(); int pparam_list(); int pparams(); int protocol(int,int); int proto(int,int a,int); int p(int a); int a[10], b[10]; //int *a, *b; class aa { private: int a; int b; public: int func(int a,int b) { a = &b; a =*b; b = *a->c; } } int main(int argc, char** argv) { if(argc==1) { printf("syntax is d++ \n"); return 0 ; a=init(); } strcpy (filename,argv[1]); init_fsm(); a = detect(); while(1) { if(program()==2 || program==0) { printf("parse error at line no %d, column %d: ",token.lineno,token.column); printf(" expected : ;\n "); while(1) { if(feof(fptr)) break; if(strcmp(token.value,";\n")==0) { cout<<"hi"; } /*detect_tokens();*/ c =*a; d =*a->f; c =e; } printf("skipping to next semicolon at line: %d column: %d\n",token.column,token.lineno); token=detect_tokens(); if(feof(fptr)) break; } else { if(feof(fptr)) break; printf("parse error at line no %d, column %d\n",token.lineno,token.column); } } printf("parsing completed \n"); /*check();*/ } int program() { /*if(global_elements()==2) return 2; return 1;*/ return global_elements(); } int global_elements() { int flag; int state; while(state!=5) { varflag=1; flag=global_element(); if(flag==2) return 2; state=4; if(strcmp(token.value,";\n")==0) { token=detect_tokens(); if(feof(fptr))return 0; state=3; } else state=5; } /*return 1;*/ return flag; } int global_element() { int flag; int state; varflag=1; flag=var_decl(); if(flag==2) return 2; if(flag!=1) flag=function(); if(flag==2) return 2; if(flag!=1) flag = prototype(); if(flag==2) return 2; /*return 1;*/ return flag; } int var_decl() { int flag,t; t=type(); if(t!=1) return 0; if(token.code==8) { if(varflag==1) { if(global_search(token.value)!=0) {printf("multiple declarations for %s",token.value); printf("at lineno: %d column: %d\n", token.lineno,token.column); } else insert(token.value,1,varflag); } else if(varflag==2) { if(local_search(token.value)!=0) { printf(" local multiple declarations for %s",token.value); printf(" at lineno: %d column: %d\n",token.lineno,token.column); } else insert(token.value,1,varflag); } if(feof(fptr))return 0; return 1; } else { printf("error\n"); return 2; } return 0; } int type() { int flag; if(strcmp(token.value,"int\n")==0||strcmp(token.value,"float\n")==0 ||strcmp(token.value,"char\n")==0) { token=detect_tokens(); if(feof(fptr)) return 0; return 1; } return 0; } int function() { int flag,t; int args,def_flag; if(strcmp(token.value,"function\n")==0) { token=detect_tokens(); if(feof(fptr)) return 0; varflag=1; } else return 0; if(rtype()==2) return 2; if(token.code==8) { if(!search(token.value)) insert(token.value,2,varflag); else { insert(token.value,2,varflag); args = actual_args(token.value); def_flag=1; } token=detect_tokens(); if(feof(fptr)) return 0; } else return 2; if(strcmp(token.value,"(\n")==0) { token=detect_tokens(); if(feof(fptr)) return 0; } else { printf("error: unexpected token %s",token.value); printf("at line no: %d column no: %d\n",token.lineno,token.column); token=detect_tokens(); if(strcmp(token.value,"(\n")==0) { token=detect_tokens(); if (feof(fptr)) return 0; } else return 2; } varflag=2; if(fparam_list()==2) return 2; if(def_flag!=1) { current1->args=num_actual; num_actual=0; } else { if(args!=num_actual) { printf("error: paramater mismatch\n"); printf("at or before lineno: %d column: %d\n", token.lineno,token.column); } num_actual =0; } if(strcmp(token.value,")\n")==0) { token=detect_tokens(); if(feof(fptr)) return 0; } else { printf("error: unexpected token %s",token.value); printf("at line no: %d column no: %d\n",token.lineno,token.column); token=detect_tokens(); if(strcmp(token.value,")\n")==0) { token=detect_tokens(); if (feof(fptr)) return 0 ; } else return 2; } if(strcmp(token.value,"{\n")==0) { token=detect_tokens(); if(feof(fptr)) return 0; } else return 2; while(1) { t = stmt_list(); /*varflag=1;*/ if(t==2) /*return 2;*/ { printf("parse error at line: %d column: %d before: %s",token.lineno,token.column,token.value); while(1) { if(strcmp(token.value,";\n")==0) break; token=detect_tokens(); } token=detect_tokens(); printf("skipping to line no: %d column: %d\n",token.lineno,token.column); } /*else*/ { if (strcmp(token.value,"}\n")==0) { token=detect_tokens(); break; } else { if(feof(fptr)) return 0; printf("parse error at %d %d",token.lineno,token.column); printf("expected: ; or }\n"); token=detect_tokens(); } } } /*else return 2;*/ varflag=1; return 1; } int rtype() { int flag; flag = type(); if(flag==2) return 2; if(flag==1) return 1; else if(strcmp(token.value,"void\n")==0) { token = detect_tokens(); if(feof(fptr)) return 0; return 1; } return 0; } int prototype() { if(strcmp(token.value,"forward\n")==0) { token = detect_tokens(); if(feof(fptr)) return 0; } else return 2; if(rtype()==2) return 2; if(token.code==8) { insert(token.value,2,varflag); token = detect_tokens(); if(feof(fptr)) return 0; } else return 2; if(strcmp(token.value,"(\n")==0) { token = detect_tokens(); if(feof(fptr)) return 0; } else { printf("error: unexpected token %s",token.value); printf("at line no: %d column no: %d\n",token.lineno,token.column); token=detect_tokens(); if(strcmp(token.value,"(\n")==0) { token=detect_tokens() ; if (feof(fptr)) return 0; } else return 2; } if(pparam_list()==2) return 2; if(strcmp(token.value,")\n")==0) { token = detect_tokens(); if(feof(fptr)) return 0; } else { printf("error: unexpected token %s",token.value); printf("at line no: %d column no: %d\n",token.lineno,token.column); token=detect_tokens(); if(strcmp(token.value,")\n")==0) { token=detect_tokens(); if (feof(fptr)) return 0; } else return 2; } current1->args=num_actual; num_actual=0; return 1; } int fparam_list() { if(fparams()==2) return 2; return 1; } int fparams() { int t; int state; num_actual=0; while(state!=2) { /*if(var_decl()==2) return 2;*/ t=var_decl(); if(t==2) return 2; else if(t==1) if(strcmp(token.value,",\n")==0) { token=detect_tokens(); if(feof(fptr)) return 0; } else state=2; } return 1; } int pparam_list() { if(pparams()==2) return 2; } int pparams() { int state; int t; num_actual =0; while(state!=2) { /*if(type()==2) return 2;*/ t = type(); if(t==2) return 2; else if(t==1) if(strcmp(token.value,",\n")==0) { token=detect_tokens(); if(feof(fptr))return 0; } else state =2; } return 1; } int stmt_list() { int state; while(state!=2) { if(stmt()==2) return 2; if(strcmp(token.value,";\n")==0) { token=detect_tokens(); if(feof(fptr))return 0; } else state=2; } return 1; } int stmt() { int t; t=var_decl(); if(t==2) return 2; if(t!=1) t=assign(); if(t==2) return 2; if(t!=1) t=if_stmt(); if(t==2) return 2; if(t!=1) t=while_stmt(); if(t==2) return 2; if(t!=1) t=fcall(); if(t==2) return 2; return t; } int assign() { int flag; if(token.code==8) { flag = search(token.value); if (flag==0) { printf("undefined symbol %s at lineno:%d column: %d \n",token.value,token.lineno,token.column); fcall(); } else if(flag==2) return 0; else { token=detect_tokens(); if(feof(fptr))return ; } } else return 0; if(strcmp(token.value,"=\n")==0) { token=detect_tokens(); if(feof(fptr))return ; } else return 2; if(disj()==2) return 2; return 1; } int disj() { int flag; int state; while(state!=6) { flag=conj(); if(flag==2) return 2; if(strcmp(token.value,"||\n")==0) { state=0; token=detect_tokens(); if (feof(fptr)) return; } else state=6; } return flag; } int conj() { int flag; int state; while(state!=6) { flag = relat(); if(flag==2) return 2; if(strcmp(token.value,"&&\n")==0) { state=0; token=detect_tokens(); if (feof(fptr)) return; } else state=6; } return flag; } int relat() { int flag; int state; while(state!=6) { flag = expr(); if(flag==2) return 2; if(strcmp(token.value,"<=\n")==0||strcmp(token.value,">=\n")==0|| strcmp(token.value,"<\n")==0 ||strcmp(token.value,">\n")==0|| strcmp(token.value,"==\n")==0 || strcmp(token.value,"!=\n")==0) { state=0; token=detect_tokens(); if (feof(fptr)) return; } else state=6; } return flag; } int expr() { int flag; int state; while(state!=6) { flag = term(); if(flag==2) return 2; if(strcmp(token.value,"+\n")==0||strcmp(token.value,"-\n")==0) { state=0; token=detect_tokens(); if (feof(fptr)) return; } else state=6; } return flag; } int term() { int flag; int state; while(state!=13) { flag=unary(); if(flag==2) return 2; if(strcmp(token.value,"*\n")==0||strcmp(token.value,"/\n")==0 ||strcmp(token.value,"%\n")==0) {state=7; token=detect_tokens(); if (feof(fptr)) return; } else state=13; } return flag; } int unary() { if(strcmp(token.value,"+\n")==0 || strcmp(token.value,"-\n")==0 || strcmp(token.value,"!\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } return factor(); } int factor() { int flag; int state; if (token.code==1) { printf("unrecognized escape sequence %s", token.value); token=detect_tokens(); if (feof(fptr)) return; return 1; } else if(token.code==3) { printf("unmatched single quotes%s", token.value); token=detect_tokens(); if (feof(fptr)) return; return 1; } else if(token.code==9||token.code==6||token.code==11) { token=detect_tokens(); if (feof(fptr)) return; return 1; } else if(token.code==8) { flag = search(token.value); if (flag==0) { printf("undefined symbol: %s at line: %d column: %d\n ",token.value,token.lineno,token.column); fcall(); } else if(flag==2 ) {if(fcall()==2) return 2;} else { token=detect_tokens(); if (feof(fptr)) return; } return 1; } else if(strcmp(token.value,"(\n")==0) { token=detect_tokens(); if (feof(fptr)) return; if(disj()==2) return 2; if(strcmp(token.value,")\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else { printf("error: unexpected token %s",token.value); printf("at line no: %d column no: %d\n",token.lineno,token.column); token=detect_tokens(); if(strcmp(token.value,")\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else return 2; } return 1; } return 0; } int if_stmt() { if(strcmp(token.value,"if\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else return 0; if(strcmp(token.value,"(\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else { printf("error: unexpected token %s",token.value); printf("at line no: %d column no: %d\n",token.lineno,token.column); token=detect_tokens(); if(strcmp(token.value,"(\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else return 2; } if(disj()==2) return 2; if(strcmp(token.value,")\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else { printf("error: unexpected token %s",token.value); printf("at line no: %d column no: %d\n",token.lineno,token.column); token=detect_tokens(); if(strcmp(token.value,")\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else return 2; } if(stmts()==2) return 2; if(else_stmt()==2) return 2; return 1; } int stmts() { int t; t = stmt(); if(t==2) return 2; if(t==1) return 1; if(strcmp(token.value,"{\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else return 2; if(stmt_list()==2) return 2; if(strcmp(token.value,"}\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else return 2; return 1; } int else_stmt() { if(strcmp(token.value,"else\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else return 0; if(stmts()==2) return 2; return 1; } int while_stmt() { if(strcmp(token.value,"while\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else return 0; if(strcmp(token.value,"(\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else { printf("error: unexpected token %s \n",token.value); printf("at line no: %d column no: %d\n",token.lineno,token.column); token=detect_tokens(); if(strcmp(token.value,"(\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else return 2; } if(disj()==2) return 2; if(strcmp(token.value,")\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else { printf("error: unexpected token %s",token.value); printf("at line no: %d column no: %d\n",token.lineno,token.column); token=detect_tokens(); if(strcmp(token.value,")\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else return 2; } if(stmts()==2) return 2; return 1; } int fcall() { int args; if(token.code==8) { args = actual_args(token.value); token=detect_tokens(); if (feof(fptr)) return; } else return 0; if(strcmp(token.value,"(\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else return 0; if(aparam_list()==2) return 2; if(strcmp(token.value,")\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else { printf("error: unexpected token %s",token.value); printf("at line no: %d column no: %d\n",token.lineno,token.column); token=detect_tokens(); if(strcmp(token.value,")\n")==0) { token=detect_tokens(); if (feof(fptr)) return; } else return 2; } if(num_args!=args) { printf("paramater mismatch\n"); printf("before or at line no: %d column: %d\n",token.lineno,token.column); } return 1; } int aparam_list() { if(aparams()==2) return 2; return 1; } int aparams() { int state,t; num_args=0; while(state!=2) { /*if(disj()==2) return 2;*/ t=disj(); if(t==2) return 2; else if(t==1) if(strcmp(token.value,",\n")==0) { token=detect_tokens(); if(feof(fptr)) return; } else state=2; } return 1; }