muhammad_nasif

parser.y

Jun 6th, 2021
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 34.06 KB | None | 0 0
  1. %{
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<bits/stdc++.h>
  7. #include "symbolTable.cpp"
  8. //#define YYSTYPE SymbolInfo*
  9.  
  10. using namespace std;
  11.  
  12. int yyparse(void);
  13. int yylex(void);
  14. extern int line_count;
  15. extern FILE *yyin;
  16. FILE *output;
  17. SymbolTable table(30);
  18. ofstream out("output.txt");
  19. ofstream outxx("output_test.txt");
  20. int counter = 0;            ///counts the total variables as the rules detect them... used in function_scopeTable_adjustment()
  21.  
  22. vector<SymbolInfo*> names;      ///stores all the names of the variables and functions
  23. vector<SymbolInfo*> parameter;      ///stores the parameters of a function
  24. vector<string>  parameter_type;     ///stores the parameter types of a function. Runs parallelly with vector<SymbolInfo*> parameter
  25.  
  26. void yyerror(char *s)
  27. {
  28.     //cout<<"At line no: "<<line_count<<s<<endl;
  29. }
  30.  
  31.  
  32. void printVector(){
  33.    
  34. }
  35.  
  36.  
  37. void function_scopeTable_adjustment(){
  38.     int len = names.size();
  39.     int tempCtr = 0;
  40.     cout<<"----------------------------"<<endl;
  41.     cout<<"counter: "<<counter<<endl;
  42.     cout<<"len: "<<len<<endl;
  43.    
  44.     for(int i=counter;i<len;i++){
  45.         cout<<names[i]->getName()<<" "<<names[i]->getType()<<endl;
  46.         table.Insert(names[i]->getName(), names[i]->getType());
  47.         cout<<names[i]->getName()<<" "<<names[i]->getType()<<endl;
  48.         tempCtr++;
  49.     }
  50.     counter += tempCtr;
  51.     table.printAllScope(out);
  52. }
  53.  
  54.  
  55. void parameter_to_scopeTable(){
  56.     int len = parameter.size();
  57.     for(int i=0;i<len;i++){
  58.         table.Insert(parameter[i]->getName(), parameter[i]->getType());
  59.     }
  60.     parameter.clear();
  61.     parameter_type.clear();
  62. }
  63.  
  64.  
  65. void setFuncParameter(SymbolInfo* x){
  66.     int len = parameter.size();
  67.     for(int i=0;i<len;i++){
  68.         x->func_param.push_back(parameter[i]);
  69.         cout<<parameter[i]->getName()<<" "<<"pushed"<<endl;
  70.         cout<<"size:"<< x->func_param.size() <<endl;
  71.     }
  72.     cout<<"--- --- --- --- ---"<<endl;
  73.    
  74. }
  75.  
  76. %}
  77.  
  78. %union{
  79.     SymbolInfo *symbol;
  80. }
  81.  
  82. %token  LPAREN RPAREN COMMA SEMICOLON ASSIGNOP LCURL RCURL NOT INCOP DECOP  LTHIRD RTHIRD WHILE IF PRINTLN ELSE FOR VOID INT FLOAT RETURN CONTINUE BREAK CHAR DO NEWLINE
  83.  
  84. %token <symbol> CONST_FLOAT CONST_INT RELOP LOGICOP ADDOP ID MULOP
  85.  
  86. %type<symbol>start program unit func_declaration parameter_list compound_statement var_declaration type_specifier declaration_list statements statement expression_statement variable expression  logic_expression rel_expression simple_expression term unary_expression factor argument_list arguments func_definition
  87.  
  88. //%left
  89. //%right
  90.  
  91. %nonassoc LOWER_THAN_ELSE
  92. %nonassoc ELSE
  93.  
  94.  
  95. %%
  96.  
  97. start : program
  98.     {
  99.         //write your code in this block in all the similar blocks below
  100.         //cout<<"At line no: "<<line_count<<" start : program\n"<<endl<<endl;
  101.         out<<"At line no: "<<line_count<<" start : program\n"<<endl<<endl;
  102.        
  103.         SymbolInfo *x = new SymbolInfo($1->getName(),"program");
  104.         $$ = x;
  105.         //cout<< $$->getName() <<endl;
  106.         out<< $$->getName() <<endl;
  107.        
  108.        
  109.         cout<<"-----------\n\n\nVector_Names_List:"<<endl;
  110.         int len = names.size();
  111.         for(int i=0;i<len;i++){
  112.             cout<<names[i]->getName()<<" ";
  113.             if(names[i]->getArrLen()!=0){
  114.                 cout<<" "<<names[i]->getArrLen();
  115.             }
  116.             cout<<endl;
  117.         }
  118.         cout<<"-----------\n\n\n";
  119.         table.printAllScope(out);
  120.        
  121.     }
  122.     ;
  123.  
  124. program : program unit
  125.     {
  126.         //cout<<"At line no: "<<line_count<<" program : program unit"<<endl<<endl;
  127.         out<<"At line no: "<<line_count<<" program : program unit"<<endl<<endl;
  128.         SymbolInfo *x = new SymbolInfo($1->getName()+$2->getName(),"program");
  129.         $$ = x;
  130.         //cout<< $$->getName() <<endl<<endl;
  131.         out<< $$->getName() <<endl<<endl;      
  132.     }
  133.     | unit
  134.     {
  135.         //cout<<"At line no: "<<line_count<<" program : unit"<<endl<<endl;
  136.         out<<"At line no: "<<line_count<<" program : unit"<<endl<<endl;
  137.         SymbolInfo *x = new SymbolInfo($1->getName(),"program");
  138.         $$=x;
  139.         //cout<<$$->getName()<<endl<<endl;
  140.         out<<$$->getName()<<endl<<endl;
  141.     }
  142.     ;
  143.    
  144. unit : var_declaration
  145.     {
  146.         //cout<<"At line no: "<<line_count<<" unit : var_declaration"<<endl<<endl;
  147.         out<<"At line no: "<<line_count<<" unit : var_declaration"<<endl<<endl;
  148.         SymbolInfo *x = new SymbolInfo($1->getName(),"unit");
  149.         $$=x;
  150.         //cout<<$$->getName()<<endl<<endl;
  151.         out<<$$->getName()<<endl<<endl;
  152.     }
  153.      | func_declaration
  154.      {
  155.         //cout<<"At line no: "<<line_count<<" unit : func_declaration"<<endl<<endl;
  156.         out<<"At line no: "<<line_count<<" unit : func_declaration"<<endl<<endl;
  157.        
  158.         SymbolInfo *x = new SymbolInfo($1->getName(),"unit");
  159.     $$=x;
  160.     //cout<<$$->getName()<<endl<<endl;
  161.     out<<$$->getName()<<endl<<endl;
  162.      }
  163.      | func_definition
  164.      {
  165.         //cout<<"unit : func_definition"<<endl<<endl;
  166.     out<<"unit : func_definition"<<endl<<endl;      
  167.         SymbolInfo *x = new SymbolInfo($1->getName(),"unit");
  168.     $$=x;
  169.     //cout<<$$->getName()<<endl<<endl;
  170.         out<<$$->getName()<<endl<<endl;
  171.      }
  172.      ;
  173.      
  174. func_declaration : type_specifier ID LPAREN parameter_list RPAREN SEMICOLON
  175.         {
  176.             //cout<<"At line no: "<<line_count<<" func_declaration : type_specifier ID LPAREN parameter_list RPAREN SEMICOLON"<<endl<<endl;
  177.             out<<"At line no: "<<line_count<<" func_declaration : type_specifier ID LPAREN parameter_list RPAREN SEMICOLON"<<endl<<endl;
  178.             SymbolInfo *x = new SymbolInfo($1->getName()+$2->getName()+"("+$4->getName()+")"+";\n","func_declaration");
  179.             $$=x;
  180.             //cout<<$$->getName()<<endl<<endl;
  181.             out<<$$->getName()<<endl<<endl;
  182.            
  183.             //-----------int function_name(int x, double b, char c);
  184.             //-----------store function name in global scope and variables in local scope
  185.            
  186.             //inserted function_name in scopeTable
  187.             $2->func_param = parameter;
  188.             names.push_back($2);
  189.             function_scopeTable_adjustment();
  190.            
  191.             //inserted function parameter in scopeTable inside new Scope
  192.             table.EnterScope();
  193.             //setFuncParameter($2);
  194.             parameter_to_scopeTable();
  195.             table.ExitScope();
  196.            
  197.            
  198.            
  199.         }
  200.         | type_specifier ID LPAREN RPAREN SEMICOLON
  201.         {
  202.             //cout<<"At line no: "<<line_count<<" func_declaration : type_specifier ID LPAREN RPAREN SEMICOLON"<<endl<<endl;
  203.             out<<"At line no: "<<line_count<<" func_declaration : type_specifier ID LPAREN RPAREN SEMICOLON"<<endl<<endl;
  204.             SymbolInfo *x = new SymbolInfo($1->getName()+$2->getName()+"("+")"+";\n","func_declaration");
  205.             $$=x;
  206.             //cout<<$$->getName()<<endl<<endl;
  207.             out<<$$->getName()<<endl<<endl;
  208.        
  209.             //-------int bubble_sort();
  210.             //-------store function name in global scope
  211.            
  212.            
  213.            
  214.            
  215.  
  216.            
  217.            
  218.            
  219.            
  220.             names.push_back($2);
  221.             function_scopeTable_adjustment();
  222.             table.EnterScope();
  223.             table.ExitScope();
  224.            
  225.        
  226.        
  227.         }
  228.         ;
  229.          
  230. func_definition : type_specifier ID LPAREN parameter_list RPAREN compound_statement
  231.         {
  232.        
  233.             //cout<<"At line no: "<<line_count<<" func_definition : type_specifier ID LPAREN parameter_list RPAREN compound_statement"<<endl<<endl;
  234.             out<<"At line no: "<<line_count<<" func_definition : type_specifier ID LPAREN parameter_list RPAREN compound_statement"<<endl<<endl;
  235.             SymbolInfo *x = new SymbolInfo($1->getName()+$2->getName()+"("+$4->getName()+")"+$6->getName(),"func_definition");
  236.             $$=x;
  237.             //cout<<$$->getName()<<endl<<endl;
  238.             out<<$$->getName()<<endl<<endl;
  239.            
  240.             //---------------int function_name(double a, double b){ .. }
  241.             //---------------insert function_name in global scope and function_variables in local scope
  242.            
  243.            
  244.  
  245.            
  246.             //----search if the function exists
  247.             SymbolInfo *search = table.LookUp($2->getName());
  248.            
  249.            
  250.            
  251.            
  252.            
  253.            
  254.            
  255.            
  256.            
  257.             if(search){
  258.                 //the function is found... hence inside if
  259.                 //if function_name is declared before
  260.                 //then no need to insert it into symbolTable
  261.                
  262.                
  263.                
  264.                 table.EnterScope();
  265.                 table.ExitScope();
  266.                
  267.                 cout<<"$2 for : "<< $2->getName() <<endl;
  268.                 cout<<"$2 size: "<< parameter.size() <<endl;
  269.                 cout<<"$2 name: "<< $2->getName() <<endl;
  270.                 cout<<"$2 type: "<< $2->getType() <<endl;
  271.                
  272.                
  273.                 cout<<"Function declared before 1st"<<endl;
  274.                 cout<<"parameter size: "<< search->func_param.size() <<endl;
  275.                 cout<<"search name: "<< search->getName() <<endl;
  276.                 cout<<"search type: "<< search->getType() <<endl;
  277.                
  278.                 ///check if the previous declared function and this function
  279.                 ///has same number of parameters
  280.                 if(parameter.size() != search->func_param.size()){
  281.                     cout<<"Parameters did not match"<<endl;
  282.                 }
  283.                 else{
  284.                 ///number of parameters has matched and now
  285.                 ///we have to check if the parameter types
  286.                 ///are equal
  287.                 int len = search->func_param.size();
  288.                 for(int i=0;i<len;i++){
  289.                     if( search->func_param[i]->getName().compare(parameter[i]->getName()) != 0  ){
  290.                         cout<<"Different parameter type error"<<endl;
  291.                         cout<<search->func_param[i]->getType()<<endl;
  292.                         cout<<parameter[i]->getType()<<endl;
  293.                         break;
  294.                     }
  295.                 }
  296.                
  297.                
  298.                
  299.                
  300.                 }
  301.             }
  302.             else{
  303.            
  304.                 //function_name not declared. Hence pushing it into scopeTable
  305.                
  306.            
  307.                 //---------------inserted function_name in global_scope directly
  308.                
  309.                 //$2->func_param = parameter;
  310.                
  311.                 //$2->setReturnType($1->getName());         //set return type of function_name. Getting return type from type_specifier($1)
  312.                 table.Insert($2->getName(), $2->getType(), parameter, $1->getName());
  313.                 table.EnterScope();
  314.                
  315.                 parameter_to_scopeTable();
  316.                
  317.                 function_scopeTable_adjustment();
  318.                 table.ExitScope(); 
  319.                
  320.                 cout<<"Name: "<<$2->getName() <<endl;
  321.                 cout<<"Param_Size: "<<$2->func_param.size()<<endl;             
  322.                
  323.             }
  324.            
  325.            
  326.            
  327.            
  328.            
  329.            
  330.            
  331.            
  332.         }
  333.         | type_specifier ID LPAREN RPAREN compound_statement
  334.         {
  335.             //cout<<"At line no: "<<line_count<<" func_definition : type_specifier ID LPAREN RPAREN compound_statement"<<endl<<endl;
  336.             out<<"At line no: "<<line_count<<" func_definition : type_specifier ID LPAREN RPAREN compound_statement"<<endl<<endl;
  337.             SymbolInfo *x = new SymbolInfo($1->getName()+$2->getName()+"("+")"+$5->getName(),"func_definition");
  338.             $$=x;
  339.             //cout<<$$->getName()<<endl<<endl;         
  340.             out<<$$->getName()<<endl<<endl;
  341.            
  342.            
  343.            
  344.             //---------------int function_name(){ .. }
  345.             //---------------insert function_name in global scope and function_variables in local scope
  346.             //---------------inserted function_name directly in global scope
  347.            
  348.            
  349.            
  350.             //----search if the function exists
  351.             SymbolInfo *search = table.LookUp($2->getName());
  352.            
  353.             if(search){
  354.                 //if function_name is declared before
  355.                 //then no need to insert it into symbolTable
  356.                
  357.                 table.EnterScope();
  358.                 table.ExitScope();
  359.                
  360.                 cout<<"$2 for : "<< $2->getName() <<endl;
  361.                 cout<<"$2 size: "<< $2->func_param.size() <<endl;
  362.                 cout<<"$2 name: "<< $2->getName() <<endl;
  363.                 cout<<"$2 type: "<< $2->getType() <<endl;
  364.                
  365.                 cout<<"Function declared before 2nd"<<endl;
  366.                
  367.                 cout<<"search size: "<< search->func_param.size() <<endl;
  368.                 cout<<"search name: "<< search->getName() <<endl;
  369.                 cout<<"search type: "<< search->getType() <<endl;
  370.                                
  371.             }
  372.             else{
  373.            
  374.                 //function_name not declared. Hence pushing it into scopeTable
  375.                
  376.            
  377.                 //---------------inserted function_name in global_scope directly
  378.                 //names.push_back($2);
  379.                 vector<SymbolInfo*> dummy;
  380.                 table.Insert($2->getName(), $2->getType(), dummy, $1->getName());
  381.                
  382.                
  383.                
  384.                 //names.push_back($2);
  385.                 table.EnterScope();
  386.                 function_scopeTable_adjustment();
  387.                 table.ExitScope(); 
  388.             }
  389.            
  390.            
  391.            
  392.            
  393.            
  394.            
  395.            
  396.  
  397.         }
  398.         ;              
  399.  
  400.  
  401. parameter_list  : parameter_list COMMA type_specifier ID
  402.         {
  403.             //cout<<"At line no: "<<line_count<<" parameter_list : pararmeter_list COMMA  type_specifier ID"<<endl<<endl;
  404.             out<<"At line no: "<<line_count<<" parameter_list : pararmeter_list COMMA  type_specifier ID"<<endl<<endl;
  405.             SymbolInfo *x = new SymbolInfo($1->getName()+","+$3->getName()+$4->getName(),"parameter_list");
  406.             $$ = x;
  407.             //cout<<$$->getName()<<endl<<endl;
  408.             out<<$$->getName()<<endl<<endl;
  409.            
  410.            
  411.             ///------ insert parameter in variable container (vector)-> parameter
  412.             parameter.push_back($4);
  413.             parameter_type.push_back($3->getName());
  414.            
  415.         }
  416.         | parameter_list COMMA type_specifier
  417.         {
  418.             //cout<<"At line no: "<<line_count<<" parameter_list : pararmeter_list COMMA  type_specifier"<<endl<<endl;
  419.             out<<"At line no: "<<line_count<<" parameter_list : pararmeter_list COMMA  type_specifier"<<endl<<endl;
  420.             SymbolInfo *x = new SymbolInfo($1->getName()+","+$3->getName(),"parameter_list");
  421.             $$ = x;
  422.             //cout<<$$->getName()<<endl;
  423.             out<<$$->getName()<<endl;
  424.            
  425.            
  426.         }
  427.         | type_specifier ID
  428.         {
  429.             //cout<<"At line no: "<<line_count<<" parameter_list : type_specifier ID"<<endl<<endl;
  430.             out<<"At line no: "<<line_count<<" parameter_list : type_specifier ID"<<endl<<endl;
  431.             SymbolInfo *x = new SymbolInfo($1->getName()+$2->getName(),"parameter_list");
  432.             $$ = x;
  433.             //cout<<$$->getName()<<endl<<endl;
  434.             out<<$$->getName()<<endl<<endl;
  435.            
  436.             ///------ insert parameter in variable container (vector)-> parameter
  437.             parameter.push_back($2);
  438.             parameter_type.push_back($1->getName());
  439.            
  440.         }
  441.         | type_specifier
  442.         {
  443.             //cout<<"At line no: "<<line_count<<" parameter_list : type_specifier"<<endl<<endl;
  444.             out<<"At line no: "<<line_count<<" parameter_list : type_specifier"<<endl<<endl;
  445.             SymbolInfo *x = new SymbolInfo($1->getName(),"parameter_list");
  446.             $$ = x;
  447.             //cout<<"At line no: "<<line_count<< $$->getName()<<endl;
  448.             out<<"At line no: "<<line_count<< $$->getName()<<endl;
  449.         }
  450.         ;
  451.  
  452.        
  453. compound_statement : LCURL statements RCURL
  454.             {
  455.                 //cout<<"At line no: "<<line_count<<" compound_statement : LCURL statements RCURL"<<endl<<endl;
  456.                 out<<"At line no: "<<line_count<<" compound_statement : LCURL statements RCURL"<<endl<<endl;
  457.                 SymbolInfo *x = new SymbolInfo("{\n"+$2->getName()+"}\n","compound_statement");
  458.             $$ = x;
  459.             //cout<< $$->getName()<<endl;
  460.             out<< $$->getName()<<endl;
  461.             }
  462.             | LCURL RCURL
  463.             {
  464.                 //cout<<"At line no: "<<line_count<<" compound_statement : LCURL RCURL"<<endl<<endl;
  465.                 out<<"At line no: "<<line_count<<" compound_statement : LCURL RCURL"<<endl<<endl;
  466.                 SymbolInfo *x = new SymbolInfo(string("{ }\n"),"compound_statement");
  467.             $$ = x;
  468.             //cout<<"At line no: "<<line_count<< $$->getName()<<endl;
  469.             out<<"At line no: "<<line_count<< $$->getName()<<endl;
  470.             }
  471.             ;
  472.            
  473. var_declaration : type_specifier declaration_list SEMICOLON
  474.         {
  475.             //cout<<"At line no: "<<line_count<<" var_declaration : type_specifier declaration_list SEMICOLON"<<endl<<endl;
  476.             out<<"At line no: "<<line_count<<" var_declaration : type_specifier declaration_list SEMICOLON"<<endl<<endl;
  477.             SymbolInfo *x = new SymbolInfo($1->getName()+$2->getName()+";\n","var_declaration");
  478.             $$=x;
  479.             //cout<<$$->getName()<<endl<<endl;
  480.             out<<$$->getName()<<endl<<endl;
  481.         }
  482.          ;
  483.          
  484. type_specifier  : INT  
  485.         {
  486.             //cout<<"At line no: "<<line_count<<" type_specifier : INT"<<endl<<endl;
  487.             out<<"At line no: "<<line_count<<" type_specifier : INT"<<endl<<endl;
  488.             SymbolInfo *x = new SymbolInfo("int ","type_specifier");
  489.             $$=x;
  490.             //cout<<$$->getName()<<endl<<endl;
  491.             out<<$$->getName()<<endl<<endl;
  492.            
  493.         }
  494.         | FLOAT
  495.         {
  496.             //cout<<"At line no: "<<line_count<<" type_specifier : FLOAT"<<endl<<endl;
  497.             out<<"At line no: "<<line_count<<" type_specifier : FLOAT"<<endl<<endl;
  498.             SymbolInfo *x = new SymbolInfo("float ","type_specifier");
  499.             $$=x;
  500.             //cout<<$$->getName()<<endl<<endl;
  501.             out<<$$->getName()<<endl<<endl;
  502.         }
  503.        
  504.        
  505.         | VOID 
  506.         {
  507.             //cout<<"At line no: "<<line_count<<" type_specifier : VOID"<<endl<<endl;
  508.             out<<"At line no: "<<line_count<<" type_specifier : VOID"<<endl<<endl;
  509.             SymbolInfo *x = new SymbolInfo("void ","type_specifier");
  510.             $$=x;
  511.             //cout<<$$->getName()<<endl<<endl;         
  512.             out<<$$->getName()<<endl<<endl;        
  513.         }
  514.         ;
  515.        
  516. declaration_list : declaration_list COMMA ID
  517.           {
  518.             //------------declaration like
  519.             //------------x,y
  520.            
  521.            
  522.             //cout<<"At line no: "<<line_count<<" declaration_list : declaration_list COMMA ID"<<endl<<endl;
  523.             out<<"At line no: "<<line_count<<" declaration_list : declaration_list COMMA ID"<<endl<<endl;
  524.             SymbolInfo *x = new SymbolInfo($1->getName()+","+$3->getName(),"declaration_list");
  525.             $$ = x;
  526.             //cout<<$$->getName()<<endl<<endl;
  527.             out<<$$->getName()<<endl<<endl;
  528.            
  529.            
  530.             //-----have to insert into scopeTable
  531.             cout<<"Rule_1\n";
  532.             names.push_back($3);
  533.            
  534.           }
  535.           | declaration_list COMMA ID LTHIRD CONST_INT RTHIRD
  536.           {
  537.            
  538.            
  539.             // ----------- this section is for declartion like
  540.             //------------- int y,x[4]
  541.             //------------- that means array declaration           
  542.            
  543.             //cout<<"At line no: "<<line_count<<" declaration_list : declaration_list COMMA ID LTHIRD CONST_INT RTHIRD"<<endl;
  544.             out<<"At line no: "<<line_count<<" declaration_list : declaration_list COMMA ID LTHIRD CONST_INT RTHIRD"<<endl;
  545.             SymbolInfo *x = new SymbolInfo($1->getName()+","+$3->getName()+"["+$5->getName()+"]","declaration_list");
  546.             $$ = x;
  547.             //cout<<$$->getName()<<endl<<endl;
  548.             out<<$$->getName()<<endl<<endl;
  549.            
  550.            
  551.            
  552.             //-----have to insert into scopeTable
  553.             cout<<"Rule_2\n";
  554.             $3->setArrLen(stoi($5->getName()));
  555.             names.push_back($3);
  556.            
  557.            
  558.            
  559.           }
  560.           | ID
  561.           {
  562.             //cout<<"At line no: "<<line_count<<" declaration_list : ID"<<endl<<endl;
  563.             out<<"At line no: "<<line_count<<" declaration_list : ID"<<endl<<endl;
  564.             out<<"ID "<<$1->getName()<<" found"<<endl;
  565.            
  566.             //cout<<$1->getName()<<endl<<endl;
  567.             out<<$1->getName()<<endl<<endl;
  568.          
  569.            
  570.             SymbolInfo *x = new SymbolInfo($1->getName(),"declaration_list");
  571.             $$=x;
  572.            
  573.            
  574.            
  575.            
  576.             //-----have to insert into scopeTable
  577.             cout<<"Rule_3\n";
  578.             names.push_back($1);
  579.            
  580.           }
  581.           | ID LTHIRD CONST_INT RTHIRD
  582.           //----------- x[5]
  583.           {
  584.             //cout<<"At line no: "<<line_count<<" declaration_list : ID LTHIRD CONST_INT RTHIRD"<<endl<<endl;
  585.             out<<"At line no: "<<line_count<<" declaration_list : ID LTHIRD CONST_INT RTHIRD"<<endl<<endl;
  586.            
  587.             SymbolInfo *x = new SymbolInfo($1->getName()+"["+$3->getName()+"]","declaration_list");
  588.             $$ = x;
  589.             //cout<<$$->getName()<<endl<<endl;
  590.             out<<$$->getName()<<endl<<endl;
  591.            
  592.            
  593.            
  594.            
  595.             //---------have to insert into scopeTable
  596.             cout<<"Rule_4\n";
  597.             $1->setArrLen(stoi($3->getName()));
  598.             names.push_back($1);
  599.            
  600.            
  601.           }
  602.           ;
  603.          
  604. statements : statement
  605.         {
  606.             //cout<<"At line no: "<<line_count<<" statements : statement"<<endl<<endl;
  607.             out<<"At line no: "<<line_count<<" statements : statement"<<endl<<endl;
  608.             SymbolInfo *x = new SymbolInfo($1->getName(),"statements");
  609.             $$=x;
  610.             //cout<<$$->getName()<<endl<<endl;
  611.             out<<$$->getName()<<endl<<endl;
  612.            
  613.         }
  614.        | statements statement
  615.        {
  616.         //cout<<"At line no: "<<line_count<<" statements : statements statement"<<endl<<endl;
  617.         out<<"At line no: "<<line_count<<" statements : statements statement"<<endl<<endl;
  618.         SymbolInfo *x = new SymbolInfo($1->getName()+$2->getName(),"statements");
  619.         $$=x;
  620.         //cout<<$$->getName()<<endl<<endl;
  621.         out<<$$->getName()<<endl<<endl;
  622.        
  623.        }
  624.        ;
  625.        
  626. statement : var_declaration
  627.       {
  628.         //cout<<"At line no: "<<line_count <<" statement : var_declaration"<<endl<<endl;
  629.         out<<"At line no: "<<line_count <<" statement : var_declaration"<<endl<<endl;
  630.         SymbolInfo *x = new SymbolInfo($1->getName(),"statement");
  631.         $$ = x;
  632.         //cout<<$$->getName()<<endl<<endl;
  633.         out<<$$->getName()<<endl<<endl;
  634.       }
  635.       | expression_statement
  636.       {
  637.         //cout<<"At line no: "<<line_count<<" statement : expression_statement"<<endl<<endl;
  638.         out<<"At line no: "<<line_count<<" statement : expression_statement"<<endl<<endl;
  639.         SymbolInfo *x = new SymbolInfo($1->getName(),"statement");
  640.         $$ = x;
  641.         //cout<<$$->getName()<<endl<<endl;
  642.         out<<$$->getName()<<endl<<endl;
  643.       }
  644.       | compound_statement
  645.       {
  646.         //cout<<"At line no: "<<line_count<<" statement : compound_statement"<<endl<<endl;
  647.         out<<"At line no: "<<line_count<<" statement : compound_statement"<<endl<<endl;
  648.         SymbolInfo *x = new SymbolInfo($1->getName(),"statement");
  649.         $$ = x;
  650.         //cout<<$$->getName()<<endl<<endl;
  651.         out<<$$->getName()<<endl<<endl;
  652.       }
  653.      
  654.       | FOR LPAREN expression_statement expression_statement expression RPAREN statement
  655.       {
  656.         //cout<<"At line no: "<<line_count<<" statement : FOR LPAREN expression_statement expression_statement expression RPAREN statement"<<endl<<endl;
  657.         out<<"At line no: "<<line_count<<" statement : FOR LPAREN expression_statement expression_statement expression RPAREN statement"<<endl<<endl;
  658.         SymbolInfo *x = new SymbolInfo(string("for")+"("+$3->getName()+$4->getName()+$5->getName()+")"+$7->getName(),"statement");
  659.         $$ = x;
  660.         //cout<<$$->getName()<<endl<<endl;
  661.         out<<$$->getName()<<endl<<endl;
  662.       }
  663.       | IF LPAREN expression RPAREN statement %prec LOWER_THAN_ELSE
  664.       {
  665.         //cout<<"At line no: "<<line_count<<" statement : IF LPAREN expression RPAREN statement"<<endl<<endl;
  666.         out<<"At line no: "<<line_count<<" statement : IF LPAREN expression RPAREN statement"<<endl<<endl;
  667.         SymbolInfo *x = new SymbolInfo(string("if")+"("+$3->getName()+")"+$5->getName(),"statement");
  668.         $$ = x;
  669.         //cout<<$$->getName()<<endl<<endl;
  670.         out<<$$->getName()<<endl<<endl;    
  671.       }
  672.       | IF LPAREN expression RPAREN statement ELSE statement
  673.       {
  674.         //cout<<"At line no: "<<line_count<<" statement : IF LPAREN expression RPAREN statement ELSE statement"<<endl<<endl;
  675.         out<<"At line no: "<<line_count<<" statement : IF LPAREN expression RPAREN statement ELSE statement"<<endl<<endl;
  676.         SymbolInfo *x = new SymbolInfo(string("if")+"("+$3->getName()+")"+$5->getName()+"else"+$7->getName(),"statement");
  677.         $$=x;
  678.         //cout<<$$->getName()<<endl<<endl;
  679.         out<<$$->getName()<<endl<<endl;
  680.       }
  681.       | WHILE LPAREN expression RPAREN statement
  682.       {
  683.         //cout<<"At line no: "<<line_count<<" statement : WHILE LPAREN expression RPAREN statement"<<endl<<endl;
  684.         out<<"At line no: "<<line_count<<" statement : WHILE LPAREN expression RPAREN statement"<<endl<<endl;
  685.         SymbolInfo *x = new SymbolInfo(string("while ")+"("+$3->getName()+")"+";\n","statement");
  686.         $$=x;
  687.         //cout<<$$->getName()<<endl<<endl;
  688.         out<<$$->getName()<<endl<<endl;
  689.       }
  690.       | PRINTLN LPAREN ID RPAREN SEMICOLON
  691.       {
  692.         //cout<<"At line no: "<<line_count<<" statement : PRINTLN LPAREN ID RPAREN SEMICOLON"<<endl;
  693.         out<<"At line no: "<<line_count<<" statement : PRINTLN LPAREN ID RPAREN SEMICOLON"<<endl;
  694.         SymbolInfo *x = new SymbolInfo(string("println ")+"("+$3->getName()+")"+";\n","statement");
  695.         $$=x;
  696.         //cout<<$$->getName()<<endl<<endl;
  697.         out<<$$->getName()<<endl<<endl;
  698.       }
  699.      
  700.       | RETURN expression SEMICOLON
  701.       {
  702.         //cout<<"At line no: "<<line_count<<" statement : RETURN expression SEMICOLON"<<endl<<endl;
  703.         out<<"At line no: "<<line_count<<" statement : RETURN expression SEMICOLON"<<endl<<endl;
  704.         SymbolInfo *x = new SymbolInfo(string("return ")+$2->getName()+";\n","statement");
  705.         $$ = x;
  706.         //cout<<$$->getName() <<endl;
  707.         out<<$$->getName() <<endl;
  708.                        
  709.       }
  710.       ;
  711.      
  712. expression_statement    : SEMICOLON    
  713.             {
  714.                 //cout<<"At line no: "<<line_count<<" expression_statement : SEMICOLON"<<endl<<endl;
  715.                 out<<"At line no: "<<line_count<<" expression_statement : SEMICOLON"<<endl<<endl;
  716.                 SymbolInfo *x = new SymbolInfo(";\n","expression_statement");
  717.                 $$ = x;
  718.                 //cout<<$$->getName()<<endl<<endl;
  719.                 out<<$$->getName()<<endl<<endl;
  720.             }  
  721.             | expression SEMICOLON
  722.             {
  723.                 //cout<<"At line no: "<<line_count<<" expression_statement : expression SEMICOLON"<<endl<<endl;
  724.                 out<<"At line no: "<<line_count<<" expression_statement : expression SEMICOLON"<<endl<<endl;
  725.                 SymbolInfo *x = new SymbolInfo($1->getName()+";\n","expression_statement");
  726.                 $$ = x;
  727.                 //cout<<$$->getName()<<endl<<endl; 
  728.                 out<<$$->getName()<<endl<<endl;
  729.             }  
  730.             ;
  731.      
  732. variable : ID
  733.     {
  734.         //cout<<"At line no: "<<line_count<< " variable : ID"<<endl<<endl;
  735.         out<<"At line no: "<<line_count<< " variable : ID"<<endl<<endl;
  736.         SymbolInfo *x = new SymbolInfo($1->getName(),"int");
  737.         $$ = x;
  738.         //cout<<$$->getName()<<endl<<endl;
  739.         out<<$$->getName()<<endl<<endl;
  740.        
  741.     }
  742.      | ID LTHIRD expression RTHIRD
  743.      {
  744.         //cout<<"At line no: "<<line_count<<" variable : ID LTHIRD expression RTHIRD"<<endl<<endl;
  745.         out<<"At line no: "<<line_count<<" variable : ID LTHIRD expression RTHIRD"<<endl<<endl;
  746.         SymbolInfo *x = new SymbolInfo($1->getName()+ "["+ $3->getName()+"]","rel_expression");
  747.         $$ = x;
  748.         //cout<<$$->getName()<<endl<<endl;
  749.         out<<$$->getName()<<endl<<endl;
  750.      }
  751.      ;
  752.      
  753.  expression : logic_expression
  754.         {
  755.             //cout<<"At line no: "<<line_count<< " expression : logic_expression"<<endl<<endl;
  756.             out<<"At line no: "<<line_count<< " expression : logic_expression"<<endl<<endl;
  757.             SymbolInfo *x = new SymbolInfo($1->getName(),"expression");
  758.             $$ = x;
  759.             //cout<<$$->getName()<<endl<<endl;
  760.             out<<$$->getName()<<endl<<endl;
  761.         }
  762.        | variable ASSIGNOP logic_expression
  763.        {
  764.         //cout<<"At line no: "<<line_count<<" expression : variable ASSIGNOP logic_expression" <<endl<<endl;
  765.         out<<"At line no: "<<line_count<<" expression : variable ASSIGNOP logic_expression" <<endl<<endl;
  766.         SymbolInfo *x = new SymbolInfo($1->getName()+"="+$3->getName(),"expression");
  767.         $$ = x;
  768.         //cout<<$$->getName()<<endl<<endl;
  769.         out<<$$->getName()<<endl<<endl;
  770.        }    
  771.        ;
  772.            
  773. logic_expression : rel_expression
  774.         {
  775.             //cout<<"At line no: "<<line_count << " logic_expression : rel_expression"<<endl<<endl;
  776.             out<<"At line no: "<<line_count << " logic_expression : rel_expression"<<endl<<endl;
  777.            
  778.             SymbolInfo *x = new SymbolInfo($1->getName(),"logic_expression");
  779.             $$ = x;
  780.             //cout<<$$->getName()<<endl<<endl;
  781.             out<<$$->getName()<<endl<<endl;
  782.            
  783.         }
  784.          | rel_expression LOGICOP rel_expression    
  785.         {
  786.             //cout<<"At line no: "<<line_count<<" logic_expression : rel_expression LOGICOP rel_expression"<<endl<<endl;
  787.             out<<"At line no: "<<line_count<<" logic_expression : rel_expression LOGICOP rel_expression"<<endl<<endl;
  788.             SymbolInfo *x = new SymbolInfo($1->getName()+$2->getName()+$3->getName(),"logic_expression");
  789.             $$ = x;
  790.             //cout<<$$->getName()<<endl<<endl;
  791.             out<<$$->getName()<<endl<<endl;        
  792.         }
  793.          ;
  794.            
  795. rel_expression  : simple_expression
  796.         {
  797.             //cout<<"At line no: "<<line_count<<" rel_expression : simple_expression"<<endl<<endl;
  798.             out<<"At line no: "<<line_count<<" rel_expression : simple_expression"<<endl<<endl;
  799.             SymbolInfo *x = new SymbolInfo($1->getName(),"rel_expression");
  800.             $$ = x;
  801.             //cout<<$$->getName()<<endl<<endl;
  802.             out<<$$->getName()<<endl<<endl;
  803.            
  804.         }
  805.         | simple_expression RELOP simple_expression
  806.         {
  807.             //cout<<"At line no: "<<line_count<<" rel_expression : simple_expression RELOP simple_expression"<<endl<<endl;
  808.             out<<"At line no: "<<line_count<<" rel_expression : simple_expression RELOP simple_expression"<<endl<<endl;
  809.             SymbolInfo *x = new SymbolInfo($1->getName()+ $2->getName()+ $3->getName(),"rel_expression");
  810.             $$ = x;
  811.             //cout<<$$->getName()<<endl<<endl;
  812.             out<<$$->getName()<<endl<<endl;
  813.         }
  814.         ;
  815.                
  816. simple_expression : term
  817.         {
  818.             //cout<<"At line no: "<<line_count<< " simple_expression : term"<<endl<<endl;
  819.             out<<"At line no: "<<line_count<< " simple_expression : term"<<endl<<endl;
  820.             SymbolInfo *x = new SymbolInfo($1->getName(),"simple_expression");
  821.             $$ = x;
  822.             //cout<<$$->getName()<<endl<<endl;
  823.             out<<$$->getName()<<endl<<endl;
  824.         }
  825.           | simple_expression ADDOP term
  826.         {
  827.             //cout<<"At line no: "<<line_count<< " simple_expression : simple_expression ADDOP term"<<endl<<endl;
  828.             out<<"At line no: "<<line_count<< " simple_expression : simple_expression ADDOP term"<<endl<<endl;
  829.             SymbolInfo *x = new SymbolInfo($1->getName()+$2->getName()+$3->getName(),"simple_expression");
  830.             $$ = x;
  831.             //cout<<$$->getName()<<endl<<endl;
  832.             out<<$$->getName()<<endl<<endl;
  833.            
  834.         }
  835.           ;
  836.                    
  837. term :  unary_expression
  838.     {
  839.         //cout<<"At line no: "<<line_count<<" term : unary_expression"<<endl<<endl;
  840.         out<<"At line no: "<<line_count<<" term : unary_expression"<<endl<<endl;
  841.         SymbolInfo *x = new SymbolInfo($1->getName(),"term");
  842.         $$ = x;
  843.         //cout<<$$->getName()<<endl<<endl;
  844.         out<<$$->getName()<<endl<<endl;
  845.     }
  846.      |  term MULOP unary_expression
  847.     {
  848.         //cout<<"At line no: "<<line_count<<" term : term MULOP unary_expression"<<endl<<endl;
  849.         out<<"At line no: "<<line_count<<" term : term MULOP unary_expression"<<endl<<endl;
  850.         SymbolInfo *x = new SymbolInfo($1->getName()+$2->getName()+$3->getName(),"term");
  851.         $$ = x;
  852.         //cout<<$$->getName()<<endl<<endl;
  853.         out<<$$->getName()<<endl<<endl;
  854.     }
  855.      ;
  856.  
  857. unary_expression : ADDOP unary_expression
  858.         {
  859.             //cout<<"At line no: "<<line_count<<" unary_expression : ADDOP unary_expression"<<endl;
  860.             out<<"At line no: "<<line_count<<" unary_expression : ADDOP unary_expression"<<endl;
  861.             SymbolInfo *x = new SymbolInfo($1->getName()+$2->getName(),"unary_expression");
  862.             $$ = x;
  863.             //cout<<$$->getName()<<endl<<endl;
  864.             out<<$$->getName()<<endl<<endl;
  865.            
  866.         }  
  867.          | NOT unary_expression
  868.         {
  869.             //cout<<"At line no: "<<line_count<<" unary_expression : NOT unary_expression"<<endl<<endl;
  870.             out<<"At line no: "<<line_count<<" unary_expression : NOT unary_expression"<<endl<<endl;
  871.             SymbolInfo *x = new SymbolInfo("!"+$2->getName(),"unary_expression");
  872.             $$ = x;
  873.             //cout<<$$->getName()<<endl<<endl;
  874.             out<<$$->getName()<<endl<<endl;
  875.         }
  876.          | factor
  877.         {
  878.             //cout<<"At line no: "<<line_count<<" unary_expression : factor"<<endl<<endl;
  879.             out<<"At line no: "<<line_count<<" unary_expression : factor"<<endl<<endl;
  880.             SymbolInfo *x = new SymbolInfo($1->getName(),"unary_expression");
  881.             $$ = x;
  882.             //cout<<$$->getName()<<endl<<endl;
  883.             out<<$$->getName()<<endl<<endl;
  884.         }
  885.          ;
  886.    
  887. factor  : variable
  888.     {
  889.         //cout<<"At line no: "<<line_count<<" factor : variable"<<endl<<endl;
  890.         out<<"At line no: "<<line_count<<" factor : variable"<<endl<<endl;
  891.         SymbolInfo *x = new SymbolInfo($1->getName(),"factor");
  892.         $$ = x;
  893.         //cout<<$$->getName()<<endl<<endl;
  894.         out<<$$->getName()<<endl<<endl;
  895.     }
  896.     | ID LPAREN argument_list RPAREN
  897.     {
  898.         //cout<<"At line no: "<<line_count<<" factor : ID LPAREN argument_list RPAREN"<<endl<<endl;
  899.         out<<"At line no: "<<line_count<<" factor : ID LPAREN argument_list RPAREN"<<endl<<endl;
  900.        
  901.         SymbolInfo *x = new SymbolInfo($1->getName()+"("+$3->getName()+")","factor");
  902.         $$ = x;
  903.         //cout<<$$->getName()<<endl<<endl;
  904.         out<<$$->getName()<<endl<<endl;
  905.     }
  906.     | LPAREN expression RPAREN
  907.     {
  908.         //cout<<"At line no: "<<line_count<<" factor : LPAREN expression RPAREN"<<endl;
  909.         out<<"At line no: "<<line_count<<" factor : LPAREN expression RPAREN"<<endl;
  910.         SymbolInfo *x = new SymbolInfo("("+$2->getName()+")","factor");
  911.         $$ = x;
  912.         //cout<<$$->getName()<<endl<<endl;
  913.         out<<$$->getName()<<endl<<endl;
  914.        
  915.     }
  916.     | CONST_INT
  917.     {
  918.         //cout<<"At line no: "<<line_count<<" factor : CONST_INT\n"<<endl;
  919.         out<<"At line no: "<<line_count<<" factor : CONST_INT\n"<<endl;
  920.         SymbolInfo *x = new SymbolInfo($1->getName(),"int");
  921.         $$ = x;
  922.         //cout<<$$->getName()<<endl<<endl;
  923.         out<<$$->getName()<<endl<<endl;
  924.     }
  925.     | CONST_FLOAT
  926.     {
  927.         //cout<<"At line no: "<<line_count<<" factor : CONST_FLOAT\n"<<endl<<endl;
  928.         out<<"At line no: "<<line_count<<" factor : CONST_FLOAT\n"<<endl<<endl;
  929.         SymbolInfo *x = new SymbolInfo($1->getName(),"float");
  930.         $$ = x;
  931.         //cout<<$$->getName()<<endl<<endl;
  932.         out<<$$->getName()<<endl<<endl;    
  933.     }
  934.     | variable INCOP
  935.     {
  936.         //cout<<"At line no: "<<line_count<<" factor : variable INCOP\n"<<endl;
  937.         out<<"At line no: "<<line_count<<" factor : variable INCOP\n"<<endl;
  938.         SymbolInfo *x = new SymbolInfo($1->getName() + "++","factor");
  939.         $$ = x;
  940.         //cout<<$$->getName()<<endl<<endl;
  941.         out<<$$->getName()<<endl<<endl;    
  942.     }
  943.     | variable DECOP
  944.     {
  945.         //cout<<"At line no: "<<line_count<<" factor : variable DECOP\n"<<endl<<endl;
  946.         out<<"At line no: "<<line_count<<" factor : variable DECOP\n"<<endl<<endl;
  947.         SymbolInfo *x = new SymbolInfo($1->getName()+"--","factor");
  948.         $$ = x;
  949.         //cout<<$$->getName()<<endl<<endl;
  950.         out<<$$->getName()<<endl<<endl;
  951.     }
  952.     ;
  953.    
  954. argument_list : arguments
  955.     {
  956.         //cout<<"At line no: "<<line_count<<" argument_list : arguments"<<endl<<endl;
  957.         out<<"At line no: "<<line_count<<" argument_list : arguments"<<endl<<endl;
  958.         SymbolInfo *x = new SymbolInfo($1->getName(),"argument_list");
  959.         $$ = x;
  960.         //cout<<$$->getName()<<endl<<endl;
  961.         out<<$$->getName()<<endl<<endl;
  962.    
  963.     }
  964.     |
  965.     {
  966.         SymbolInfo *argumentInfo = new SymbolInfo("","argument_list");
  967.         $$ = argumentInfo;
  968.         //cout<<"At line no: "<<line_count<<$$->getName()<<endl<<endl;
  969.         out<<"At line no: "<<line_count<<$$->getName()<<endl<<endl;
  970.         //cout<<$$->getName()<<endl<<endl;     
  971.         out<<$$->getName()<<endl<<endl;
  972.     }
  973.     ;
  974.    
  975. arguments : arguments COMMA logic_expression
  976.         {
  977.             //cout<<"At line no: "<<line_count<<" arguments : arguments COMMA logic_expression"<<endl<<endl;
  978.             out<<"At line no: "<<line_count<<" arguments : arguments COMMA logic_expression"<<endl<<endl;
  979.             SymbolInfo *x = new SymbolInfo($1->getName()+","+$3->getName(),"argument_list");
  980.             $$ = x;
  981.             //cout<<$$->getName()<<endl<<endl;
  982.             out<<$$->getName()<<endl<<endl;
  983.         }
  984.           | logic_expression
  985.           {
  986.                 //cout<<"At line no: "<<line_count<<" arguments : logic_expression"<<endl<<endl;
  987.                 out<<"At line no: "<<line_count<<" arguments : logic_expression"<<endl<<endl;
  988.                 SymbolInfo *x = new SymbolInfo($1->getName(),"argument_list");
  989.             $$ = x;
  990.             //cout<<$$->getName()<<endl<<endl;
  991.             out<<$$->getName()<<endl<<endl;
  992.            
  993.           }
  994.           ;
  995.  
  996.  
  997. %%
  998. int main(int argc,char *argv[])
  999. {
  1000.     FILE  *fp, *fp2, *fp3;
  1001.  
  1002. //  if((fp=fopen(argv[1],"r"))==NULL)
  1003. //  {
  1004. //      printf("Cannot Open Input File.\n");
  1005. //      exit(1);
  1006. //  }
  1007.    
  1008. //  //cout<<"At line no: "<<line_count<<argv[2]<<endl;
  1009.    
  1010. //  fp2= fopen(argv[2],"w");
  1011. //  fclose(fp2);
  1012. //  fp3= fopen(argv[3],"w");
  1013. //  fclose(fp3);
  1014.    
  1015. //  fp2= fopen(argv[2],"a");
  1016. //  fp3= fopen(argv[3],"a");
  1017.    
  1018.     output = fopen("output_scope.txt","w");
  1019.     fclose(output);
  1020.     output = fopen("output_scope.txt","a");
  1021.    
  1022.    
  1023.     yyin=fp;
  1024.    
  1025.     yyin = fopen("input.txt","r");
  1026.    
  1027.     yyparse();
  1028.  
  1029. //  fclose(fp2);
  1030. //  fclose(fp3);
  1031.    
  1032.     return 0;
  1033. }
  1034.  
Advertisement
Add Comment
Please, Sign In to add comment