Advertisement
Guest User

Untitled

a guest
May 27th, 2015
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.27 KB | None | 0 0
  1. #include "parser.h"
  2. #include <stack>
  3. Parser::Parser(std::vector<Token>& tokens)
  4. {
  5.   Tokens = tokens;
  6.   Pos = 0;
  7. }
  8.  
  9. Token Parser::GetToken()
  10. {
  11.   std:: cerr << "GetToken " << std::endl;
  12.   return Tokens[Pos++];
  13. }
  14.  
  15. Tree::~Tree()
  16. {
  17.   std::cerr <<'!' << Value.Value << std::endl;
  18.   for (size_t pos = 0; pos < Children.size(); ++pos)
  19.     delete Children[pos];
  20. }
  21.  
  22. Tree::Tree(Token token)
  23. {
  24.   Value = token;
  25. }
  26.  
  27. int priority (Token token)
  28. {
  29.   string value = token.Value;
  30.   if (value == "+" || value == "-")
  31.     return 2;
  32.  
  33.   if (value == "*" || value == "/")
  34.     return 1;
  35.  
  36.   if (value == ")")
  37.     return 0;
  38.  
  39.   return -1;
  40. }
  41.  
  42. Tree* Parser::MakeTree(Token token)
  43. {
  44.   std:: cerr << "MakeTree " << token.Value << std::endl;
  45.   Tree* tree = new Tree(token);
  46.   return tree;
  47. }
  48.  
  49. void Tree::AddChild(Tree* child)
  50. {
  51.   std:: cerr << "AddChild " << std::endl;
  52.   Children.push_back(child);
  53. }
  54.  
  55. void Tree:: Print(int tab)
  56. {
  57.   for (int i = 0; i < tab; ++i)
  58.     std::cout << ' ';
  59.   std::cout << '<' << Value.Value << '>' << std::endl;
  60.   for (size_t child = 0; child < Children.size(); child++)
  61.     Children[child]->Print(tab + 1);
  62. }
  63.  
  64. Tree* Parser::GetExpression()
  65. {
  66.   std::cout << "GetExpression" << std::endl;
  67.   std::stack <Tree*> lexeme;
  68.   std::stack <Token> operation;
  69.   std::vector<Token> temp;
  70.   TokenType type = Tokens[Pos].Type;
  71.   while (isExpr(type))
  72.   {
  73.     if (type == tNUM || type == tIDENT)
  74.     {
  75.       lexeme.push(MakeTree(Tokens[Pos]));
  76.       if (Tokens[Pos + 1].Type == tIDENT)
  77.         break;
  78.       type = Tokens[++Pos].Type;
  79.       continue;
  80.     }
  81.  
  82.     if (operation.size() == 0)
  83.     {
  84.       operation.push(Tokens[Pos]);
  85.       type = Tokens[++Pos].Type;
  86.       continue;
  87.     }
  88.  
  89.     Token op_1 = Tokens[Pos], op_2 = operation.top();
  90.     while (priority(op_1) <= priority(op_2) && op_1.Type != tOBRACKET) // Если можно вытолкнуть
  91.     {
  92.       Tree* lex_1 = lexeme.top();
  93.       lexeme.pop();
  94.       Tree* lex_2 = lexeme.top();
  95.       lexeme.pop();
  96.       Tree* expr = MakeTree(op_2);
  97.       operation.pop();
  98.       expr->AddChild(lex_2);
  99.       expr->AddChild(lex_1);
  100.       lexeme.push(expr);
  101.       op_2 = operation.top();
  102.     } // то выталкиваем
  103.     operation.push(op_1);
  104.     if (Tokens[Pos + 1].Type == tIDENT && type == tOBRACKET)
  105.       break;
  106.     type == Tokens[++Pos].Type;
  107.   }
  108.   //Token op = operation.top();
  109.   //while (operation.top().Type != tOBRACKET)
  110.   //{
  111.     //Tree* lex_1 = lexeme.top();
  112.    // lexeme.pop();
  113.    //\/ Tree* lex_2 = lexeme.top();
  114.     //lexeme.pop();
  115.       //   Tree* expr = MakeTree(op);
  116.         // expr->AddChild(lex_2);
  117.         // expr->AddChild(lex_1);
  118.        //  operation.pop();
  119.          //lexeme.push(expr);
  120.       //}
  121.       //operation.pop();
  122.  
  123.       //if (Tokens[Pos + 1].Type == tIDENT)
  124.         //break;
  125.  
  126. //    if (type == tBOP)
  127.   //  {
  128.     //  Token op_1 = Tokens[Pos];
  129.      // if (operation.size() && priority(op_1) <= priority(operation.top()))
  130.       //{
  131.         // Tree* lex_1 = lexeme.top();
  132.         // lexeme.pop();
  133.         // Tree* lex_2 = lexeme.top();
  134.         // lexeme.pop();
  135.         // Tree* expr = MakeTree(op_1);
  136.         // expr->AddChild(lex_2);
  137.         // expr->AddChild(lex_1);
  138.         //Tree* expr = MakeTree(op_1);
  139.         //expr->AddChild(lexeme.top());
  140.         //lexeme.pop();
  141.         //expr->AddChild(lexeme.top());
  142.         //lexeme.pop();
  143.         //lexeme.push(expr);
  144.       //} else
  145.        // operation.push(op_1);
  146.      //}
  147.     //}
  148.    // type = Tokens[++Pos].Type;
  149.   //}
  150.   return lexeme.top();
  151. }
  152.  
  153. Tree* Parser::GetDeclaration(Token token)
  154. {
  155.   std:: cerr << "GetDeclaration " << Pos << std::endl;
  156.   Tree* declaration =  new Tree(token);
  157.   declaration->AddChild(MakeTree(GetToken()));
  158.   GetToken();
  159.   declaration->AddChild(GetExpression());
  160.   return declaration;
  161. }
  162.  
  163. Tree* Parser::GetAssignment(Token token)
  164. {
  165.   std:: cerr << "GetAssignment " << Pos << std::endl;
  166.   Tree* assignment = new Tree(GetToken());
  167.   assignment->AddChild(MakeTree(token));
  168.   assignment->AddChild(GetExpression());
  169.   return assignment;
  170. }
  171.  
  172. Tree* Parser::GetBinaryExpression()
  173. {
  174.   std:: cerr << "GetBinaryExpression " << Pos << std::endl;
  175.   Tree* expression = GetExpression();
  176.   Tree* binexp = MakeTree(GetToken());
  177.   binexp->AddChild(expression);
  178.   binexp->AddChild(GetExpression());
  179.   return binexp;
  180. }
  181.  
  182. Tree* Parser::GetIfWhile(Token token)
  183. {
  184.   std:: cerr << "GetIfWhile " << Pos << std::endl;
  185.   Tree* ifwhile = MakeTree(token);
  186.   ifwhile->AddChild(GetBinaryExpression());
  187.   ifwhile->AddChild(GetBlock());
  188.   return ifwhile;
  189. }
  190.  
  191. Tree* Parser:: GetUnOperandTree(Token token)
  192. {
  193.   std:: cerr << "GetUnOperandTree " << Pos << std::endl;
  194.   Tree* tree = MakeTree(token);
  195.   tree->AddChild(GetExpression());
  196.   return tree;
  197. }
  198.  
  199. Tree* Parser:: GetBlock()
  200. {
  201.   std:: cerr << "GetBlock " << Pos << std::endl;
  202.   Token t = GetToken();
  203.   Tree* block = new Tree(t);
  204.   while (t.Type != tEND)
  205.   {
  206.     t = GetToken();
  207.  
  208.     if (t.Type == tDECL)
  209.       block->AddChild(GetDeclaration(t));
  210.  
  211.     if (t.Type == tIFWHILE)
  212.       block->AddChild(GetIfWhile(t));
  213.  
  214.     if (t.Type == tIDENT)
  215.       block->AddChild(GetAssignment(t));
  216.  
  217.     if  (t.Type == tREAD || t.Type == tPRINT)
  218.       block->AddChild(GetUnOperandTree(t));
  219.  
  220.   }
  221.   block->AddChild(MakeTree(t));
  222.   return block;
  223. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement