canezzy

syntaxAnalysis.cpp

Mar 27th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.99 KB | None | 0 0
  1. #include "SyntaxAnalysis.h"
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6.  
  7. SyntaxAnalysis::SyntaxAnalysis(LexicalAnalysis& lex) : lexicalAnalysis(lex), errorFound(false)
  8. {
  9.     tokenIterator = lexicalAnalysis.getTokenList().begin();
  10.     vars = list<Variable>();
  11. }
  12.  
  13.  
  14. bool SyntaxAnalysis::Do()
  15. {
  16.     currentToken = getNextToken();
  17.     q();
  18.    
  19.     // check if anything has been analyzed:
  20.     if (--tokenIterator == lexicalAnalysis.getTokenList().begin())
  21.         return false;
  22.     else
  23.         return !errorFound;
  24.  
  25. }
  26.  
  27.  
  28. void SyntaxAnalysis::printSyntaxError(Token& token)
  29. {
  30.     cout << "Syntax error! Token: " << token.getValue() << " unexpected" << endl;
  31. }
  32.  
  33.  
  34. void SyntaxAnalysis::eat(TokenType t)
  35. {
  36.     if (currentToken.getType() == t)
  37.     {
  38.         if (t == T_ID) {
  39.             bool found = false;
  40.             Variable temp = Variable(currentToken.getValue());
  41.             for (Variable v : vars) {
  42.                 if (v.getName() == temp.getName()) {
  43.                     found = true;
  44.                     break;
  45.                 }
  46.             }
  47.             if (!found) {
  48.                 printSyntaxError(currentToken);
  49.                 errorFound = true;
  50.             }
  51.         }
  52.         currentToken.printTokenValue();
  53.         if (t != T_END_OF_FILE)
  54.             currentToken = getNextToken();
  55.     }
  56.     else
  57.     {
  58.         printSyntaxError(currentToken);
  59.         errorFound = true;
  60.     }
  61. }
  62.  
  63. void SyntaxAnalysis::eatAndSave(TokenType t)
  64. {
  65.     if (currentToken.getType() == t)
  66.     {
  67.         currentToken.printTokenValue();
  68.         bool duplicate = false;
  69.  
  70.         Variable temp = Variable(currentToken.getValue());
  71.         for (Variable v : vars) {
  72.             if (v.getName() == temp.getName()) {
  73.                 duplicate = true;
  74.                 break;
  75.             }
  76.         }
  77.         if (duplicate) {
  78.             printSyntaxError(currentToken);
  79.             errorFound = true;
  80.         }
  81.         else {
  82.             vars.push_back(temp);
  83.         }
  84.         if (t != T_END_OF_FILE)
  85.             currentToken = getNextToken();
  86.     }
  87.     else
  88.     {
  89.         printSyntaxError(currentToken);
  90.         errorFound = true;
  91.     }
  92. }
  93.  
  94. void SyntaxAnalysis::printVars()
  95. {
  96.     cout << "Variables: " << endl;
  97.     for (Variable v : vars) {
  98.         cout << v.getName() << endl;
  99.     }
  100. }
  101.  
  102.  
  103. Token SyntaxAnalysis::getNextToken()
  104. {
  105.     if (tokenIterator == lexicalAnalysis.getTokenList().end())
  106.         throw runtime_error("End of input file reached");
  107.     return *tokenIterator++;
  108. }
  109.  
  110.  
  111. void SyntaxAnalysis::q()
  112. {
  113.     s();
  114.     l();
  115. }
  116.  
  117.  
  118. void SyntaxAnalysis::s()
  119. {
  120.     if(currentToken.getType() == T_DEC)
  121.     {
  122.         eat(T_DEC);
  123.         eatAndSave(T_ID);
  124.         eat(T_SEMI);
  125.     }
  126.     else if(currentToken.getType() == T_IF)
  127.     {
  128.         eat(T_IF);
  129.         c();
  130.         eat(T_THEN);
  131.         e();
  132.         eat(T_SEMI);
  133.     }
  134.     else
  135.     {
  136.         e();
  137.         eat(T_SEMI);
  138.     }
  139. }
  140.        
  141.  
  142.  
  143. void SyntaxAnalysis::l()
  144. {
  145.     if(currentToken.getType() == T_END_OF_FILE)
  146.     {
  147.         eat(T_END_OF_FILE);
  148.     }
  149.     else
  150.     {
  151.         q();
  152.     }
  153. }
  154.  
  155.  
  156. void SyntaxAnalysis::e()
  157. {
  158.     if(currentToken.getType() == T_ID) {
  159.         eat(T_ID);
  160.         eat(T_EQ);
  161.         if(currentToken.getType() == T_NUM)
  162.         {
  163.             eat(T_NUM);
  164.         }
  165.         else
  166.         {
  167.             eat(T_ID);
  168.             eat(T_PLUS);
  169.             if(currentToken.getType() == T_NUM)
  170.             {
  171.                 eat(T_NUM);
  172.             }
  173.             else
  174.             {
  175.                 eat(T_ID);
  176.             }
  177.         }
  178.     }
  179. }
  180.  
  181.  
  182. void SyntaxAnalysis::c()
  183. {
  184.     if(currentToken.getType() == T_ID) {
  185.         eat(T_ID);
  186.         eat(T_EQEQ);
  187.         eat(T_NUM);
  188.     }
  189. }
Advertisement
Add Comment
Please, Sign In to add comment