void compound_stmt(int level) { int this_line = line_cnt; if(strcmp(tokenPos->textOfLine,"{") == 0) { push(LCGWAL, this_line); push_child(this_line,LOCDEC); local_dec(level+1); push_child(this_line,STMT); stmt_list(level+1); pTreeType[this_line][0] = COM_STMT; pTreeType[this_line][1] = level; if(strcmp(tokenPos->textOfLine,"}") != 0) { print_err(tokenPos->lineNum,tokenPos->textOfLine,"COMPOUND_STMT","}",tokenPos->tokenType); } else { push(RCGWAL, this_line); } } }
void itestmt(int level) { int this_line = line_cnt; push(WHILE, this_line); if(strcmp(tokenPos->textOfLine,"(") == 0 ) { push(LGWAL, this_line); push_child(this_line,EXP); exp(level+1); if(strcmp(tokenPos->textOfLine,")") == 0 ) { push(RGWAL,this_line); } else { print_err(tokenPos->lineNum,tokenPos->textOfLine,"ITESTMT", ")",tokenPos->tokenType); } push_child(this_line,EXP); stmt(level+1); pTreeType[this_line][0] = WHILE; pTreeType[this_line][1] = level; } else { print_err(tokenPos->lineNum,tokenPos->textOfLine,"ITESTMT", "(",tokenPos->tokenType); } }
void term(int level) { int this_line = line_cnt; push_child(this_line,FACTOR); factor(level); push_child(this_line,TERM); term2(level+1); }
void add_exp(int level) { int this_line = line_cnt; push_child(this_line,TERM); term(level); push_child(this_line,AEXP); add_exp2(level); }
void args_list(int level) { int this_line = line_cnt; push_child(this_line,EXP); exp(level); push_child(this_line,ARGS); args_list2(level + 1); }
void args_list2(int level) { int this_line = line_cnt; if(strcmp(tokenPos->textOfLine,",") == 0 ) { comma_check(this_line); push_child(this_line,EXP); exp(level); push_child(this_line,ARGS); args_list2(level+1); } }
void local_dec(int level) { int this_line = line_cnt; if(strcmp(tokenPos->textOfLine,"}") != 0) { while(1) { if(strcmp(tokenPos->textOfLine,"int") != 0 && strcmp(tokenPos->textOfLine,"void") !=0 ) { break; } push_child(this_line,DEC_VAR); var_dec(level); if(strcmp(tokenPos->textOfLine,"}") == 0|| tokenPos ->tokenType == ENDF) { if(true) break; } //semi_check(this_line); } } }
void args(int level) { int this_line = line_cnt; push_child(this_line,ARGS); args_list(level); }
void simple_exp(int level) { int this_line = line_cnt; push_child(this_line,AEXP); add_exp(level); if(strcmp(tokenPos->textOfLine,"<=") == 0 || strcmp(tokenPos->textOfLine,"<") == 0 || strcmp(tokenPos->textOfLine,"!=") == 0 || strcmp(tokenPos->textOfLine,"==") == 0||strcmp(tokenPos->textOfLine,">=") == 0 || strcmp(tokenPos->textOfLine,">") == 0) { int else_to_go = push_child_else(this_line,RELOP); push(RELOP,else_to_go); pTreeType[else_to_go][0] = RELOP; pTreeType[else_to_go][1] = level; //push(RELOP, this_line); push_child(this_line,AEXP); add_exp(level+1); } }
void ifstmt(int level) { int this_line = line_cnt; push(IF, this_line); if(strcmp(tokenPos->textOfLine,"(") == 0 ) { push(LGWAL, this_line); push_child(this_line,EXP); exp(level+1); if(strcmp(tokenPos->textOfLine,")") == 0 ) { push(RGWAL,this_line); } else { print_err(tokenPos->lineNum,tokenPos->textOfLine,"IFSTMT", ")",tokenPos->tokenType); } push_child(this_line,STMT); //cout<<tokenPos->textOfLine<<endl; stmt(level+1); //cout<<tokenPos->textOfLine<<endl; pTreeType[this_line][0] = IF; pTreeType[this_line][1] = level; if( strcmp(tokenPos->textOfLine,"else") == 0 ) { int else_to_go = push_child_else(this_line,STMT); push(ELSE,else_to_go); stmt(level+1); pTreeType[else_to_go][0] = ELSE; pTreeType[else_to_go][1] = level; } } else { print_err(tokenPos->lineNum,tokenPos->textOfLine, "IFSTMT","(",tokenPos->tokenType); } }
void param_list(int level) { int this_line = line_cnt; if(strcmp(tokenPos->textOfLine,")") != 0) { param(level); push_child(this_line,PARAM); param_list2(level); } }
void exp_stmt(int level) { int this_line = line_cnt; if(strcmp(tokenPos->textOfLine,";") != 0) { push_child(this_line, EXP); exp(level); } semi_check(this_line); }
void term2(int level) { int this_line = line_cnt; if(strcmp(tokenPos->textOfLine,"*") == 0 || strcmp(tokenPos->textOfLine,"/") == 0 ) { int else_to_go = push_child_else(this_line,MULOP); push(MULOP,else_to_go); pTreeType[else_to_go][0] = MULOP; pTreeType[else_to_go][1] = level; //push(MULOP, this_line); push_child(this_line,FACTOR); factor(level); push_child(this_line,TERM); term2(level+1); } else { } }
void factor(int level) { int this_line = line_cnt; list<line>::iterator look_var; look_var = tokenPos; look_var ++; if(strcmp(tokenPos->textOfLine,"(") == 0 ) { push(LGWAL,this_line); push_child(this_line,EXP); exp(level); push(RGWAL,this_line); } else if(tokenPos->tokenType == NUM ) { push(NUM,this_line); pTreeType[this_line][0] = IDEN; pTreeType[this_line][1] = level; } else if(tokenPos->tokenType == ID) { if(strcmp(look_var->textOfLine,"(") == 0 ) { push_child(this_line,CALL); call(level); } else { push_child(this_line,VAR); var(level); } } else { print_err(tokenPos->lineNum,tokenPos->textOfLine,"FACTOR","(, NUM, ID",tokenPos->tokenType); } }
void add_exp2(int level) { int this_line = line_cnt; if(strcmp(tokenPos->textOfLine,"+") == 0 || strcmp(tokenPos->textOfLine,"-") == 0 ) { int else_to_go = push_child_else(this_line,ADDOP); push(ADDOP,else_to_go); pTreeType[else_to_go][0] = ADDOP; pTreeType[else_to_go][1] = level; //push(ADDOP, this_line); push_child(this_line,TERM); term(level+1); push_child(this_line,AEXP); add_exp2(level+1); } else { } }
void stmt(int level) { int this_line = line_cnt; if(strcmp(tokenPos->textOfLine,"if") == 0) { push_child(this_line,IF); ifstmt(level); } else if(strcmp(tokenPos->textOfLine,"while") == 0) { push_child(this_line,WHILE); itestmt(level); } else if(strcmp(tokenPos->textOfLine,"return") == 0) { push_child(this_line,RETURN); return_stmt(level); } else if(strcmp(tokenPos->textOfLine,"{") == 0) { push_child(this_line,COM_STMT); compound_stmt(level); } else if(tokenPos->tokenType == ID || tokenPos->tokenType == NUM || strcmp(tokenPos->textOfLine,"(") == 0 || strcmp(tokenPos->textOfLine,";") == 0) { push_child(this_line,EXP_STMT); exp_stmt(level); } else { print_err(tokenPos->lineNum,tokenPos->textOfLine,"STMT","IF,WHILE,RETURN,{,ID,NUM,(,;",tokenPos->tokenType); } }
static void collect_child(struct da *da, struct resolve_stat *rs, int parent, unsigned char c) { int i; int base = get_base(da, parent); rs->nr = 0; ensure_array(da, base + 256); for (i = 0; i < 256; i++) { int idx = parent + base + i; if (i == c) { push_child(rs, c, 1); } else if (get_check(da, idx) == parent) { /* escape */ /*printf("idx=%d,base=%d, parent=%d,i=%d\n", idx, base, parent, i);*/ push_child(rs, i, get_base(da, idx)); /* clear */ set_base(da, idx, 0); set_check(da, idx, 0); } } }
void param_list2(int level) { int this_line = line_cnt; if(strcmp(tokenPos->textOfLine,",") == 0) { comma_check(this_line); param(level); push_child(this_line,PARAM); param_list2(level); } else { } }
void dec_list(int level) { int this_line = line_cnt; while(1) { if(tokenPos->tokenType == ENDF || tokenPos==tokens.end()) { if(true) break; } pTreeType[this_line][0] = SYNTAX_TREE; pTreeType[this_line][1] = level; push_child(this_line,DEC); dec(level+1); } }
void return_stmt(int level) { int this_line = line_cnt; if(strcmp(tokenPos->textOfLine,"return") == 0) { push(RETURN, this_line); if(strcmp(tokenPos->textOfLine,";") != 0) { push_child(this_line,EXP); exp(level + 1); } pTreeType[this_line][0] = RETURN; pTreeType[this_line][1] = level; semi_check(this_line); } }
void stmt_list(int level) { int this_line = line_cnt; if(strcmp(tokenPos->textOfLine,"}") != 0) { while(1) { push_child(this_line,STMT); stmt(level); if(strcmp(tokenPos->textOfLine,"}") == 0 || tokenPos ->tokenType == ENDF) { if(true) break; } //semi_check(this_line); } } }
void call(int level) { int this_line = line_cnt; push(ID,this_line); if(strcmp(tokenPos->textOfLine,"(") == 0 ) { push(LGWAL,this_line); if(strcmp(tokenPos->textOfLine,")") == 0 ) { push(RGWAL,this_line); } else { push_child(this_line,ARGS); args(level+1); if(strcmp(tokenPos->textOfLine,")") == 0 ) { push(RGWAL,this_line); } else { print_err(tokenPos->lineNum,tokenPos->textOfLine,"CALL", ")",tokenPos->tokenType); } } pTreeType[this_line][0] = CALL; pTreeType[this_line][1] = level; } else { print_err(tokenPos->lineNum,tokenPos->textOfLine, "CALL", "(",tokenPos->tokenType); } }
void dec(int level) { int expType; int this_line = line_cnt; findType(this_line); id_num_check(ID, this_line); if(strcmp(tokenPos->textOfLine,";") == 0) { push(SEMI, this_line); pTreeType[this_line][0] = DEC_VAR; pTreeType[this_line][1] = level; } else if(strcmp(tokenPos->textOfLine,"[") == 0) { //교제에 있는 C-언어의 정의에서 전역변수로 배열을 정의할때 //ID [NUM]이 되기 때문에 다른 하위 Terminal로 넘어가지 않고 바로 종결. NUM만 있으면 되니. push(LSGWAL, this_line); id_num_check(NUM,this_line); if(strcmp(tokenPos->textOfLine,"]") != 0) { print_err(tokenPos->lineNum,tokenPos->textOfLine,"DEC","]",tokenPos->tokenType); } else { push(RSGWAL, this_line); } semi_check(this_line); pTreeType[this_line][0] = DEC_VAR; pTreeType[this_line][1] = level; } else if(strcmp(tokenPos->textOfLine,"(") == 0)//declare Function. { push(LGWAL, this_line); list<line>::iterator temp = tokenPos; temp++; if(strcmp(tokenPos->textOfLine,"void") == 0 && strcmp((temp)->textOfLine,")") == 0) { findType(this_line); push(RGWAL, this_line); } else { push_child(this_line,PARAM); param_list(level+1); if(strcmp(tokenPos->textOfLine,")") == 0 ) { push(RGWAL, this_line); } else { print_err(tokenPos->lineNum,tokenPos->textOfLine,"DEC",")",tokenPos->tokenType); } } pTreeType[this_line][0] = DEC_FUN; pTreeType[this_line][1] = level; push_child(this_line,COM_STMT); compound_stmt(level+1); //semi_check(this_line); } else { print_err(tokenPos->lineNum,tokenPos->textOfLine,"DEC", "( or [",tokenPos->tokenType); } }
void exp(int level) { int this_line = line_cnt; int isAssign = 0; list<line>::iterator look_var; look_var = tokenPos; if(look_var->tokenType == ID) { look_var++; if(strcmp(look_var->textOfLine,"[")==0) { while(1) { look_var ++; if(strcmp(look_var->textOfLine,"]")==0) { isAssign = 1; look_var++; break; } else if(look_var->tokenType == ENDF) { break; } } } else { isAssign = 1; } //look_var++; if(strcmp(look_var->textOfLine,"=")==0 && isAssign == 1) { pTreeType[this_line][0] = ASSIGN; pTreeType[this_line][1] = level; push_child(this_line,VAR); var(level+1); push(EQUAL, this_line); push_child(this_line,EXP); exp(level+2); } else { push_child(this_line,EXP); simple_exp(level); } } else { push_child(this_line,EXP); simple_exp(level); } }