cecko
ckmain.hpp
1 #ifndef ckmain_hpp_
2 #define ckmain_hpp_
3 
4 #include "ckcontext.hpp"
5 #include "ckbisonflex.hpp"
6 
7 #include <string>
8 #include <ostream>
9 #include <fstream>
10 #include <iostream>
11 #include <sstream>
12 
13 namespace cecko {
14 
16  class main_state_lexer {
17  public:
18  CKIREnvironment irenv;
19  CKTables the_tables;
20 
21  main_state_lexer()
22  : irenv(), the_tables(&irenv)
23  {}
24  };
25 
26  class main_state_parser : public main_state_lexer {
27  public:
28  std::string input_fname;
29  std::string covname;
30  std::string covlinename;
31 
32  main_state_parser() : outp_(&std::cout) {}
33 
34  template< class the_parser>
35  bool parse()
36  {
37  context ctx(&the_tables, &out(), &cd_);
38 
39  FILE* iff = fopen(input_fname.c_str(), "r");
40  if (iff == nullptr)
41  {
42  ctx.message(cecko::errors::NOFILE, 0, input_fname);
43  return false;
44  }
45 
46  auto scn = lexer_init(iff);
47 
48  the_parser prs(scn, &ctx);
49 
50  prs.parse();
51 
52  lexer_shutdown(scn);
53  return true;
54  }
55 
56  bool dump_tables() const;
57 
58  bool dump_coverage() const;
59 
60  std::ostream& out() const { return *outp_; }
61  protected:
62  std::ostream* outp_;
63  std::unique_ptr< std::ofstream> outp_owner_;
64 
65  coverage::coverage_data cd_;
66  };
67 
68  class main_state_code : public main_state_parser {
69  public:
70  std::string oname; // binary output
71  std::string aname; // assembly output
72  bool a_to_out = true; // assembly to out()
73  int app_argc = 0;
74  char** app_argv = nullptr;
75 
76  main_state_code()
77  : app_argc(0), app_argv(nullptr)
78  {}
79 
80  bool setup(int argc, char** argv);
81 
82  bool dump_code() const;
83 
84  bool run_code();
85  };
87 }
88 
89 #endif