cecko
ckcontext.hpp
Go to the documentation of this file.
1 
9 #ifndef ckcontext_hpp__
10 #define ckcontext_hpp__
11 
12 #include "cktables.hpp"
13 
14 #include <string_view>
15 #include <functional>
16 #include <array>
17 #include <ostream>
18 
19 namespace cecko {
20 
21  namespace errors {
22  // messages
23 
25  template< std::size_t N>
26  using err_string_array = std::array<const char*, N>;
27 
28  template< std::size_t N>
29  class err_object_base : public err_string_array<N>
30  {
31  public:
32  const char* name;
33  protected:
34  template< typename ... AT>
35  err_object_base(const char* name, AT && ... at)
36  : err_string_array<N>{std::forward<AT>(at) ...}, name(name)
37  {}
38  };
40 
42  class err_object_s : public err_object_base<2> {
43  public:
45  err_object_s(const char* n, const char* e0, const char* e1)
46  : err_object_base<2>{ n, e0, e1 }
47  {}
49  };
50 
52  class err_object_n : public err_object_base<1> {
53  public:
55  err_object_n(const char* n, const char* e0)
56  : err_object_base<1>{ n, e0 }
57  {}
59  };
60 
62  using err_def_s = const err_object_s;
64  using err_s = std::reference_wrapper<err_def_s>;
65 
67  using err_def_n = const err_object_n;
69  using err_n = std::reference_wrapper<err_def_n>;
70 
71  extern err_def_s SYNTAX;
72  extern err_def_s INTOUTRANGE;
73  extern err_def_s BADINT;
74  extern err_def_s BADESCAPE;
75  extern err_def_s UNCHAR;
76  extern err_def_s UNDEF_IDF;
77  //extern err_def_s UNDEF_TYPEIDF; ///< Undefined type identifier
79  extern err_def_s NOFILE;
80  extern err_def_s DUPLICATE_IDF;
81  extern err_def_s DUPLICATE_TAG;
82  extern err_def_s DUPLICATE_FUNCTION_DEFINITION;
83  extern err_def_s DUPLICATE_STRUCT_DEFINITION;
84  extern err_def_s DUPLICATE_ENUM_DEFINITION;
86 
87  extern err_def_n INTERNAL;
88  extern err_def_n EMPTYCHAR;
89  extern err_def_n UNTERMCHAR;
90  extern err_def_n EOLINSTRCHR;
91  extern err_def_n EOFINSTRCHR;
92  extern err_def_n EOFINCMT;
93  extern err_def_n UNEXPENDCMT;
94  extern err_def_n VOIDEXPR;
95  //extern err_def_n ARRAY_NOT_LVALUE; ///< Array is not lvalue?
96  //extern err_def_n NAME_NOT_VALUE;
97  extern err_def_n NOT_NUMBER;
98  extern err_def_n NOT_POINTER;
100  extern err_def_n INCOMPATIBLE;
105 
107  extern err_def_n INVALID_VARIABLE_TYPE;
109  }
110 
112  namespace coverage {
113 
114  struct coverage_counter {
115  public:
116  coverage_counter()
117  : num(0)
118  {}
119 
120  void inc()
121  {
122  ++num;
123  }
124 
125  int get() const
126  {
127  return num;
128  }
129  private:
130  int num;
131  };
132 
133  using map_t = std::map<std::string, coverage_counter>;
134  using map_element_t = std::pair<const std::string, coverage_counter>;
135  using map_element_obs = const map_element_t*;
136 
137  struct line_coverage_data {
138  public:
139  void push(map_element_obs p)
140  {
141  v_.push_back(p);
142  }
143 
144  template< typename F>
145  void for_each(F && f) const
146  {
147  for (auto&& a : v_)
148  {
149  f(a->first);
150  }
151  }
152  private:
153  std::vector< map_element_obs> v_;
154  };
155 
156  using line_map_t = std::map<loc_t, line_coverage_data>;
157 
158  struct coverage_data {
159  public:
160  void inc(loc_t line, std::string n)
161  {
162  auto rv = map_.try_emplace(std::move(n));
163  rv.first->second.inc();
164  auto rvl = line_map_.try_emplace(line);
165  rvl.first->second.push(&*rv.first);
166  }
167 
168  template< typename F>
169  void for_each(F&& f) const
170  {
171  for (auto&& a : map_)
172  {
173  f(a.first, a.second);
174  }
175  }
176 
177  template< typename F>
178  void for_each_line(F&& f) const
179  {
180  for (auto&& a : line_map_)
181  {
182  f(a.first, a.second);
183  }
184  }
185  private:
186  map_t map_;
187  line_map_t line_map_;
188  };
189  }
191 
193  class context : public CKContext {
194  public:
196  context(CKTablesObs tables, std::ostream* outp, coverage::coverage_data * cd) : CKContext(tables), line_(1), outp_(outp), cd_(cd) {}
197 
198  std::ostream& out() { return *outp_; }
200 
203 
207  void message(errors::err_s err, loc_t loc, std::string_view msg);
208 
211  void message(errors::err_n err, loc_t loc);
213 
215  static std::string escape(std::string_view s);
217 
220 
221  loc_t line() const { return line_; }
222  loc_t incline() { return line_++; }
224 
226  void cov(std::string n)
227  {
228  cd_->inc(line(), std::move(n));
229  }
231  private:
232  loc_t line_;
233 
234  std::ostream * outp_;
235 
236  coverage::coverage_data * cd_;
237  };
238 
241 }
242 
243 #endif // CECKO_CONTEXT_GUARD__
err_def_n BAD_NUMBER_OF_ARGUMENTS
Bad number of arguments.
std::reference_wrapper< err_def_n > err_n
Error message without parameters.
Definition: ckcontext.hpp:69
err_def_n NOT_NUMBER
Expression is not a number.
err_def_n INTERNAL
Internal error.
std::reference_wrapper< err_def_s > err_s
Error message with a string parameter.
Definition: ckcontext.hpp:64
err_def_s UNDEF_IDF
Undefined identifier of constant/variable/function.
err_def_n VOIDEXPR
Expression is of void type.
err_def_s SYNTAX
Syntax error.
err_def_n INVALID_SPECIFIERS
Conflicting declaration specifiers.
err_def_n UNTERMCHAR
Unterminated character literal.
err_def_n NOT_NUMBER_OR_POINTER
Expression is not a number or pointer.
err_def_n EOFINSTRCHR
End of file in string/character literal.
err_def_s INTOUTRANGE
Integer literal out of range.
err_def_n INVALID_FUNCTION_TYPE
Invalid function type constructed.
err_def_n UNEXPENDCMT
Unexpected end of comment.
err_def_n EOLINSTRCHR
End of line in string/character literal.
err_def_s BADINT
Malformed integer literal.
err_def_n NOT_POINTER
Expression is not a pointer.
err_def_n EMPTYCHAR
Empty character literal.
err_def_s BADESCAPE
Malformed escape sequence.
err_def_n INVALID_ARRAY_TYPE
Invalid array type constructed.
err_def_s UNCHAR
Invalid character.
err_def_n INCOMPATIBLE
Incompatible operands.
err_def_n EOFINCMT
End of file in comment.
unsigned loc_t
Line number in the compiled source file.
Definition: cktables.hpp:24
Lexical level of compiler context + error messaging.
Definition: ckcontext.hpp:193
void message(errors::err_n err, loc_t loc)
loc_t line() const
Get current line.
Definition: ckcontext.hpp:221
void message(errors::err_s err, loc_t loc, std::string_view msg)
loc_t incline()
Increment current line.
Definition: ckcontext.hpp:222
Error message without parameters.
Definition: ckcontext.hpp:52
Error message with a string parameter.
Definition: ckcontext.hpp:42
Semantic layer of compiler context.
Definition: cktables.hpp:1101