Skip to content
Snippets Groups Projects
Select Git revision
  • fc24490ed82c789ee7f6df2a1c97c8677b1367ee
  • master default protected
2 results

parser.c

Blame
  • parser.c 6.25 KiB
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include"parser.h"
    
    Tree* A();
    Tree* A_(Tree * a_);
    Tree* E();
    Tree* E_(Tree * e_);
    Tree* T();
    Tree* T_(Tree * t_);
    Tree* F();
    Tree* F_();
    
    Tree* mkTree(TOKEN type,char*vl);
    
    int not_defined(TOKEN_LIST t[]);
    void match(int a);
    void syntax_error();
    void do_syntax_analysis();
    double cal(Tree* rtnode);
    void Free_tree(Tree* node);
    
    int s_error;
    int l;
    int index_location;
    
    void do_syntax_analysis()
    {
        s_error = 0;
        index_location = 0;
        l = token_list[index_location].token;
        Tree* root = A();
        if(s_error == 1||index_location+1!=token_number)
        {
    	printf("syntax error\n");
    	Free_tree(root);
    	return;
        }
        if(not_defined(token_list) == 1)
        {
    	Free_tree(root);
    	return;
        }
        double result = cal(root);
        if(result-(int)(result)==0)
        {
    	printf("%d\n",(int)(result));
        }
        else
        {
    	printf("%f\n",result);
        }
        Free_tree(root);
        return;
    }
    
    Tree* A()
    {
        if(l==1)
        {
    //	printf("A->idA'\n");
    	Tree* temp1 = mkTree(token_list[index_location].token,token_list[index_location].value);
    	match(1);
    	return A_(temp1);
        }
        else if(l==9|l==2|l==3|l==5)
        {
    //	printf("A->F'T'E'\n");
    	Tree* temp2;
    	temp2 = F_();
    	temp2 = T_(temp2);
    	return E_(temp2);
        }
        else
        {
    	syntax_error();
    	return NULL;
        }
    }
    
    Tree* A_(Tree* a_)
    {
        if(l==4|l==5|l==6|l==7|l==0)
        {
    //	printf("A'->T'E'\n");
    	a_ = T_(a_);
    	a_ = E_(a_);
    	return a_;
        }
        else if(l==8)
        {
    //	printf("A'->=A\n");
    	Tree* temp3 = mkTree(token_list[index_location].token,token_list[index_location].value);
    	match(8);
    	temp3->left = a_;
    	temp3->right = A();
    	return temp3;
        }
    
        else
        {
    	syntax_error();
    	return NULL;
        }
    }
    
    Tree* E()
    {
        if(l==1|l==9|l==2|l==3|l==5)
        {
    //	printf("E->TE'\n");
    	Tree* temp15;
    	temp15 = T();
    	temp15 = E_(temp15);
    	return temp15;
        }
        else
        {
    	syntax_error();
    	return NULL;
        }
    }
    
    Tree* E_(Tree* e_)
    {
        if(l==10|l==0)
        {
    //	printf("E'->e\n");
    	match(0);
    	return e_;
        }
        else if(l==4)
        {
    //	printf("E'->+TE'\n");
    	Tree* temp4 = mkTree(token_list[index_location].token,"+");
    	match(4);
    	temp4->left = e_;
    	temp4->right = T();
    	return E_(temp4);
        }
        else if(l==5)
        {
    //	printf("E'->-TE'\n");
    	Tree *temp5 = mkTree(token_list[index_location].token,"-");
    	match(5);
    	temp5->left = e_;
    	temp5->right = T();
    	return E_(temp5);
        }
        else
        {
    	syntax_error();
    	return NULL;
        }
    }
    
    Tree* T()
    {
        if(l==1|l==9|l==2|l==3|l==5)
        {
    //	printf("T->FT'\n");
    	Tree* temp14;
    	temp14 = F();
    	temp14 = T_(temp14);
    	return temp14;
        }
        else
        {
    	syntax_error();
    	return NULL;
        }
    }
    
    Tree* T_(Tree *t_)
    {
        if(l==10|l==5|l==4|l==0)
        {
    //	printf("T'->e\n");
    	match(0);
    	return t_;
        }
        else if(l==6)
        {
    //	printf("T'->*FT'\n");
    	Tree *temp6 = mkTree(token_list[index_location].token,"*");
    	match(6);
    	temp6 -> left = t_;
    	temp6 -> right = F();
    	return T_(temp6);
        }
        else if(l==7)
        {
    //	printf("T'->/FT'\n");
    	Tree * temp7 = mkTree(token_list[index_location].token,"/");
    	match(7);
    	temp7 -> left = t_;
    	temp7 -> right = F();
    	return T_(temp7);
        }
        else
        {
    	syntax_error();
    	return NULL;
        }
    }
    
    Tree* F()
    {
        if(l==1)
        {
    //	printf("F->id\n");
    	Tree * temp8 = mkTree(token_list[index_location].token,token_list[index_location].value);
    	match(1);
    	return temp8;
        }
        else if(l==9|l==2|l==3|l==5)
        {
    //	printf("F->F'\n");
    	return F_();
        }
        else
        {
    	syntax_error();
    	return NULL;
        }
    }
    
    Tree* F_()
    {
        if(l==9)
        {
    //	printf("F'->(E)\n");
    	Tree* temp12;
    	match(9);
    	temp12 = E();
    	match(10);
    	return temp12;
        }
        else if(l==2)
        {
    //	printf("F'->int\n");
    	Tree* temp11 = mkTree(token_list[index_location].token,token_list[index_location].value);
    	match(2);
    	return temp11;
        }
        else if(l==3)
        {
    //	printf("F'->Double\n");
    	Tree* temp13 = mkTree(token_list[index_location].token, token_list[index_location].value);
    	match(3);
    	return temp13;
        }
        else if(l==5)
        {
    //	printf("F'->-F\n");
    	Tree* temp9 = mkTree(token_list[index_location].token,"-");
    	match(5);
    	temp9->left = F();
    	return temp9;
        }
        else
        {
    	syntax_error();
    	return NULL;
        }
    }
    
    Tree * mkTree(TOKEN type,char*vl)
    {
        Tree * temp1 = (Tree*)malloc(sizeof(Tree));
        temp1->left = NULL;
        temp1->right = NULL;
        temp1->token_type = type;
        strcpy(temp1->token_value,vl);
        return temp1;
    }
    void Free_tree(Tree * node)
    {
        if(node!=NULL)
        {
    	Free_tree(node->left);
    	Free_tree(node->right);
    	free(node);
        }
    }
    
    void match(int look_ahd)
    {
        if(look_ahd!=0)
        {
    	if(look_ahd==token_list[index_location].token)
    	{
    	    index_location = index_location+1;
    	    l = token_list[index_location].token;
    	}
    	else
    	{
    	    syntax_error();
    	    return;
    	}
        }
    }
    int not_defined(TOKEN_LIST t[])
    {
        for(int i=0;i<token_number;i++)
        {
    	if(t[i].token==1)
    	{
    	    if(t[i+1].token!=8&&symbol_table[find_symbol(t[i].value)].set_up==0)
    	    {
    		printf("%s is not defined\n",t[i].value);
    		return 1;
    	    }
    	}
        }
        return 0;
    }
    
    void syntax_error()
    {
        s_error = 1;
    }
    
    double cal(Tree* rtnode)
    {
        double temp_1,temp_2;
        while(rtnode!=NULL)
        {
    	if(rtnode->token_type == 1)
    	{
    	    return symbol_table[find_symbol(rtnode->token_value)].value.real_constant;
    	}
    	if(rtnode->token_type == 2)
    	{
    	    return atof(rtnode->token_value);
    	}
    	if(rtnode->token_type == 3)
    	{
    	    return atof(rtnode->token_value);
    	}
    	if(rtnode->token_type == 4)
    	{
    	    temp_1 = cal(rtnode->left);
    	    temp_2 = cal(rtnode->right);
    	    return temp_1+temp_2;
    	}
    	if(rtnode->token_type == 5)
    	{
    	    if(rtnode->left == NULL && rtnode->right == NULL)
    		break;
    	    if(rtnode->right == NULL)
    		return -cal(rtnode->left);
    	    else
    	    {
    		temp_1 = cal(rtnode->left);
    		temp_2 = cal(rtnode->right);
    		return temp_1 - temp_2;
    	    }
    	}
    	if(rtnode->token_type == 6)
    	{
    	    temp_1 = cal(rtnode->left);
    	    temp_2 = cal(rtnode->right);
    	    return temp_1*temp_2;
    	}
    	if(rtnode->token_type == 7)
    	{
    	    temp_1 = cal(rtnode->left);
    	    temp_2 = cal(rtnode->right);
    	    return temp_1 / temp_2;
    	}
    	if(rtnode->token_type == 8)
    	{
        	    symbol_table[find_symbol(rtnode->left->token_value)].value.real_constant = cal(rtnode->right);
    	    symbol_table[find_symbol(rtnode->left->token_value)].set_up=1;
    	    return symbol_table[find_symbol(rtnode->left->token_value)].value.real_constant;
    	}
        }
    }