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
31
int
cpp_token_buffert::get_token
(
cpp_tokent
&token)
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
45
int
cpp_token_buffert::get_token
()
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
73
int
yyansi_clex
();
74
extern
char
*
yyansi_ctext
;
75
76
void
cpp_token_buffert::read_token
()
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
101
cpp_token_buffert::post
cpp_token_buffert::Save
()
102
{
103
return
current_pos
;
104
}
105
106
void
cpp_token_buffert::Restore
(
post
pos
)
107
{
108
current_pos
=
pos
;
109
}
110
111
void
cpp_token_buffert::Replace
(
const
cpp_tokent
&token)
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
121
void
cpp_token_buffert::Insert
(
const
cpp_tokent
&token)
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:193
cpp_token_buffert::tokens
tokenst tokens
Definition:
cpp_token_buffer.h:56
yyansi_ctext
char * yyansi_ctext
Definition:
ansi_c_lex.yy.cpp:4214
cpp_token_buffert::Replace
void Replace(const cpp_tokent &token)
Definition:
cpp_token_buffer.cpp:111
cpp_tokent
Definition:
cpp_token.h:19
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
parsert::get_file
irep_idt get_file() const
Definition:
parser.h:92
yyansi_clex
int yyansi_clex()
The main scanner function which does all the work.
Definition:
ansi_c_lex.yy.cpp:4611
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_y.tab.h
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
cpp
cpp_token_buffer.cpp
Generated by
1.8.16