User Guide
c11_driver.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2023 Blue Brain Project, EPFL.
3  * See the top-level LICENSE file for details.
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #include <fstream>
9 #include <sstream>
10 
11 #include "lexer/c11_lexer.hpp"
12 #include "parser/c11_driver.hpp"
13 
14 namespace nmodl {
15 namespace parser {
16 
17 CDriver::CDriver() = default;
18 
19 CDriver::CDriver(bool strace, bool ptrace)
20  : trace_scanner(strace)
21  , trace_parser(ptrace) {}
22 
23 CDriver::~CDriver() = default;
24 
25 /// parse c file provided as istream
26 bool CDriver::parse_stream(std::istream& in) {
27  lexer.reset(new CLexer(*this, &in));
28  parser.reset(new CParser(*lexer, *this));
29 
30  lexer->set_debug(trace_scanner);
31  parser->set_debug_level(trace_parser);
32  return parser->parse() == 0;
33 }
34 
35 //// parse c file
36 bool CDriver::parse_file(const std::string& filename) {
37  std::ifstream in(filename.c_str());
38  streamname = filename;
39 
40  if (!in.good()) {
41  return false;
42  }
43  return parse_stream(in);
44 }
45 
46 /// parser c provided as string (used for testing)
47 bool CDriver::parse_string(const std::string& input) {
48  std::istringstream iss(input);
49  return parse_stream(iss);
50 }
51 
52 void CDriver::error(const std::string& m) {
53  std::cerr << m << '\n';
54 }
55 
56 void CDriver::add_token(const std::string& text) {
57  tokens.push_back(text);
58  // here we will query and look into symbol table or register callback
59 }
60 
61 void CDriver::error(const std::string& m, const location& l) {
62  std::cerr << l << " : " << m << '\n';
63 }
64 
65 void CDriver::scan_string(const std::string& text) {
66  std::istringstream in(text);
67  lexer.reset(new CLexer(*this, &in));
68  parser.reset(new CParser(*lexer, *this));
69  while (true) {
70  auto sym = lexer->next_token();
71  auto token_type = sym.type_get();
72  if (token_type == CParser::by_type(CParser::token::END).type_get()) {
73  break;
74  }
75  }
76 }
77 
78 } // namespace parser
79 } // namespace nmodl
nmodl::parser::CLexer
Represent Lexer/Scanner class for C (11) language parsing.
Definition: c11_lexer.hpp:50
nmodl::parser::CDriver::parse_string
bool parse_string(const std::string &input)
parser c provided as string (used for testing)
Definition: c11_driver.cpp:47
nmodl::parser::CDriver::CDriver
CDriver()
nmodl
encapsulates code generation backend implementations
Definition: ast_common.hpp:26
nmodl::parser::CDriver::parse_stream
bool parse_stream(std::istream &in)
parse c file provided as istream
Definition: c11_driver.cpp:26
c11_driver.hpp
nmodl::parser::CDriver::parse_file
bool parse_file(const std::string &filename)
Definition: c11_driver.cpp:36
nmodl::parser::CDriver::streamname
std::string streamname
file or input stream name (used by scanner for position), see todo
Definition: c11_driver.hpp:65
nmodl::parser::CDriver::error
static void error(const std::string &m)
Definition: c11_driver.cpp:52
nmodl::parser::CDriver::trace_scanner
bool trace_scanner
enable debug output in the flex scanner
Definition: c11_driver.hpp:49
nmodl::parser::CDriver::parser
std::unique_ptr< CParser > parser
pointer to the parser instance being used
Definition: c11_driver.hpp:58
nmodl::parser::CDriver::tokens
std::vector< std::string > tokens
all tokens encountered
Definition: c11_driver.hpp:46
nmodl::parser::CDriver::trace_parser
bool trace_parser
enable debug output in the bison parser
Definition: c11_driver.hpp:52
nmodl::parser::CDriver::~CDriver
~CDriver()
nmodl::parser::CDriver::lexer
std::unique_ptr< CLexer > lexer
pointer to the lexer instance being used
Definition: c11_driver.hpp:55
c11_lexer.hpp
nmodl::token_type
TokenType token_type(const std::string &name)
Return token type for given token name.
Definition: token_mapping.cpp:284
nmodl::parser::CDriver::scan_string
void scan_string(const std::string &text)
Definition: c11_driver.cpp:65
nmodl::parser::CDriver::add_token
void add_token(const std::string &)
Definition: c11_driver.cpp:56