cprover
ansi_c_parser.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module:
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
9 
10 #ifndef CPROVER_ANSI_C_ANSI_C_PARSER_H
11 #define CPROVER_ANSI_C_ANSI_C_PARSER_H
12 
13 #include <cassert>
14 
15 #include <util/parser.h>
16 #include <util/expr.h>
17 #include <util/string_hash.h>
18 #include <util/mp_arith.h>
19 #include <util/config.h>
20 
21 #include "ansi_c_parse_tree.h"
22 #include "ansi_c_scope.h"
23 
24 int yyansi_cparse();
25 
26 class ansi_c_parsert:public parsert
27 {
28 public:
30 
32  tag_following(false),
33  asm_block_following(false),
35  mode(modet::NONE),
36  cpp98(false),
37  cpp11(false),
38  for_has_scope(false),
40  Float128_type(false)
41  {
42  }
43 
44  virtual bool parse() override
45  {
46  return yyansi_cparse()!=0;
47  }
48 
49  virtual void clear() override
50  {
52  parse_tree.clear();
53 
54  // scanner state
55  tag_following=false;
56  asm_block_following=false;
58  string_literal.clear();
59  pragma_pack.clear();
60 
61  // set up global scope
62  scopes.clear();
63  scopes.push_back(scopet());
64  }
65 
66  // internal state of the scanner
70  std::string string_literal;
71  std::list<exprt> pragma_pack;
72 
75 
76  // recognize C++98 and C++11 keywords
77  bool cpp98, cpp11;
78 
79  // in C99 and upwards, for(;;) has a scope
81 
82  // ISO/IEC TS 18661-3:2015
84 
85  // Does the compiler version emulated provide _Float128?
87 
90 
91  typedef std::list<scopet> scopest;
93 
95  {
96  return scopes.front();
97  }
98 
99  const scopet &root_scope() const
100  {
101  return scopes.front();
102  }
103 
104  void pop_scope()
105  {
106  scopes.pop_back();
107  }
108 
110  {
111  assert(!scopes.empty());
112  return scopes.back();
113  }
114 
115  enum class decl_typet { TAG, MEMBER, PARAMETER, OTHER };
116 
117  // convert a declarator and then add it to existing an declaration
118  void add_declarator(exprt &declaration, irept &declarator);
119 
120  // adds a tag to the current scope
121  void add_tag_with_body(irept &tag);
122 
123  void copy_item(const ansi_c_declarationt &declaration)
124  {
125  assert(declaration.id()==ID_declaration);
126  parse_tree.items.push_back(declaration);
127  }
128 
129  void new_scope(const std::string &prefix)
130  {
131  const scopet &current=current_scope();
132  scopes.push_back(scopet());
133  scopes.back().prefix=current.prefix+prefix;
134  }
135 
137  const irep_idt &base_name, // in
138  irep_idt &identifier, // out
139  bool tag,
140  bool label);
141 
142  static ansi_c_id_classt get_class(const typet &type);
143 
144  irep_idt lookup_label(const irep_idt base_name)
145  {
146  irep_idt identifier;
147  lookup(base_name, identifier, false, true);
148  return identifier;
149  }
150 };
151 
153 
154 int yyansi_cerror(const std::string &error);
155 void ansi_c_scanner_init();
156 
157 #endif // CPROVER_ANSI_C_ANSI_C_PARSER_H
The type of an expression.
Definition: type.h:22
static ansi_c_id_classt get_class(const typet &type)
ansi_c_parse_treet parse_tree
Definition: ansi_c_parser.h:29
scopet & current_scope()
std::string string_literal
Definition: ansi_c_parser.h:70
void add_tag_with_body(irept &tag)
Definition: parser.h:23
ansi_c_identifiert identifiert
Definition: ansi_c_parser.h:88
Parser utilities.
const scopet & root_scope() const
Definition: ansi_c_parser.h:99
const irep_idt & id() const
Definition: irep.h:189
ansi_c_id_classt
Definition: ansi_c_scope.h:17
int yyansi_cparse()
virtual bool parse() override
Definition: ansi_c_parser.h:44
void add_declarator(exprt &declaration, irept &declarator)
Base class for tree-like data structures with sharing.
Definition: irep.h:86
scopet & root_scope()
Definition: ansi_c_parser.h:94
void copy_item(const ansi_c_declarationt &declaration)
ansi_c_scopet scopet
Definition: ansi_c_parser.h:89
void new_scope(const std::string &prefix)
virtual void clear()
Definition: parser.h:32
Base class for all expressions.
Definition: expr.h:42
std::list< exprt > pragma_pack
Definition: ansi_c_parser.h:71
unsigned parenthesis_counter
Definition: ansi_c_parser.h:69
configt::ansi_ct::flavourt modet
Definition: ansi_c_parser.h:73
string hashing
bool ts_18661_3_Floatn_types
Definition: ansi_c_parser.h:83
irep_idt lookup_label(const irep_idt base_name)
std::string prefix
Definition: ansi_c_scope.h:47
std::list< scopet > scopest
Definition: ansi_c_parser.h:91
bool asm_block_following
Definition: ansi_c_parser.h:68
ansi_c_parsert ansi_c_parser
virtual void clear() override
Definition: ansi_c_parser.h:49
void ansi_c_scanner_init()
int yyansi_cerror(const std::string &error)
ansi_c_id_classt lookup(const irep_idt &base_name, irep_idt &identifier, bool tag, bool label)