cprover
cpp_token_buffer.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: C++ Parser: Token Buffer
4 
5 Author: Daniel Kroening, kroening@cs.cmu.edu
6 
7 \*******************************************************************/
8 
11 
12 #include "cpp_token_buffer.h"
13 
14 #include <cassert>
15 
16 #include <ansi-c/ansi_c_y.tab.h>
17 #include <ansi-c/ansi_c_parser.h>
18 
19 int cpp_token_buffert::LookAhead(unsigned offset)
20 {
21  assert(current_pos<=token_vector.size());
22 
23  offset+=current_pos;
24 
25  while(offset>=token_vector.size())
26  read_token();
27 
28  return token_vector[offset]->kind;
29 }
30 
32 {
33  assert(current_pos<=token_vector.size());
34 
35  if(token_vector.size()==current_pos)
36  read_token();
37 
38  token=*token_vector[current_pos];
39 
40  current_pos++;
41 
42  return token.kind;
43 }
44 
46 {
47  assert(current_pos<=token_vector.size());
48 
49  if(token_vector.size()==current_pos)
50  read_token();
51 
52  int kind=token_vector[current_pos]->kind;
53 
54  current_pos++;
55 
56  return kind;
57 }
58 
59 int cpp_token_buffert::LookAhead(unsigned offset, cpp_tokent &token)
60 {
61  assert(current_pos<=token_vector.size());
62 
63  offset+=current_pos;
64 
65  while(offset>=token_vector.size())
66  read_token();
67 
68  token=*token_vector[offset];
69 
70  return token.kind;
71 }
72 
74 extern char *yyansi_ctext;
75 
77 {
78  tokens.push_back(cpp_tokent());
79  token_vector.push_back(--tokens.end());
80 
81  int kind;
82 
83  ansi_c_parser.stack.clear();
84  kind=yyansi_clex();
85  tokens.back().text=yyansi_ctext;
86  if(ansi_c_parser.stack.size()==1)
87  {
88  tokens.back().data=ansi_c_parser.stack.front();
89  tokens.back().line_no=ansi_c_parser.get_line_no();
90  tokens.back().filename=ansi_c_parser.get_file();
91  }
92 
93  // std::cout << "TOKEN: " << kind << " " << tokens.back().text << '\n';
94 
95  tokens.back().kind=kind;
96 
97  // std::cout << "II: " << token_vector.back()->kind << '\n';
98  // std::cout << "I2: " << token_vector.size() << '\n';
99 }
100 
102 {
103  return current_pos;
104 }
105 
107 {
109 }
110 
112 {
113  assert(current_pos<=token_vector.size());
114 
115  if(token_vector.size()==current_pos)
116  read_token();
117 
118  *token_vector[current_pos]=token;
119 }
120 
122 {
123  assert(current_pos<=token_vector.size());
124 
125  tokens.push_back(token);
126 
127  token_vector.insert(token_vector.begin()+current_pos,
128  --tokens.end());
129 }
ansi_c_parser
ansi_c_parsert ansi_c_parser
Definition: ansi_c_parser.cpp:13
cpp_tokent::kind
int kind
Definition: cpp_token.h:22
cpp_token_buffert::LookAhead
int LookAhead(unsigned offset)
Definition: cpp_token_buffer.cpp:19
pos
literalt pos(literalt a)
Definition: literal.h:194
cpp_token_buffert::tokens
tokenst tokens
Definition: cpp_token_buffer.h:56
yyansi_ctext
char * yyansi_ctext
cpp_token_buffert::Replace
void Replace(const cpp_tokent &token)
Definition: cpp_token_buffer.cpp:111
cpp_tokent
Definition: cpp_token.h:20
cpp_token_buffert::Insert
void Insert(const cpp_tokent &token)
Definition: cpp_token_buffer.cpp:121
cpp_token_buffert::current_pos
post current_pos
Definition: cpp_token_buffer.h:60
cpp_token_buffer.h
C++ Parser: Token Buffer.
parsert::get_file
irep_idt get_file() const
Definition: parser.h:92
yyansi_clex
int yyansi_clex()
parsert::stack
std::vector< exprt > stack
Definition: parser.h:30
cpp_token_buffert::Save
post Save()
Definition: cpp_token_buffer.cpp:101
cpp_token_buffert::post
unsigned int post
Definition: cpp_token_buffer.h:28
cpp_token_buffert::Restore
void Restore(post pos)
Definition: cpp_token_buffer.cpp:106
ansi_c_parser.h
cpp_token_buffert::get_token
int get_token()
Definition: cpp_token_buffer.cpp:45
parsert::get_line_no
unsigned get_line_no() const
Definition: parser.h:97
cpp_token_buffert::token_vector
std::vector< tokenst::iterator > token_vector
Definition: cpp_token_buffer.h:58
cpp_token_buffert::read_token
void read_token()
Definition: cpp_token_buffer.cpp:76