Commit 69f9ca1e authored by Francis Dupont's avatar Francis Dupont

[master] Finishing merge of trac5106 (flex 2.6.2 compat)

parents 44908c5f 2e4c196d
...@@ -15,10 +15,12 @@ ...@@ -15,10 +15,12 @@
#include <exceptions/exceptions.h> #include <exceptions/exceptions.h>
#include <cc/dhcp_config_error.h> #include <cc/dhcp_config_error.h>
// Work around an incompatibility in flex (at least versions /* Please avoid C++ style comments (// ... eol) as they break flex 2.6.2 */
// 2.5.31 through 2.5.33): it generates code that does
// not conform to C89. See Debian bug 333231 /* Work around an incompatibility in flex (at least versions
// <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>. 2.5.31 through 2.5.33): it generates code that does
not conform to C89. See Debian bug 333231
<http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>. */
# undef yywrap # undef yywrap
# define yywrap() 1 # define yywrap() 1
...@@ -34,7 +36,7 @@ using isc::agent::AgentParser; ...@@ -34,7 +36,7 @@ using isc::agent::AgentParser;
}; };
// To avoid the call to exit... oops! /* To avoid the call to exit... oops! */
#define YY_FATAL_ERROR(msg) isc::agent::ParserContext::fatal(msg) #define YY_FATAL_ERROR(msg) isc::agent::ParserContext::fatal(msg)
%} %}
...@@ -87,28 +89,28 @@ ControlCharacter [\x00-\x1f] ...@@ -87,28 +89,28 @@ ControlCharacter [\x00-\x1f]
ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
%{ %{
// This code run each time a pattern is matched. It updates the location /* This code run each time a pattern is matched. It updates the location
// by moving it ahead by yyleng bytes. yyleng specifies the length of the by moving it ahead by yyleng bytes. yyleng specifies the length of the
// currently matched token. currently matched token. */
#define YY_USER_ACTION driver.loc_.columns(yyleng); #define YY_USER_ACTION driver.loc_.columns(yyleng);
%} %}
%% %%
%{ %{
// This part of the code is copied over to the verbatim to the top /* This part of the code is copied over to the verbatim to the top
// of the generated yylex function. Explanation: of the generated yylex function. Explanation:
// http://www.gnu.org/software/bison/manual/html_node/Multiple-start_002dsymbols.html http://www.gnu.org/software/bison/manual/html_node/Multiple-start_002dsymbols.html */
// Code run each time yylex is called. /* Code run each time yylex is called. */
driver.loc_.step(); driver.loc_.step();
// We currently have 3 points of entries defined: /* We currently have 3 points of entries defined:
// START_JSON - which expects any valid JSON START_JSON - which expects any valid JSON
// START_AGENT - which expects full configuration (with outer map and Control-agent START_AGENT - which expects full configuration (with outer map and Control-agent
// object in it. object in it.
// START_SUB_AGENT - which expects only content of the Control-agent, this is START_SUB_AGENT - which expects only content of the Control-agent, this is
// primarily useful for testing. primarily useful for testing. */
if (start_token_flag) { if (start_token_flag) {
start_token_flag = false; start_token_flag = false;
switch (start_token_value) { switch (start_token_value) {
...@@ -141,9 +143,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -141,9 +143,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
"<?" BEGIN(DIR_ENTER); "<?" BEGIN(DIR_ENTER);
<DIR_ENTER>"include" BEGIN(DIR_INCLUDE); <DIR_ENTER>"include" BEGIN(DIR_INCLUDE);
<DIR_INCLUDE>\"([^\"\n])+\" { <DIR_INCLUDE>\"([^\"\n])+\" {
// Include directive. /* Include directive. */
// Extract the filename. /* Extract the filename. */
std::string tmp(yytext+1); std::string tmp(yytext+1);
tmp.resize(tmp.size() - 1); tmp.resize(tmp.size() - 1);
...@@ -156,12 +158,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -156,12 +158,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
<*>{blank}+ { <*>{blank}+ {
// Ok, we found a with space. Let's ignore it and update loc variable. /* Ok, we found a with space. Let's ignore it and update loc variable. */
driver.loc_.step(); driver.loc_.step();
} }
<*>[\n]+ { <*>[\n]+ {
// Newline found. Let's update the location and continue. /* Newline found. Let's update the location and continue. */
driver.loc_.lines(yyleng); driver.loc_.lines(yyleng);
driver.loc_.step(); driver.loc_.step();
} }
...@@ -402,9 +404,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -402,9 +404,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} }
{JSONString} { {JSONString} {
// A string has been matched. It contains the actual string and single quotes. /* A string has been matched. It contains the actual string and single quotes.
// We need to get those quotes out of the way and just use its content, e.g. We need to get those quotes out of the way and just use its content, e.g.
// for 'foo' we should get foo for 'foo' we should get foo */
std::string raw(yytext+1); std::string raw(yytext+1);
size_t len = raw.size() - 1; size_t len = raw.size() - 1;
raw.resize(len); raw.resize(len);
...@@ -415,12 +417,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -415,12 +417,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
char c = raw[pos]; char c = raw[pos];
switch (c) { switch (c) {
case '"': case '"':
// impossible condition /* impossible condition */
driver.error(driver.loc_, "Bad quote in \"" + raw + "\""); driver.error(driver.loc_, "Bad quote in \"" + raw + "\"");
case '\\': case '\\':
++pos; ++pos;
if (pos >= len) { if (pos >= len) {
// impossible condition /* impossible condition */
driver.error(driver.loc_, "Overflow escape in \"" + raw + "\""); driver.error(driver.loc_, "Overflow escape in \"" + raw + "\"");
} }
c = raw[pos]; c = raw[pos];
...@@ -446,10 +448,10 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -446,10 +448,10 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
decoded.push_back('\t'); decoded.push_back('\t');
break; break;
case 'u': case 'u':
// support only \u0000 to \u00ff /* support only \u0000 to \u00ff */
++pos; ++pos;
if (pos + 4 > len) { if (pos + 4 > len) {
// impossible condition /* impossible condition */
driver.error(driver.loc_, driver.error(driver.loc_,
"Overflow unicode escape in \"" + raw + "\""); "Overflow unicode escape in \"" + raw + "\"");
} }
...@@ -465,7 +467,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -465,7 +467,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} else if ((c >= 'a') && (c <= 'f')) { } else if ((c >= 'a') && (c <= 'f')) {
b = (c - 'a' + 10) << 4; b = (c - 'a' + 10) << 4;
} else { } else {
// impossible condition /* impossible condition */
driver.error(driver.loc_, "Not hexadecimal in unicode escape in \"" + raw + "\""); driver.error(driver.loc_, "Not hexadecimal in unicode escape in \"" + raw + "\"");
} }
pos++; pos++;
...@@ -477,19 +479,19 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -477,19 +479,19 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} else if ((c >= 'a') && (c <= 'f')) { } else if ((c >= 'a') && (c <= 'f')) {
b |= c - 'a' + 10; b |= c - 'a' + 10;
} else { } else {
// impossible condition /* impossible condition */
driver.error(driver.loc_, "Not hexadecimal in unicode escape in \"" + raw + "\""); driver.error(driver.loc_, "Not hexadecimal in unicode escape in \"" + raw + "\"");
} }
decoded.push_back(static_cast<char>(b & 0xff)); decoded.push_back(static_cast<char>(b & 0xff));
break; break;
default: default:
// impossible condition /* impossible condition */
driver.error(driver.loc_, "Bad escape in \"" + raw + "\""); driver.error(driver.loc_, "Bad escape in \"" + raw + "\"");
} }
break; break;
default: default:
if ((c >= 0) && (c < 0x20)) { if ((c >= 0) && (c < 0x20)) {
// impossible condition /* impossible condition */
driver.error(driver.loc_, "Invalid control in \"" + raw + "\""); driver.error(driver.loc_, "Invalid control in \"" + raw + "\"");
} }
decoded.push_back(c); decoded.push_back(c);
...@@ -500,17 +502,17 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -500,17 +502,17 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} }
\"{JSONStringCharacter}*{ControlCharacter}{ControlCharacterFill}*\" { \"{JSONStringCharacter}*{ControlCharacter}{ControlCharacterFill}*\" {
// Bad string with a forbidden control character inside /* Bad string with a forbidden control character inside */
driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); driver.error(driver.loc_, "Invalid control in " + std::string(yytext));
} }
\"{JSONStringCharacter}*\\{BadJSONEscapeSequence}[^\x00-\x1f"]*\" { \"{JSONStringCharacter}*\\{BadJSONEscapeSequence}[^\x00-\x1f"]*\" {
// Bad string with a bad escape inside /* Bad string with a bad escape inside */
driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); driver.error(driver.loc_, "Bad escape in " + std::string(yytext));
} }
\"{JSONStringCharacter}*\\\" { \"{JSONStringCharacter}*\\\" {
// Bad string with an open escape at the end /* Bad string with an open escape at the end */
driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); driver.error(driver.loc_, "Overflow escape in " + std::string(yytext));
} }
...@@ -522,25 +524,25 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -522,25 +524,25 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
":" { return AgentParser::make_COLON(driver.loc_); } ":" { return AgentParser::make_COLON(driver.loc_); }
{int} { {int} {
// An integer was found. /* An integer was found. */
std::string tmp(yytext); std::string tmp(yytext);
int64_t integer = 0; int64_t integer = 0;
try { try {
// In substring we want to use negative values (e.g. -1). /* In substring we want to use negative values (e.g. -1).
// In enterprise-id we need to use values up to 0xffffffff. In enterprise-id we need to use values up to 0xffffffff.
// To cover both of those use cases, we need at least To cover both of those use cases, we need at least
// int64_t. int64_t. */
integer = boost::lexical_cast<int64_t>(tmp); integer = boost::lexical_cast<int64_t>(tmp);
} catch (const boost::bad_lexical_cast &) { } catch (const boost::bad_lexical_cast &) {
driver.error(driver.loc_, "Failed to convert " + tmp + " to an integer."); driver.error(driver.loc_, "Failed to convert " + tmp + " to an integer.");
} }
// The parser needs the string form as double conversion is no lossless /* The parser needs the string form as double conversion is no lossless */
return AgentParser::make_INTEGER(integer, driver.loc_); return AgentParser::make_INTEGER(integer, driver.loc_);
} }
[-+]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)? { [-+]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)? {
// A floating point was found. /* A floating point was found. */
std::string tmp(yytext); std::string tmp(yytext);
double fp = 0.0; double fp = 0.0;
try { try {
...@@ -610,7 +612,7 @@ ParserContext::scanStringBegin(const std::string& str, ParserType parser_type) ...@@ -610,7 +612,7 @@ ParserContext::scanStringBegin(const std::string& str, ParserType parser_type)
buffer = agent__scan_bytes(str.c_str(), str.size()); buffer = agent__scan_bytes(str.c_str(), str.size());
if (!buffer) { if (!buffer) {
fatal("cannot scan string"); fatal("cannot scan string");
// fatal() throws an exception so this can't be reached /* fatal() throws an exception so this can't be reached */
} }
} }
...@@ -628,7 +630,7 @@ ParserContext::scanFileBegin(FILE * f, ...@@ -628,7 +630,7 @@ ParserContext::scanFileBegin(FILE * f,
yy_flex_debug = trace_scanning_; yy_flex_debug = trace_scanning_;
YY_BUFFER_STATE buffer; YY_BUFFER_STATE buffer;
// See dhcp6_lexer.cc header for available definitions /* See agent_lexer.cc header for available definitions */
buffer = agent__create_buffer(f, 65536 /*buffer size*/); buffer = agent__create_buffer(f, 65536 /*buffer size*/);
if (!buffer) { if (!buffer) {
fatal("cannot scan file " + filename); fatal("cannot scan file " + filename);
...@@ -642,7 +644,7 @@ ParserContext::scanEnd() { ...@@ -642,7 +644,7 @@ ParserContext::scanEnd() {
fclose(sfile_); fclose(sfile_);
sfile_ = 0; sfile_ = 0;
static_cast<void>(agent_lex_destroy()); static_cast<void>(agent_lex_destroy());
// Close files /* Close files */
while (!sfiles_.empty()) { while (!sfiles_.empty()) {
FILE* f = sfiles_.back(); FILE* f = sfiles_.back();
if (f) { if (f) {
...@@ -650,7 +652,7 @@ ParserContext::scanEnd() { ...@@ -650,7 +652,7 @@ ParserContext::scanEnd() {
} }
sfiles_.pop_back(); sfiles_.pop_back();
} }
// Delete states /* Delete states */
while (!states_.empty()) { while (!states_.empty()) {
agent__delete_buffer(states_.back()); agent__delete_buffer(states_.back());
states_.pop_back(); states_.pop_back();
...@@ -687,9 +689,9 @@ ParserContext::includeFile(const std::string& filename) { ...@@ -687,9 +689,9 @@ ParserContext::includeFile(const std::string& filename) {
} }
namespace { namespace {
/// To avoid unused function error /** To avoid unused function error */
class Dummy { class Dummy {
// cppcheck-suppress unusedPrivateFunction /* cppcheck-suppress unusedPrivateFunction */
void dummy() { yy_fatal_error("Fix me: how to disable its definition?"); } void dummy() { yy_fatal_error("Fix me: how to disable its definition?"); }
}; };
} }
...@@ -14,10 +14,12 @@ ...@@ -14,10 +14,12 @@
#include <boost/lexical_cast.hpp> #include <boost/lexical_cast.hpp>
#include <exceptions/exceptions.h> #include <exceptions/exceptions.h>
// Work around an incompatibility in flex (at least versions /* Please avoid C++ style comments (// ... eol) as they break flex 2.6.2 */
// 2.5.31 through 2.5.33): it generates code that does
// not conform to C89. See Debian bug 333231 /* Work around an incompatibility in flex (at least versions
// <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>. 2.5.31 through 2.5.33): it generates code that does
not conform to C89. See Debian bug 333231
<http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>. */
# undef yywrap # undef yywrap
# define yywrap() 1 # define yywrap() 1
...@@ -30,7 +32,7 @@ unsigned int comment_start_line = 0; ...@@ -30,7 +32,7 @@ unsigned int comment_start_line = 0;
}; };
// To avoid the call to exit... oops! /* To avoid the call to exit... oops! */
#define YY_FATAL_ERROR(msg) isc::d2::D2ParserContext::fatal(msg) #define YY_FATAL_ERROR(msg) isc::d2::D2ParserContext::fatal(msg)
%} %}
...@@ -83,20 +85,20 @@ ControlCharacter [\x00-\x1f] ...@@ -83,20 +85,20 @@ ControlCharacter [\x00-\x1f]
ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
%{ %{
// This code run each time a pattern is matched. It updates the location /* This code run each time a pattern is matched. It updates the location
// by moving it ahead by yyleng bytes. yyleng specifies the length of the by moving it ahead by yyleng bytes. yyleng specifies the length of the
// currently matched token. currently matched token. */
#define YY_USER_ACTION driver.loc_.columns(yyleng); #define YY_USER_ACTION driver.loc_.columns(yyleng);
%} %}
%% %%
%{ %{
// This part of the code is copied over to the verbatim to the top /* This part of the code is copied over to the verbatim to the top
// of the generated yylex function. Explanation: of the generated yylex function. Explanation:
// http://www.gnu.org/software/bison/manual/html_node/Multiple-start_002dsymbols.html http://www.gnu.org/software/bison/manual/html_node/Multiple-start_002dsymbols.html */
// Code run each time yylex is called. /* Code run each time yylex is called. */
driver.loc_.step(); driver.loc_.step();
if (start_token_flag) { if (start_token_flag) {
...@@ -141,9 +143,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -141,9 +143,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
"<?" BEGIN(DIR_ENTER); "<?" BEGIN(DIR_ENTER);
<DIR_ENTER>"include" BEGIN(DIR_INCLUDE); <DIR_ENTER>"include" BEGIN(DIR_INCLUDE);
<DIR_INCLUDE>\"([^\"\n])+\" { <DIR_INCLUDE>\"([^\"\n])+\" {
// Include directive. /* Include directive. */
// Extract the filename. /* Extract the filename. */
std::string tmp(yytext+1); std::string tmp(yytext+1);
tmp.resize(tmp.size() - 1); tmp.resize(tmp.size() - 1);
...@@ -156,12 +158,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -156,12 +158,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
<*>{blank}+ { <*>{blank}+ {
// Ok, we found a with space. Let's ignore it and update loc variable. /* Ok, we found a with space. Let's ignore it and update loc variable. */
driver.loc_.step(); driver.loc_.step();
} }
<*>[\n]+ { <*>[\n]+ {
// Newline found. Let's update the location and continue. /* Newline found. Let's update the location and continue. */
driver.loc_.lines(yyleng); driver.loc_.lines(yyleng);
driver.loc_.step(); driver.loc_.step();
} }
...@@ -467,9 +469,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -467,9 +469,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
{JSONString} { {JSONString} {
// A string has been matched. It contains the actual string and single quotes. /* A string has been matched. It contains the actual string and single quotes.
// We need to get those quotes out of the way and just use its content, e.g. We need to get those quotes out of the way and just use its content, e.g.
// for 'foo' we should get foo for 'foo' we should get foo */
std::string raw(yytext+1); std::string raw(yytext+1);
size_t len = raw.size() - 1; size_t len = raw.size() - 1;
raw.resize(len); raw.resize(len);
...@@ -480,12 +482,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -480,12 +482,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
char c = raw[pos]; char c = raw[pos];
switch (c) { switch (c) {
case '"': case '"':
// impossible condition /* impossible condition */
driver.error(driver.loc_, "Bad quote in \"" + raw + "\""); driver.error(driver.loc_, "Bad quote in \"" + raw + "\"");
case '\\': case '\\':
++pos; ++pos;
if (pos >= len) { if (pos >= len) {
// impossible condition /* impossible condition */
driver.error(driver.loc_, "Overflow escape in \"" + raw + "\""); driver.error(driver.loc_, "Overflow escape in \"" + raw + "\"");
} }
c = raw[pos]; c = raw[pos];
...@@ -511,10 +513,10 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -511,10 +513,10 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
decoded.push_back('\t'); decoded.push_back('\t');
break; break;
case 'u': case 'u':
// support only \u0000 to \u00ff /* support only \u0000 to \u00ff */
++pos; ++pos;
if (pos + 4 > len) { if (pos + 4 > len) {
// impossible condition /* impossible condition */
driver.error(driver.loc_, driver.error(driver.loc_,
"Overflow unicode escape in \"" + raw + "\""); "Overflow unicode escape in \"" + raw + "\"");
} }
...@@ -530,7 +532,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -530,7 +532,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} else if ((c >= 'a') && (c <= 'f')) { } else if ((c >= 'a') && (c <= 'f')) {
b = (c - 'a' + 10) << 4; b = (c - 'a' + 10) << 4;
} else { } else {
// impossible condition /* impossible condition */
driver.error(driver.loc_, "Not hexadecimal in unicode escape in \"" + raw + "\""); driver.error(driver.loc_, "Not hexadecimal in unicode escape in \"" + raw + "\"");
} }
pos++; pos++;
...@@ -542,19 +544,19 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -542,19 +544,19 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} else if ((c >= 'a') && (c <= 'f')) { } else if ((c >= 'a') && (c <= 'f')) {
b |= c - 'a' + 10; b |= c - 'a' + 10;
} else { } else {
// impossible condition /* impossible condition */
driver.error(driver.loc_, "Not hexadecimal in unicode escape in \"" + raw + "\""); driver.error(driver.loc_, "Not hexadecimal in unicode escape in \"" + raw + "\"");
} }
decoded.push_back(static_cast<char>(b & 0xff)); decoded.push_back(static_cast<char>(b & 0xff));
break; break;
default: default:
// impossible condition /* impossible condition */
driver.error(driver.loc_, "Bad escape in \"" + raw + "\""); driver.error(driver.loc_, "Bad escape in \"" + raw + "\"");
} }
break; break;
default: default:
if ((c >= 0) && (c < 0x20)) { if ((c >= 0) && (c < 0x20)) {
// impossible condition /* impossible condition */
driver.error(driver.loc_, "Invalid control in \"" + raw + "\""); driver.error(driver.loc_, "Invalid control in \"" + raw + "\"");
} }
decoded.push_back(c); decoded.push_back(c);
...@@ -565,17 +567,17 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -565,17 +567,17 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} }
\"{JSONStringCharacter}*{ControlCharacter}{ControlCharacterFill}*\" { \"{JSONStringCharacter}*{ControlCharacter}{ControlCharacterFill}*\" {
// Bad string with a forbidden control character inside /* Bad string with a forbidden control character inside */
driver.error(driver.loc_, "Invalid control in " + std::string(yytext)); driver.error(driver.loc_, "Invalid control in " + std::string(yytext));
} }
\"{JSONStringCharacter}*\\{BadJSONEscapeSequence}[^\x00-\x1f"]*\" { \"{JSONStringCharacter}*\\{BadJSONEscapeSequence}[^\x00-\x1f"]*\" {
// Bad string with a bad escape inside /* Bad string with a bad escape inside */
driver.error(driver.loc_, "Bad escape in " + std::string(yytext)); driver.error(driver.loc_, "Bad escape in " + std::string(yytext));
} }
\"{JSONStringCharacter}*\\\" { \"{JSONStringCharacter}*\\\" {
// Bad string with an open escape at the end /* Bad string with an open escape at the end */
driver.error(driver.loc_, "Overflow escape in " + std::string(yytext)); driver.error(driver.loc_, "Overflow escape in " + std::string(yytext));
} }
...@@ -587,25 +589,25 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} ...@@ -587,25 +589,25 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
":" { return isc::d2::D2Parser::make_COLON(driver.loc_); } ":" { return isc::d2::D2Parser::make_COLON(driver.loc_); }
{int} { {int} {