LCOV - code coverage report
Current view: top level - src/parsingAnalysis/algorithm/productions - parseBinary.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 196 0
Test Date: 2025-04-18 15:53:49 Functions: 0.0 % 6 0

            Line data    Source code
       1              : #include "../../../../inc/parsingAnalysis/algorithm/topDown.h"
       2              : 
       3              : namespace nicole {
       4              : 
       5              : const std::expected<std::shared_ptr<AST>, Error>
       6            0 : TopDown::parseOr() const noexcept {
       7            0 :   const auto firsToken{tkStream_.current()};
       8            0 :   std::expected<std::shared_ptr<AST>, Error> left{parseAnd()};
       9              : 
      10            0 :   if (!left || !*left) {
      11            0 :     return std::unexpected{left ? Error{ERROR_TYPE::NULL_NODE, "left is null"}
      12            0 :                                 : left.error()};
      13            0 :   }
      14              : 
      15            0 :   while (tkStream_.currentPos() < tkStream_.size() &&
      16            0 :          (tkStream_.current()->type() == TokenType::OR)) {
      17            0 :     const Token token{*tkStream_.current()};
      18            0 :     std::expected<std::monostate, Error> eaten{tkStream_.eat()};
      19            0 :     if (!eaten) {
      20            0 :       return std::unexpected{
      21            0 :           Error{ERROR_TYPE::SINTAX,
      22            0 :                 "failed to eat " + token.raw() + " at " + token.locInfo()}};
      23            0 :     }
      24              : 
      25            0 :     const std::expected<std::shared_ptr<AST>, Error> right{parseAnd()};
      26            0 :     if (!right || !*right) {
      27            0 :       return std::unexpected{right
      28            0 :                                  ? Error{ERROR_TYPE::NULL_NODE,
      29            0 :                                          "right is null at " + token.locInfo()}
      30            0 :                                  : right.error()};
      31            0 :     }
      32              : 
      33            0 :     left =
      34            0 :         Builder::createBinary(SourceLocation{*firsToken, *tkStream_.lastRead()},
      35            0 :                               token, *left, *right);
      36            0 :     if (!left) {
      37            0 :       return std::unexpected{left.error()};
      38            0 :     }
      39            0 :   }
      40              : 
      41            0 :   return left;
      42            0 : }
      43              : 
      44              : const std::expected<std::shared_ptr<AST>, Error>
      45            0 : TopDown::parseAnd() const noexcept {
      46            0 :   const auto firsToken{tkStream_.current()};
      47            0 :   std::expected<std::shared_ptr<AST>, Error> left{parseEqual_NotEqual()};
      48              : 
      49            0 :   if (!left || !*left) {
      50            0 :     return std::unexpected{left ? Error{ERROR_TYPE::NULL_NODE, "left is null"}
      51            0 :                                 : left.error()};
      52            0 :   }
      53              : 
      54            0 :   while (tkStream_.currentPos() < tkStream_.size() &&
      55            0 :          (tkStream_.current()->type() == TokenType::AND)) {
      56            0 :     const Token token{*tkStream_.current()};
      57            0 :     std::expected<std::monostate, Error> eaten{tkStream_.eat()};
      58            0 :     if (!eaten) {
      59            0 :       return createError(ERROR_TYPE::SINTAX, "failed to eat " + token.raw() +
      60            0 :                                                  " at " + token.locInfo());
      61            0 :     }
      62              : 
      63            0 :     const std::expected<std::shared_ptr<AST>, Error> right{
      64            0 :         parseEqual_NotEqual()};
      65            0 :     if (!right || !*right) {
      66            0 :       return std::unexpected{right
      67            0 :                                  ? Error{ERROR_TYPE::NULL_NODE,
      68            0 :                                          "right is null at " + token.locInfo()}
      69            0 :                                  : right.error()};
      70            0 :     }
      71              : 
      72            0 :     left =
      73            0 :         Builder::createBinary(SourceLocation{*firsToken, *tkStream_.lastRead()},
      74            0 :                               token, *left, *right);
      75            0 :     if (!left) {
      76            0 :       return createError(left.error());
      77            0 :     }
      78            0 :   }
      79              : 
      80            0 :   return left;
      81            0 : }
      82              : 
      83              : const std::expected<std::shared_ptr<AST>, Error>
      84            0 : TopDown::parseEqual_NotEqual() const noexcept {
      85            0 :   const auto firsToken{tkStream_.current()};
      86            0 :   std::expected<std::shared_ptr<AST>, Error> left{parseCompare()};
      87              : 
      88            0 :   if (!left || !*left) {
      89            0 :     return std::unexpected{left ? Error{ERROR_TYPE::NULL_NODE, "left is null"}
      90            0 :                                 : left.error()};
      91            0 :   }
      92              : 
      93            0 :   while (tkStream_.currentPos() < tkStream_.size() &&
      94            0 :          (tkStream_.current()->type() == TokenType::EQUAL ||
      95            0 :           tkStream_.current()->type() == TokenType::NOTEQUAL)) {
      96            0 :     const Token token{*tkStream_.current()};
      97            0 :     std::expected<std::monostate, Error> eaten{tkStream_.eat()};
      98            0 :     if (!eaten) {
      99            0 :       return createError(ERROR_TYPE::SINTAX, "failed to eat " + token.raw() +
     100            0 :                                                  " at " + token.locInfo());
     101            0 :     }
     102              : 
     103            0 :     const std::expected<std::shared_ptr<AST>, Error> right{parseCompare()};
     104            0 :     if (!right || !*right) {
     105            0 :       return std::unexpected{right
     106            0 :                                  ? Error{ERROR_TYPE::NULL_NODE,
     107            0 :                                          "right is null at " + token.locInfo()}
     108            0 :                                  : right.error()};
     109            0 :     }
     110              : 
     111            0 :     left =
     112            0 :         Builder::createBinary(SourceLocation{*firsToken, *tkStream_.lastRead()},
     113            0 :                               token, *left, *right);
     114            0 :     if (!left) {
     115            0 :       return createError(left.error());
     116            0 :     }
     117            0 :   }
     118              : 
     119            0 :   return left;
     120            0 : }
     121              : 
     122              : const std::expected<std::shared_ptr<AST>, Error>
     123            0 : TopDown::parseCompare() const noexcept {
     124            0 :   const auto firsToken{tkStream_.current()};
     125            0 :   std::expected<std::shared_ptr<AST>, Error> left{parseAdd_Sub()};
     126              : 
     127            0 :   if (!left || !*left) {
     128            0 :     return std::unexpected{left ? Error{ERROR_TYPE::NULL_NODE, "left is null"}
     129            0 :                                 : left.error()};
     130            0 :   }
     131              : 
     132            0 :   while (tkStream_.currentPos() < tkStream_.size() &&
     133            0 :          (tkStream_.current()->type() == TokenType::OPERATOR_SMALLER ||
     134            0 :           tkStream_.current()->type() == TokenType::SMALLEREQUAL ||
     135            0 :           tkStream_.current()->type() == TokenType::BIGGEREQUAL ||
     136            0 :           tkStream_.current()->type() == TokenType::BIGGEREQUAL)) {
     137            0 :     const Token token{*tkStream_.current()};
     138            0 :     std::expected<std::monostate, Error> eaten{tkStream_.eat()};
     139            0 :     if (!eaten) {
     140            0 :       return createError(ERROR_TYPE::SINTAX, "failed to eat " + token.raw() +
     141            0 :                                                  " at " + token.locInfo());
     142            0 :     }
     143              : 
     144            0 :     const std::expected<std::shared_ptr<AST>, Error> right{parseAdd_Sub()};
     145            0 :     if (!right || !*right) {
     146            0 :       return std::unexpected{right
     147            0 :                                  ? Error{ERROR_TYPE::NULL_NODE,
     148            0 :                                          "right is null at " + token.locInfo()}
     149            0 :                                  : right.error()};
     150            0 :     }
     151              : 
     152            0 :     left =
     153            0 :         Builder::createBinary(SourceLocation{*firsToken, *tkStream_.lastRead()},
     154            0 :                               token, *left, *right);
     155            0 :     if (!left) {
     156            0 :       return createError(left.error());
     157            0 :     }
     158            0 :   }
     159              : 
     160            0 :   return left;
     161            0 : }
     162              : 
     163              : const std::expected<std::shared_ptr<AST>, Error>
     164            0 : TopDown::parseAdd_Sub() const noexcept {
     165            0 :   const auto firsToken{tkStream_.current()};
     166            0 :   std::expected<std::shared_ptr<AST>, Error> left{parseMult_Div_Module()};
     167              : 
     168            0 :   if (!left || !*left) {
     169            0 :     return std::unexpected{left ? Error{ERROR_TYPE::NULL_NODE, "left is null"}
     170            0 :                                 : left.error()};
     171            0 :   }
     172              : 
     173            0 :   while (tkStream_.currentPos() < tkStream_.size() &&
     174            0 :          (tkStream_.current()->type() == TokenType::OPERATOR_ADD ||
     175            0 :           tkStream_.current()->type() == TokenType::OPERATOR_SUB)) {
     176            0 :     const Token token{*tkStream_.current()};
     177            0 :     std::expected<std::monostate, Error> eaten{tkStream_.eat()};
     178            0 :     if (!eaten) {
     179            0 :       return createError(ERROR_TYPE::SINTAX, "failed to eat " + token.raw() +
     180            0 :                                                  " at " + token.locInfo());
     181            0 :     }
     182              : 
     183            0 :     const std::expected<std::shared_ptr<AST>, Error> right{
     184            0 :         parseMult_Div_Module()};
     185            0 :     if (!right || !*right) {
     186            0 :       return std::unexpected{right
     187            0 :                                  ? Error{ERROR_TYPE::NULL_NODE,
     188            0 :                                          "right is null at " + token.locInfo()}
     189            0 :                                  : right.error()};
     190            0 :     }
     191              : 
     192            0 :     left =
     193            0 :         Builder::createBinary(SourceLocation{*firsToken, *tkStream_.lastRead()},
     194            0 :                               token, *left, *right);
     195            0 :     if (!left) {
     196            0 :       return createError(left.error());
     197            0 :     }
     198            0 :   }
     199              : 
     200            0 :   return left;
     201            0 : }
     202              : 
     203              : const std::expected<std::shared_ptr<AST>, Error>
     204            0 : TopDown::parseMult_Div_Module() const noexcept {
     205            0 :   const auto firsToken{tkStream_.current()};
     206            0 :   std::expected<std::shared_ptr<AST>, Error> left{parseFactor()};
     207              : 
     208            0 :   if (!left || !*left) {
     209            0 :     return std::unexpected{left ? Error{ERROR_TYPE::NULL_NODE, "left is null"}
     210            0 :                                 : left.error()};
     211            0 :   }
     212              : 
     213            0 :   while (tkStream_.currentPos() < tkStream_.size() &&
     214            0 :          (tkStream_.current()->type() == TokenType::OPERATOR_MULT ||
     215            0 :           tkStream_.current()->type() == TokenType::OPERATOR_DIV ||
     216            0 :           tkStream_.current()->type() == TokenType::OPERATOR_MODULE)) {
     217            0 :     const Token token{*tkStream_.current()};
     218            0 :     std::expected<std::monostate, Error> eaten{tkStream_.eat()};
     219            0 :     if (!eaten) {
     220            0 :       return createError(ERROR_TYPE::SINTAX, "failed to eat " + token.raw() +
     221            0 :                                                  " at " + token.locInfo());
     222            0 :     }
     223              : 
     224            0 :     const std::expected<std::shared_ptr<AST>, Error> right{parseFactor()};
     225            0 :     if (!right || !*right) {
     226            0 :       return std::unexpected{right
     227            0 :                                  ? Error{ERROR_TYPE::NULL_NODE,
     228            0 :                                          "right is null at " + token.locInfo()}
     229            0 :                                  : right.error()};
     230            0 :     }
     231              : 
     232            0 :     left =
     233            0 :         Builder::createBinary(SourceLocation{*firsToken, *tkStream_.lastRead()},
     234            0 :                               token, *left, *right);
     235            0 :     if (!left) {
     236            0 :       return createError(left.error());
     237            0 :     }
     238            0 :   }
     239              : 
     240            0 :   return left;
     241            0 : }
     242              : 
     243              : } // namespace nicole
        

Generated by: LCOV version 2.0-1