forked from diffblue/cbmc
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcpp_token_buffer.cpp
124 lines (85 loc) · 2.47 KB
/
cpp_token_buffer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*******************************************************************\
Module: C++ Parser: Token Buffer
Author: Daniel Kroening, [email protected]
\*******************************************************************/
/// \file
/// C++ Parser: Token Buffer
#include "cpp_token_buffer.h"
int cpp_token_buffert::LookAhead(unsigned offset)
{
PRECONDITION(current_pos <= token_vector.size());
offset+=current_pos;
while(offset>=token_vector.size())
read_token();
return token_vector[offset]->kind;
}
int cpp_token_buffert::get_token(cpp_tokent &token)
{
PRECONDITION(current_pos <= token_vector.size());
if(token_vector.size()==current_pos)
read_token();
token=*token_vector[current_pos];
current_pos++;
return token.kind;
}
int cpp_token_buffert::get_token()
{
PRECONDITION(current_pos <= token_vector.size());
if(token_vector.size()==current_pos)
read_token();
int kind=token_vector[current_pos]->kind;
current_pos++;
return kind;
}
int cpp_token_buffert::LookAhead(unsigned offset, cpp_tokent &token)
{
PRECONDITION(current_pos <= token_vector.size());
offset+=current_pos;
while(offset>=token_vector.size())
read_token();
token=*token_vector[offset];
return token.kind;
}
int yyansi_clex();
extern char *yyansi_ctext;
void cpp_token_buffert::read_token()
{
tokens.push_back(cpp_tokent());
token_vector.push_back(--tokens.end());
int kind;
ansi_c_parser.stack.clear();
kind=yyansi_clex();
tokens.back().text=yyansi_ctext;
if(ansi_c_parser.stack.size()==1)
{
tokens.back().data=ansi_c_parser.stack.front();
tokens.back().line_no=ansi_c_parser.get_line_no();
tokens.back().filename=ansi_c_parser.get_file();
}
// std::cout << "TOKEN: " << kind << " " << tokens.back().text << '\n';
tokens.back().kind=kind;
// std::cout << "II: " << token_vector.back()->kind << '\n';
// std::cout << "I2: " << token_vector.size() << '\n';
}
cpp_token_buffert::post cpp_token_buffert::Save()
{
return current_pos;
}
void cpp_token_buffert::Restore(post pos)
{
current_pos=pos;
}
void cpp_token_buffert::Replace(const cpp_tokent &token)
{
PRECONDITION(current_pos <= token_vector.size());
if(token_vector.size()==current_pos)
read_token();
*token_vector[current_pos]=token;
}
void cpp_token_buffert::Insert(const cpp_tokent &token)
{
PRECONDITION(current_pos <= token_vector.size());
tokens.push_back(token);
token_vector.insert(token_vector.begin()+current_pos,
--tokens.end());
}