LCOV - code coverage report
Current view: top level - src/parse - Parser.hpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 32 32 100.0 %
Date: 2025-03-25 01:19:55 Functions: 12 12 100.0 %
Branches: 20 28 71.4 %

           Branch data     Line data    Source code
       1                 :            : #pragma once
       2                 :            : 
       3                 :            : 
       4                 :            : #include "lex/Lexer.hpp"
       5                 :            : #include <array>
       6                 :            : #include <mutable/lex/Token.hpp>
       7                 :            : #include <mutable/lex/TokenType.hpp>
       8                 :            : #include <mutable/parse/AST.hpp>
       9                 :            : #include <mutable/util/Diagnostic.hpp>
      10                 :            : 
      11                 :            : 
      12                 :            : namespace m {
      13                 :            : 
      14                 :            : namespace ast {
      15                 :            : 
      16                 :            : struct M_EXPORT Parser
      17                 :            : {
      18                 :            :     using follow_set_t = std::array<bool, unsigned(TokenType::TokenType_MAX) + 1>;
      19                 :            : 
      20                 :            :     public:
      21                 :            :     Lexer      &lexer;
      22                 :            :     Diagnostic &diag;
      23                 :            : 
      24                 :            :     private:
      25                 :            :     std::array<Token, 2> lookahead_;
      26                 :            : 
      27                 :            :     public:
      28                 :       2008 :     explicit Parser(Lexer &lexer)
      29                 :       2008 :         : lexer(lexer)
      30                 :       2008 :         , diag(lexer.diag)
      31   [ +  -  +  - ]:       2008 :         , lookahead_({Token::CreateArtificial(), Token::CreateArtificial()})
      32                 :            :     {
      33         [ +  - ]:       2008 :         consume();
      34         [ +  - ]:       2008 :         consume();
      35                 :       2008 :     }
      36                 :            : 
      37                 :            :     template<unsigned Idx = 0>
      38                 :      94891 :     const Token & token() { return lookahead_[Idx]; }
      39                 :            : 
      40                 :         21 :     bool is(const TokenType tt) { return token() == tt; }
      41                 :          2 :     bool no(const TokenType tt) { return token() != tt; }
      42                 :            : 
      43                 :      26921 :     Token consume() {
      44                 :      26921 :         auto old = token();
      45         [ +  + ]:      53842 :         for (std::size_t i = 1; i != lookahead_.size(); ++i)
      46         [ +  - ]:      26921 :             lookahead_[i - 1] = lookahead_[i];
      47   [ +  -  +  - ]:      26921 :         lookahead_.back() = lexer.next();
      48                 :      26921 :         return old;
      49         [ +  - ]:      26921 :     }
      50                 :            : 
      51                 :      21649 :     bool accept(const TokenType tt) {
      52   [ +  +  +  + ]:      21649 :         if (token() == tt or token() == TK_ERROR) {
      53                 :      16011 :             consume();
      54                 :      16011 :             return true;
      55                 :            :         }
      56                 :       5638 :         return false;
      57                 :      21649 :     }
      58                 :            : 
      59                 :      12864 :     bool expect(const TokenType tt) {
      60         [ +  + ]:      12864 :         if (accept(tt)) return true;
      61                 :        194 :         diag.e(token().pos) << "expected " << tt << ", got " << token().text << '\n';
      62                 :        194 :         return false;
      63                 :      12864 :     }
      64                 :            : 
      65                 :            :     /** Consumes tokens until the first occurence of a token in the follow set \p FS is found. */
      66   [ +  +  +  + ]:        521 :     void recover(const follow_set_t &FS) { while (token() and not FS[token().type]) consume(); }
      67                 :            : 
      68                 :            :     /** Consumes tokens until the first occurence of a token in the follow set \p FS is found. Constructs an object of
      69                 :            :      * type `T` on \p start and returns a unique pointer to it.  Here, type `T` is either `ErrorStmt` or `ErrorClause`.
      70                 :            :      */
      71                 :            :     template<typename T>
      72                 :        154 :     std::unique_ptr<T> recover(Token start, const follow_set_t &FS) {
      73                 :        154 :         recover(FS);
      74                 :        154 :         return std::make_unique<T>(std::move(start));
      75                 :            :     }
      76                 :            : 
      77                 :            :     std::unique_ptr<Command> parse();
      78                 :            :     std::unique_ptr<Instruction> parse_Instruction();
      79                 :            :     std::unique_ptr<Stmt> parse_Stmt();
      80                 :            : 
      81                 :            :     /* Statements */
      82                 :            :     std::unique_ptr<Stmt> parse_CreateDatabaseStmt();
      83                 :            :     std::unique_ptr<Stmt> parse_DropDatabaseStmt();
      84                 :            :     std::unique_ptr<Stmt> parse_UseDatabaseStmt();
      85                 :            :     std::unique_ptr<Stmt> parse_CreateTableStmt();
      86                 :            :     std::unique_ptr<Stmt> parse_DropTableStmt();
      87                 :            :     std::unique_ptr<Stmt> parse_CreateIndexStmt();
      88                 :            :     std::unique_ptr<Stmt> parse_DropIndexStmt();
      89                 :            :     std::unique_ptr<Stmt> parse_SelectStmt();
      90                 :            :     std::unique_ptr<Stmt> parse_InsertStmt();
      91                 :            :     std::unique_ptr<Stmt> parse_UpdateStmt();
      92                 :            :     std::unique_ptr<Stmt> parse_DeleteStmt();
      93                 :            :     std::unique_ptr<Stmt> parse_ImportStmt();
      94                 :            : 
      95                 :            :     /* Clauses */
      96                 :            :     std::unique_ptr<Clause> parse_SelectClause();
      97                 :            :     std::unique_ptr<Clause> parse_FromClause();
      98                 :            :     std::unique_ptr<Clause> parse_WhereClause();
      99                 :            :     std::unique_ptr<Clause> parse_GroupByClause();
     100                 :            :     std::unique_ptr<Clause> parse_HavingClause();
     101                 :            :     std::unique_ptr<Clause> parse_OrderByClause();
     102                 :            :     std::unique_ptr<Clause> parse_LimitClause();
     103                 :            : 
     104                 :            :     /* Expressions */
     105                 :            :     std::unique_ptr<Expr> parse_Expr(int precedence_lhs = 0, std::unique_ptr<Expr> lhs = nullptr);
     106                 :            :     std::unique_ptr<Expr> parse_designator();
     107                 :            :     std::unique_ptr<Expr> expect_integer();
     108                 :            : 
     109                 :            :     /* Types */
     110                 :            :     const Type * parse_data_type();
     111                 :            : };
     112                 :            : 
     113                 :            : }
     114                 :            : 
     115                 :            : }

Generated by: LCOV version 1.16