File tree 4 files changed +41
-18
lines changed
4 files changed +41
-18
lines changed Original file line number Diff line number Diff line change 3
3
4
4
#include " xml_parser.h"
5
5
6
- int yyxmllex ();
6
+ int yyxmllex (xml_parsert &xml_parser );
7
7
extern char *yyxmltext;
8
8
9
- int yyxmlerror (const std::string &error)
9
+ int yyxmlerror (xml_parsert &xml_parser, const std::string &error)
10
10
{
11
11
xml_parser.parse_error (error, yyxmltext);
12
12
return 0 ;
@@ -26,6 +26,9 @@ int yyxmlerror(const std::string &error)
26
26
#endif
27
27
%}
28
28
29
+ %parse-param {xml_parsert &xml_parser}
30
+ %lex-param {xml_parsert &xml_parser}
31
+
29
32
%union {char *s;}
30
33
31
34
%token STARTXMLDECL
Original file line number Diff line number Diff line change 19
19
#include " xml_parser.h"
20
20
#include " xml_y.tab.h"
21
21
22
- #define PARSER xml_parser
22
+ #define PARSER (* xml_parser)
23
23
24
24
// static int keep; /* To store start condition */
25
25
@@ -65,6 +65,22 @@ string \"([^"&]|{esc})*\"|\'([^'&]|{esc})*\'
65
65
%s PI
66
66
%s DTD
67
67
68
+ %{
69
+ static xml_parsert *xml_parser;
70
+
71
+ int yyxmllex (void );
72
+
73
+ int yyxmllex (xml_parsert &_xml_parser)
74
+ {
75
+ // our scanner is not reentrant
76
+ PRECONDITION (!xml_parser);
77
+ xml_parser = &_xml_parser;
78
+ int result = yyxmllex ();
79
+ xml_parser = nullptr ;
80
+ return result;
81
+ }
82
+ %}
83
+
68
84
%%
69
85
70
86
<INITIAL ,PI >{ws } {/* skip */ }
@@ -87,7 +103,7 @@ string \"([^"&]|{esc})*\"|\'([^'&]|{esc})*\'
87
103
<DTD >. {/* skip */ }
88
104
<DTD >\] {close } {BEGIN (INITIAL); /* skip */ }
89
105
90
- . { yyxmlerror (" unexpected character" ); }
106
+ . { yyxmlerror (*xml_parser, " unexpected character" ); }
91
107
{nl } {/* skip, must be an extra one at EOF */ ;}
92
108
93
109
%%
Original file line number Diff line number Diff line change @@ -10,7 +10,12 @@ Author: Daniel Kroening, kroening@kroening.com
10
10
11
11
#include < fstream>
12
12
13
- xml_parsert xml_parser;
13
+ int yyxmlparse (xml_parsert &);
14
+
15
+ bool xml_parsert::parse ()
16
+ {
17
+ return yyxmlparse (*this ) != 0 ;
18
+ }
14
19
15
20
// 'do it all' function
16
21
bool parse_xml (
@@ -19,12 +24,12 @@ bool parse_xml(
19
24
message_handlert &message_handler,
20
25
xmlt &dest)
21
26
{
22
- xml_parser.clear ();
27
+ xml_parsert xml_parser{message_handler};
28
+
23
29
xml_parser.set_file (filename);
24
30
xml_parser.in =∈
25
- xml_parser.log .set_message_handler (message_handler);
26
31
27
- bool result= yyxmlparse ()!= 0 ;
32
+ bool result = xml_parser. parse () ;
28
33
29
34
// save result
30
35
xml_parser.parse_tree .element .swap (dest);
Original file line number Diff line number Diff line change @@ -14,11 +14,15 @@ Author: Daniel Kroening, kroening@kroening.com
14
14
15
15
#include " xml_parse_tree.h"
16
16
17
- int yyxmlparse ();
18
-
19
17
class xml_parsert :public parsert
20
18
{
21
19
public:
20
+ explicit xml_parsert (message_handlert &message_handler)
21
+ : parsert(message_handler)
22
+ {
23
+ stack.push_back (&parse_tree.element );
24
+ }
25
+
22
26
xml_parse_treet parse_tree;
23
27
24
28
std::list<xmlt *> stack;
@@ -28,18 +32,15 @@ class xml_parsert:public parsert
28
32
return *stack.back ();
29
33
}
30
34
31
- virtual bool parse ()
32
- {
33
- return yyxmlparse ()!=0 ;
34
- }
35
+ bool parse () override ;
35
36
36
37
void new_level ()
37
38
{
38
39
current ().elements .push_back (xmlt ());
39
40
stack.push_back (¤t ().elements .back ());
40
41
}
41
42
42
- virtual void clear ()
43
+ void clear () override
43
44
{
44
45
parse_tree.clear ();
45
46
// set up stack
@@ -48,9 +49,7 @@ class xml_parsert:public parsert
48
49
}
49
50
};
50
51
51
- extern xml_parsert xml_parser;
52
-
53
- int yyxmlerror (const std::string &error);
52
+ int yyxmlerror (xml_parsert &xml_parser, const std::string &error);
54
53
55
54
// 'do it all' functions
56
55
bool parse_xml (
You can’t perform that action at this time.
0 commit comments