Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit dedf01d

Browse files
committedDec 20, 2023
xml_parsert: construct with message handler
This both avoids an object of static lifetime as well as it fixes the (transitive) use of the deprecated messaget() constructor.
1 parent 856c641 commit dedf01d

File tree

4 files changed

+41
-18
lines changed

4 files changed

+41
-18
lines changed
 

‎src/xmllang/parser.y

+5-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33

44
#include "xml_parser.h"
55

6-
int yyxmllex();
6+
int yyxmllex(xml_parsert &xml_parser);
77
extern char *yyxmltext;
88

9-
int yyxmlerror(const std::string &error)
9+
int yyxmlerror(xml_parsert &xml_parser, const std::string &error)
1010
{
1111
xml_parser.parse_error(error, yyxmltext);
1212
return 0;
@@ -26,6 +26,9 @@ int yyxmlerror(const std::string &error)
2626
#endif
2727
%}
2828

29+
%parse-param {xml_parsert &xml_parser}
30+
%lex-param {xml_parsert &xml_parser}
31+
2932
%union {char *s;}
3033

3134
%token STARTXMLDECL

‎src/xmllang/scanner.l

+18-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
#include "xml_parser.h"
2020
#include "xml_y.tab.h"
2121

22-
#define PARSER xml_parser
22+
#define PARSER (*xml_parser)
2323

2424
//static int keep; /* To store start condition */
2525

@@ -65,6 +65,22 @@ string \"([^"&]|{esc})*\"|\'([^'&]|{esc})*\'
6565
%s PI
6666
%s DTD
6767

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+
6884
%%
6985

7086
<INITIAL,PI>{ws} {/* skip */}
@@ -87,7 +103,7 @@ string \"([^"&]|{esc})*\"|\'([^'&]|{esc})*\'
87103
<DTD>. {/* skip */}
88104
<DTD>\]{close} {BEGIN(INITIAL); /* skip */}
89105

90-
. { yyxmlerror("unexpected character"); }
106+
. { yyxmlerror(*xml_parser, "unexpected character"); }
91107
{nl} {/* skip, must be an extra one at EOF */;}
92108

93109
%%

‎src/xmllang/xml_parser.cpp

+9-4
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@ Author: Daniel Kroening, kroening@kroening.com
1010

1111
#include <fstream>
1212

13-
xml_parsert xml_parser;
13+
int yyxmlparse(xml_parsert &);
14+
15+
bool xml_parsert::parse()
16+
{
17+
return yyxmlparse(*this) != 0;
18+
}
1419

1520
// 'do it all' function
1621
bool parse_xml(
@@ -19,12 +24,12 @@ bool parse_xml(
1924
message_handlert &message_handler,
2025
xmlt &dest)
2126
{
22-
xml_parser.clear();
27+
xml_parsert xml_parser{message_handler};
28+
2329
xml_parser.set_file(filename);
2430
xml_parser.in=&in;
25-
xml_parser.log.set_message_handler(message_handler);
2631

27-
bool result=yyxmlparse()!=0;
32+
bool result = xml_parser.parse();
2833

2934
// save result
3035
xml_parser.parse_tree.element.swap(dest);

‎src/xmllang/xml_parser.h

+9-10
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,15 @@ Author: Daniel Kroening, kroening@kroening.com
1414

1515
#include "xml_parse_tree.h"
1616

17-
int yyxmlparse();
18-
1917
class xml_parsert:public parsert
2018
{
2119
public:
20+
explicit xml_parsert(message_handlert &message_handler)
21+
: parsert(message_handler)
22+
{
23+
stack.push_back(&parse_tree.element);
24+
}
25+
2226
xml_parse_treet parse_tree;
2327

2428
std::list<xmlt *> stack;
@@ -28,18 +32,15 @@ class xml_parsert:public parsert
2832
return *stack.back();
2933
}
3034

31-
virtual bool parse()
32-
{
33-
return yyxmlparse()!=0;
34-
}
35+
bool parse() override;
3536

3637
void new_level()
3738
{
3839
current().elements.push_back(xmlt());
3940
stack.push_back(&current().elements.back());
4041
}
4142

42-
virtual void clear()
43+
void clear() override
4344
{
4445
parse_tree.clear();
4546
// set up stack
@@ -48,9 +49,7 @@ class xml_parsert:public parsert
4849
}
4950
};
5051

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);
5453

5554
// 'do it all' functions
5655
bool parse_xml(

0 commit comments

Comments
 (0)
Please sign in to comment.