Beispiel #1
0
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);
            
        }
    }
}
Beispiel #2
0
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);
        
    }

 
}
Beispiel #3
0
void term(int level)
{
    int this_line = line_cnt;
    push_child(this_line,FACTOR);
    factor(level);
    push_child(this_line,TERM);
    term2(level+1);
}
Beispiel #4
0
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);
}
Beispiel #5
0
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);
}
Beispiel #6
0
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);
    }
}
Beispiel #7
0
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);
        }
    }
}
Beispiel #8
0
void args(int level)
{
    int this_line = line_cnt;
    push_child(this_line,ARGS);
    args_list(level);
    
}
Beispiel #9
0
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);
    }

}
Beispiel #10
0
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);

    }

    
}
Beispiel #11
0
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);
    }
}
Beispiel #12
0
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);
    
}
Beispiel #13
0
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
    {
        
    }

}
Beispiel #14
0
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);

    }
}
Beispiel #15
0
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
    {
        
    }

}
Beispiel #16
0
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);

    }
    

}
Beispiel #17
0
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);
    }
  }
}
Beispiel #18
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
    {
        
    }
}
Beispiel #19
0
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);
    }
}
Beispiel #20
0
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);
    }
}
Beispiel #21
0
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);
        }
    }
}
Beispiel #22
0
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);

    }
    
}
Beispiel #23
0
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);
    }
    
}
Beispiel #24
0
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);
    }
    

}