Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int get_type(tree* tree){
- if(tree->rule == "expr expr PLUS term"){
- int exprtype=0,termtype=0,e=0;
- exprtype = get_type(tree->child.at(0));
- termtype = get_type(tree->child.at(2));
- if(exprtype == 1 && termtype == 1) {
- e=1;
- return e;
- }
- else if(exprtype == 0 && termtype == 1) {
- e=0;
- return e;
- }
- else if(exprtype == 1 && termtype == 0) {
- e=0;
- return e;
- }
- else cerr <<"ERROR invalid type operated" <<endl;
- }
- else if(tree->rule == "expr expr MINUS term"){
- int exprtype=0,termtype=0,g=0;
- exprtype = get_type(tree->child.at(0));
- termtype = get_type(tree->child.at(2));
- if(exprtype == 1 && termtype == 1) {
- g=1;
- return g;
- }
- else if(exprtype == 0 && termtype == 1) {
- g=0;
- return g;
- }
- else if(exprtype == 0 && termtype == 0) {
- g=1;
- return g;
- }
- else cerr <<"ERROR invalid type operated" <<endl;
- }
- else if(tree->rule == "expr term"){
- return get_type(tree->child.at(0));
- }
- else if(tree->rule == "term factor"){
- return get_type(tree->child.at(0));
- }
- else if(tree->rule == "term term STAR factor"){
- int exprtype=0,termtype=0,h=0;
- exprtype = get_type(tree->child.at(0));
- termtype = get_type(tree->child.at(2));
- if(exprtype == 1 && termtype == 1) {
- h=1;
- return h;
- }
- else cerr <<"ERROR invalid type operated" <<endl;
- }
- else if(tree->rule == "term term SLASH factor"){
- int exprtype=0,termtype=0,h=0;
- exprtype = get_type(tree->child.at(0));
- termtype = get_type(tree->child.at(2));
- if(exprtype == 1 && termtype == 1) {
- h=1;
- return h;
- }
- else cerr <<"ERROR invalid type operated" <<endl;
- }
- else if(tree->rule == "term term PCT factor"){
- int exprtype=0,termtype=0,h=0;
- exprtype = get_type(tree->child.at(0));
- termtype = get_type(tree->child.at(2));
- if(exprtype == 1 && termtype == 1) {
- h=1;
- return h;
- }
- else cerr <<"ERROR invalid type operated" <<endl;
- }
- else if(tree->rule == "factor ID"){
- int q = 0;
- table n_table;
- map<string,map<string,int> > temp;
- map<string,int> temp1;
- n_table = procedure_table["wain"];
- temp = n_table.sym_table;
- temp1 = temp[tree->child.at(0)->tokens.at(1)];
- //cerr << tree->child.at(0)->tokens.at(1) <<endl;
- for(map<string,int > ::iterator it2 = temp1.begin();it2 != temp1.end(); ++it2){
- //cerr << it2->first <<endl;
- if(it2->first == "int") q = 1;
- else if(it2->first == "int*") q = 0;
- }
- //cerr << q << endl;
- return q;
- }
- else if(tree->rule == "factor NUM"){
- int e = 1;
- return e;
- }
- else if(tree->rule == "factor NULL"){
- int e = 0;
- return e;
- }
- else if(tree->rule == "factor LPAREN expr RPAREN"){
- return get_type(tree->child.at(1));
- }
- else if(tree->rule == "factor AMP lvalue"){
- int x = get_type(tree->child.at(1));
- //cerr<<"lvalue gettype"<< x <<endl;
- if(x == 1) return 0;
- else cerr << "ERROR invalid, cannot do &(*int)" << endl;
- }
- else if(tree->rule == "factor STAR factor"){
- int x = get_type(tree->child.at(1));
- if(x == 0) return 1;
- else cerr << "ERROR invalid, cannot do *(int)" << endl;
- }
- else if(tree->rule == "factor NEW INT LBRACK expr RBRACK"){
- int e = 0;
- return e;
- }
- else if(tree->rule == "lvalue ID"){
- int q = 0;
- table n_table;
- map<string,map<string,int> > temp;
- map<string,int> temp1;
- n_table = procedure_table["wain"];
- temp = n_table.sym_table;
- temp1 = temp[tree->child.at(0)->tokens.at(1)];
- for(map<string,int > ::iterator it2 = temp1.begin();it2 != temp1.end(); ++it2){
- if(it2->first == "int") q = 1;
- else if(it2->first == "int*") q = 0;
- }
- return q;
- }
- else if(tree->rule == "lvalue STAR factor"){
- return get_type(tree->child.at(1));
- }
- else if(tree->rule == "lvalue LPAREN lvalue RPAREN"){
- return get_type(tree->child.at(1));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement