Commit 3388cd48 authored by Francis Dupont's avatar Francis Dupont
Browse files

[master] Finishing merge of trac5389 (Fedora / gcc 7)

parents 323865db 594ae378
......@@ -7,12 +7,6 @@ text is also included below.
-----------------------------------------------------------------------------
The ext/coroutine code is externally maintained and distributed under
the Boost Software License, Version 1.0. (See its accompanying file
ext/coroutine/LICENSE_1_0.txt.)
-----------------------------------------------------------------------------
The Cassandra backend code is distributed under the Apache License, Version 2.0.
The text is available at http://www.apache.org/licenses/LICENSE-2.0. Full
text is also included below in this file.
......
......@@ -77,7 +77,6 @@ report-cpp-coverage:
if HAVE_BOTAN
botan/\* \
endif
ext/coroutine/\* \
gtest/\* \
include/\* \
log4cplus/\* \
......@@ -120,9 +119,6 @@ install-exec-hook:
EXTRA_DIST = tools/path_replacer.sh
EXTRA_DIST += tools/mk_cfgrpt.sh
#### include external sources in the distributed tarball:
EXTRA_DIST += ext/coroutine/coroutine.h
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = dns++.pc
......
......@@ -1000,9 +1000,6 @@ fi
#
# ASIO: we extensively use it as the C++ event management module.
#
# Use our 'coroutine' header from ext
CPPFLAGS="$CPPFLAGS -I\$(top_srcdir)/ext/coroutine"
#
# Doesn't seem to be required?
CPPFLAGS="$CPPFLAGS -DBOOST_ASIO_HEADER_ONLY"
#
......@@ -1190,7 +1187,6 @@ AC_CONFIG_FILES([Makefile
doc/guide/Makefile
doc/version.ent
ext/Makefile
ext/coroutine/Makefile
ext/gtest/Makefile
m4macros/Makefile
src/Makefile
......@@ -1213,14 +1209,12 @@ AC_CONFIG_FILES([Makefile
src/bin/d2/tests/d2_process_tests.sh
src/bin/d2/tests/test_data_files_config.h
src/bin/dhcp4/Makefile
src/bin/dhcp4/spec_config.h.pre
src/bin/dhcp4/tests/Makefile
src/bin/dhcp4/tests/dhcp4_process_tests.sh
src/bin/dhcp4/tests/marker_file.h
src/bin/dhcp4/tests/test_data_files_config.h
src/bin/dhcp4/tests/test_libraries.h
src/bin/dhcp6/Makefile
src/bin/dhcp6/spec_config.h.pre
src/bin/dhcp6/tests/Makefile
src/bin/dhcp6/tests/dhcp6_process_tests.sh
src/bin/dhcp6/tests/marker_file.h
......@@ -1300,7 +1294,6 @@ AC_CONFIG_FILES([Makefile
src/lib/log/tests/severity_test.sh
src/lib/log/tests/tempdir.h
src/lib/process/Makefile
src/lib/process/spec_config.h.pre
src/lib/process/tests/Makefile
src/lib/process/testutils/Makefile
src/lib/stats/Makefile
......
......@@ -110,10 +110,7 @@ The following are some details of the JSON backend framework.
(such as the logging initialization code) very easy to share among Kea4, Kea6 and
DHCP-DDNS.<br/><br/>
-# The .spec files used in BIND 10 by the control program to validate commands
have been retained. They will be kept and maintained even though no use of
them is currently planned. At some future time syntax validation may be implemented,
although it is out of scope for Kea 0.9 (and probably
for 1.0 as well, as it is a pretty big task).<br/><br/>
have been removed in 1.4.<br/><br/>
-# A shell script has been added (as src/bin/keactrl/keactrl) to
start, stop and reconfigure the daemons. Its only
job is to pass the configuration file to each daemon and remember its PID file, so
......
SUBDIRS = coroutine
SUBDIRS = .
if HAVE_GTEST_SOURCE
SUBDIRS += gtest
......
Boost Software License - Version 1.0 - August 17th, 2003
Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software, and to permit third-parties to whom the Software is furnished to
do so, all subject to the following:
The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer,
must be included in all copies of the Software, in whole or in part, and
all derivative works of the Software, unless such copies or derivative
works are solely in the form of machine-executable object code generated by
a source language processor.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
EXTRA_DIST = LICENSE_1_0.txt
//
// coroutine.h
// ~~~~~~~~~~~
//
// Copyright (c) 2003-2010 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#ifndef COROUTINE_HPP
#define COROUTINE_HPP
// \brief Coroutine object
//
// A coroutine object maintains the state of a re-enterable routine. It
// is assignable and copy-constructible, and can be used as a base class
// for a class that uses it, or as a data member. The copy overhead is
// a single int.
//
// A reentrant function contains a CORO_REENTER (coroutine) { ... }
// block. Whenever an asynchronous operation is initiated within the
// routine, the function is provided as the handler object. (The simplest
// way to do this is to have the reentrant function be the operator()
// member for the coroutine object itself.) For example:
//
// CORO_YIELD socket->async_read_some(buffer, *this);
//
// The CORO_YIELD keyword updates the current status of the coroutine to
// indicate the line number currently being executed. The
// async_read_some() call is initiated, with a copy of the updated
// coroutine as its handler object, and the current coroutine exits. When
// the async_read_some() call finishes, the copied coroutine will be
// called, and will resume processing exactly where the original one left
// off--right after asynchronous call. This allows asynchronous I/O
// routines to be written with a logical flow, step following step, rather
// than as a linked chain of separate handler functions.
//
// When necessary, a coroutine can fork itself using the CORO_FORK keyword.
// This updates the status of the coroutine and makes a copy. The copy can
// then be called directly or posted to the ASIO service queue so that both
// coroutines will continue forward, one "parent" and one "child". The
// is_parent() and is_child() methods indicate which is which.
//
// The CORO_REENTER, CORO_YIELD and CORO_FORK keywords are implemented
// via preprocessor macros. The CORO_REENTER block is actually a large,
// complex switch statement. Because of this, inline variable declaration
// is impossible within CORO_REENTER unless it is done in a subsidiary
// scope--and if it is, that scope cannot contain CORO_YIELD or CORO_FORK
// keywords.
//
// Because coroutines are frequently copied, it is best to minimize copy
// overhead by limiting the size of data members in derived classes.
//
// It should be noted that when a coroutine falls out of scope its memory
// is reclaimed, even though it may be scheduled to resume when an
// asynchronous operation completes. Any shared_ptr<> objects declared in
// the coroutine may be destroyed if their reference count drops to zero,
// in which case the coroutine will have serious problems once it resumes.
// One solution so this is to have the space that will be used by a
// coroutine pre-allocated and stored on a free list; a new coroutine can
// fetch the block of space off a free list, place a shared pointer to it
// on an "in use" list, and carry on. The reference in the "in use" list
// would prevent the data from being destroyed.
class coroutine
{
public:
coroutine() : value_(0) {}
virtual ~coroutine() {}
bool is_child() const { return value_ < 0; }
bool is_parent() const { return !is_child(); }
bool is_complete() const { return value_ == -1; }
int get_value() const { return value_; }
private:
friend class coroutine_ref;
int value_;
};
class coroutine_ref
{
public:
coroutine_ref(coroutine& c) : value_(c.value_), modified_(false) {}
coroutine_ref(coroutine* c) : value_(c->value_), modified_(false) {}
~coroutine_ref() { if (!modified_) value_ = -1; }
operator int() const { return value_; }
int& operator=(int v) { modified_ = true; return value_ = v; }
private:
void operator=(const coroutine_ref&);
int& value_;
bool modified_;
};
#define CORO_REENTER(c) \
switch (coroutine_ref _coro_value = c) \
case -1: if (_coro_value) \
{ \
goto terminate_coroutine; \
terminate_coroutine: \
_coro_value = -1; \
goto bail_out_of_coroutine; \
bail_out_of_coroutine: \
break; \
} \
else case 0:
#define CORO_YIELD \
for (_coro_value = __LINE__;;) \
if (_coro_value == 0) \
{ \
case __LINE__: ; \
break; \
} \
else \
switch (_coro_value ? 0 : 1) \
for (;;) \
case -1: if (_coro_value) \
goto terminate_coroutine; \
else for (;;) \
case 1: if (_coro_value) \
goto bail_out_of_coroutine; \
else case 0:
#define CORO_FORK \
for (_coro_value = -__LINE__;; _coro_value = __LINE__) \
if (_coro_value == __LINE__) \
{ \
case -__LINE__: ; \
break; \
} \
else
#endif // COROUTINE_HPP
......@@ -74,7 +74,7 @@ if test "${boost_include_path}" ; then
BOOST_INCLUDES="-I${boost_include_path}"
CPPFLAGS="$CPPFLAGS $BOOST_INCLUDES"
fi
AC_CHECK_HEADERS([boost/shared_ptr.hpp boost/foreach.hpp boost/interprocess/sync/interprocess_upgradable_mutex.hpp boost/date_time/posix_time/posix_time_types.hpp boost/bind.hpp boost/function.hpp boost/asio.hpp boost/asio/ip/address.hpp boost/system/error_code.hpp],,
AC_CHECK_HEADERS([boost/shared_ptr.hpp boost/foreach.hpp boost/interprocess/sync/interprocess_upgradable_mutex.hpp boost/date_time/posix_time/posix_time_types.hpp boost/bind.hpp boost/function.hpp boost/asio/coroutine.hpp boost/asio.hpp boost/asio/ip/address.hpp boost/system/error_code.hpp],,
AC_MSG_ERROR([Missing required header files.]))
# clang can cause false positives with -Werror without -Qunused-arguments.
......
......@@ -1322,9 +1322,9 @@ static const flex_int16_t yy_rule_linenum[56] =
133, 135, 137, 142, 143, 148, 149, 150, 162, 165,
170, 177, 186, 195, 204, 213, 222, 231, 240, 249,
258, 267, 276, 285, 294, 303, 312, 321, 330, 339,
348, 357, 366, 375, 384, 393, 402, 411, 509, 514,
519, 524, 525, 526, 527, 528, 529, 531, 549, 562,
567, 571, 573, 575, 577
348, 357, 366, 375, 384, 393, 402, 411, 510, 515,
520, 525, 526, 527, 528, 529, 530, 532, 550, 563,
568, 572, 574, 576, 578
} ;
/* The intent behind this definition is that it'll catch
......@@ -2215,6 +2215,7 @@ YY_RULE_SETUP
case '"':
/* impossible condition */
driver.error(driver.loc_, "Bad quote in \"" + raw + "\"");
break;
case '\\':
++pos;
if (pos >= len) {
......@@ -2300,7 +2301,7 @@ YY_RULE_SETUP
case 39:
/* rule 39 can match eol */
YY_RULE_SETUP
#line 509 "agent_lexer.ll"
#line 510 "agent_lexer.ll"
{
/* Bad string with a forbidden control character inside */
driver.error(driver.loc_, "Invalid control in " + std::string(yytext));
......@@ -2309,7 +2310,7 @@ YY_RULE_SETUP
case 40:
/* rule 40 can match eol */
YY_RULE_SETUP
#line 514 "agent_lexer.ll"
#line 515 "agent_lexer.ll"
{
/* Bad string with a bad escape inside */
driver.error(driver.loc_, "Bad escape in " + std::string(yytext));
......@@ -2317,7 +2318,7 @@ YY_RULE_SETUP
YY_BREAK
case 41:
YY_RULE_SETUP
#line 519 "agent_lexer.ll"
#line 520 "agent_lexer.ll"
{
/* Bad string with an open escape at the end */
driver.error(driver.loc_, "Overflow escape in " + std::string(yytext));
......@@ -2325,37 +2326,37 @@ YY_RULE_SETUP
YY_BREAK
case 42:
YY_RULE_SETUP
#line 524 "agent_lexer.ll"
#line 525 "agent_lexer.ll"
{ return AgentParser::make_LSQUARE_BRACKET(driver.loc_); }
YY_BREAK
case 43:
YY_RULE_SETUP
#line 525 "agent_lexer.ll"
#line 526 "agent_lexer.ll"
{ return AgentParser::make_RSQUARE_BRACKET(driver.loc_); }
YY_BREAK
case 44:
YY_RULE_SETUP
#line 526 "agent_lexer.ll"
#line 527 "agent_lexer.ll"
{ return AgentParser::make_LCURLY_BRACKET(driver.loc_); }
YY_BREAK
case 45:
YY_RULE_SETUP
#line 527 "agent_lexer.ll"
#line 528 "agent_lexer.ll"
{ return AgentParser::make_RCURLY_BRACKET(driver.loc_); }
YY_BREAK
case 46:
YY_RULE_SETUP
#line 528 "agent_lexer.ll"
#line 529 "agent_lexer.ll"
{ return AgentParser::make_COMMA(driver.loc_); }
YY_BREAK
case 47:
YY_RULE_SETUP
#line 529 "agent_lexer.ll"
#line 530 "agent_lexer.ll"
{ return AgentParser::make_COLON(driver.loc_); }
YY_BREAK
case 48:
YY_RULE_SETUP
#line 531 "agent_lexer.ll"
#line 532 "agent_lexer.ll"
{
/* An integer was found. */
std::string tmp(yytext);
......@@ -2376,7 +2377,7 @@ YY_RULE_SETUP
YY_BREAK
case 49:
YY_RULE_SETUP
#line 549 "agent_lexer.ll"
#line 550 "agent_lexer.ll"
{
/* A floating point was found. */
std::string tmp(yytext);
......@@ -2392,7 +2393,7 @@ YY_RULE_SETUP
YY_BREAK
case 50:
YY_RULE_SETUP
#line 562 "agent_lexer.ll"
#line 563 "agent_lexer.ll"
{
string tmp(yytext);
return AgentParser::make_BOOLEAN(tmp == "true", driver.loc_);
......@@ -2400,33 +2401,33 @@ YY_RULE_SETUP
YY_BREAK
case 51:
YY_RULE_SETUP
#line 567 "agent_lexer.ll"
#line 568 "agent_lexer.ll"
{
return AgentParser::make_NULL_TYPE(driver.loc_);
}
YY_BREAK
case 52:
YY_RULE_SETUP
#line 571 "agent_lexer.ll"
#line 572 "agent_lexer.ll"
driver.error (driver.loc_, "JSON true reserved keyword is lower case only");
YY_BREAK
case 53:
YY_RULE_SETUP
#line 573 "agent_lexer.ll"
#line 574 "agent_lexer.ll"
driver.error (driver.loc_, "JSON false reserved keyword is lower case only");
YY_BREAK
case 54:
YY_RULE_SETUP
#line 575 "agent_lexer.ll"
#line 576 "agent_lexer.ll"
driver.error (driver.loc_, "JSON null reserved keyword is lower case only");
YY_BREAK
case 55:
YY_RULE_SETUP
#line 577 "agent_lexer.ll"
#line 578 "agent_lexer.ll"
driver.error (driver.loc_, "Invalid character: " + std::string(yytext));
YY_BREAK
case YY_STATE_EOF(INITIAL):
#line 579 "agent_lexer.ll"
#line 580 "agent_lexer.ll"
{
if (driver.states_.empty()) {
return AgentParser::make_END(driver.loc_);
......@@ -2452,10 +2453,10 @@ case YY_STATE_EOF(INITIAL):
YY_BREAK
case 56:
YY_RULE_SETUP
#line 602 "agent_lexer.ll"
#line 603 "agent_lexer.ll"
ECHO;
YY_BREAK
#line 2458 "agent_lexer.cc"
#line 2459 "agent_lexer.cc"
case YY_END_OF_BUFFER:
{
......@@ -3560,7 +3561,7 @@ void yyfree (void * ptr )
/* %ok-for-header */
#line 602 "agent_lexer.ll"
#line 603 "agent_lexer.ll"
using namespace isc::dhcp;
......
......@@ -423,6 +423,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
case '"':
/* impossible condition */
driver.error(driver.loc_, "Bad quote in \"" + raw + "\"");
break;
case '\\':
++pos;
if (pos >= len) {
......
......@@ -18,8 +18,7 @@ check-local:
done
AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib
AM_CPPFLAGS += -I$(top_builddir)/src/bin # for generated spec_config.h header
AM_CPPFLAGS += -I$(top_srcdir)/src/bin
AM_CPPFLAGS += -I$(top_srcdir)/src/bin -I$(top_builddir)/src/bin
AM_CPPFLAGS += $(BOOST_INCLUDES)
AM_CPPFLAGS += -DTEST_DATA_BUILDDIR=\"$(abs_top_builddir)/src/bin/agent/tests\"
AM_CPPFLAGS += -DINSTALL_PROG=\"$(abs_top_srcdir)/install-sh\"
......
......@@ -23,7 +23,7 @@ CLEANFILES = *.gcno *.gcda d2_messages.h d2_messages.cc s-messages
man_MANS = kea-dhcp-ddns.8
DISTCLEANFILES = $(man_MANS)
EXTRA_DIST = $(man_MANS) kea-dhcp-ddns.xml dhcp-ddns.spec d2.dox
EXTRA_DIST = $(man_MANS) kea-dhcp-ddns.xml d2.dox
EXTRA_DIST += d2_parser.yy
EXTRA_DIST += images/abstract_app_classes.svg images/add_state_model.svg
......@@ -119,7 +119,6 @@ kea_dhcp_ddns_LDFLAGS += $(CQL_LIBS)
endif
kea_dhcp_ddnsdir = $(pkgdatadir)
kea_dhcp_ddns_DATA = dhcp-ddns.spec
if GENERATE_PARSER
......
......@@ -9,7 +9,6 @@
#include <d2/d2_controller.h>
#include <d2/d2_process.h>
#include <d2/parser_context.h>
#include <process/spec_config.h>
#include <stdlib.h>
......@@ -45,14 +44,6 @@ DProcessBase* D2Controller::createProcess() {
D2Controller::D2Controller()
: DControllerBase(d2_app_name_, d2_bin_name_) {
// set the spec file either from the environment or
// use the production value.
if (getenv("KEA_FROM_BUILD")) {
setSpecFileName(std::string(getenv("KEA_FROM_BUILD")) +
"/src/bin/d2/dhcp-ddns.spec");
} else {
setSpecFileName(D2_SPECFILE_LOCATION);
}
}
isc::data::ConstElementPtr
......
......@@ -1063,9 +1063,9 @@ static const flex_int16_t yy_rule_linenum[62] =
170, 176, 185, 196, 207, 216, 225, 234, 244, 254,
264, 273, 282, 292, 302, 312, 323, 332, 342, 352,
363, 372, 381, 390, 399, 408, 417, 426, 439, 448,
457, 466, 475, 485, 583, 588, 593, 598, 599, 600,
601, 602, 603, 605, 623, 636, 641, 645, 647, 649,
651
457, 466, 475, 485, 584, 589, 594, 599, 600, 601,
602, 603, 604, 606, 624, 637, 642, 646, 648, 650,
652
} ;
/* The intent behind this definition is that it'll catch
......@@ -2046,6 +2046,7 @@ YY_RULE_SETUP
case '"':
/* impossible condition */
driver.error(driver.loc_, "Bad quote in \"" + raw + "\"");
break;
case '\\':
++pos;
if (pos >= len) {
......@@ -2131,7 +2132,7 @@ YY_RULE_SETUP
case 45:
/* rule 45 can match eol */
YY_RULE_SETUP
#line 583 "d2_lexer.ll"
#line 584 "d2_lexer.ll"
{
/* Bad string with a forbidden control character inside */
driver.error(driver.loc_, "Invalid control in " + std::string(yytext));
......@@ -2140,7 +2141,7 @@ YY_RULE_SETUP
case 46:
/* rule 46 can match eol */
YY_RULE_SETUP
#line 588 "d2_lexer.ll"
#line 589 "d2_lexer.ll"
{
/* Bad string with a bad escape inside */
driver.error(driver.loc_, "Bad escape in " + std::string(yytext));
......@@ -2148,7 +2149,7 @@ YY_RULE_SETUP
YY_BREAK
case 47:
YY_RULE_SETUP
#line 593 "d2_lexer.ll"
#line 594 "d2_lexer.ll"
{
/* Bad string with an open escape at the end */
driver.error(driver.loc_, "Overflow escape in " + std::string(yytext));
......@@ -2156,37 +2157,37 @@ YY_RULE_SETUP
YY_BREAK
case 48:
YY_RULE_SETUP
#line 598 "d2_lexer.ll"
#line 599 "d2_lexer.ll"
{ return isc::d2::D2Parser::make_LSQUARE_BRACKET(driver.loc_); }
YY_BREAK
case 49:
YY_RULE_SETUP
#line 599 "d2_lexer.ll"
#line 600 "d2_lexer.ll"
{ return isc::d2::D2Parser::make_RSQUARE_BRACKET(driver.loc_); }
YY_BREAK
case 50:
YY_RULE_SETUP
#line 600 "d2_lexer.ll"
#line 601 "d2_lexer.ll"
{ return isc::d2::D2Parser::make_LCURLY_BRACKET(driver.loc_); }
YY_BREAK
case 51:
YY_RULE_SETUP
#line 601 "d2_lexer.ll"
#line 602 "d2_lexer.ll"
{ return isc::d2::D2Parser::make_RCURLY_BRACKET(driver.loc_); }
YY_BREAK
case 52:
YY_RULE_SETUP
#line 602 "d2_lexer.ll"
#line 603 "d2_lexer.ll"
{ return isc::d2::D2Parser::make_COMMA(driver.loc_); }
YY_BREAK
case 53:
YY_RULE_SETUP
#line 603 "d2_lexer.ll"
#line 604 "d2_lexer.ll"
{ return isc::d2::D2Parser::make_COLON(driver.loc_); }
YY_BREAK
case 54:
YY_RULE_SETUP
#line 605 "d2_lexer.ll"
#line 606 "d2_lexer.ll"
{
/* An integer was found. */
std::string tmp(yytext);
......@@ -2207,7 +2208,7 @@ YY_RULE_SETUP
YY_BREAK
case 55:
YY_RULE_SETUP
#line 623 "d2_lexer.ll"
#line 624 "d2_lexer.ll"
{
/* A floating point was found. */
std::string tmp(yytext);
......@@ -2223,7 +2224,7 @@ YY_RULE_SETUP
YY_BREAK
case 56:
YY_RULE_SETUP
#line 636 "d2_lexer.ll"
#line 637 "d2_lexer.ll"
{
string tmp(yytext);
return isc::d2::D2Parser::make_BOOLEAN(tmp == "true", driver.loc_);
......@@ -2231,33 +2232,33 @@ YY_RULE_SETUP
YY_BREAK
case 57:
YY_RULE_SETUP
#line 641 "d2_lexer.ll"
#line 642 "d2_lexer.ll"
{
return isc::d2::D2Parser::make_NULL_TYPE(driver.loc_);
}
YY_BREAK
case 58:
YY_RULE_SETUP
#line 645 "d2_lexer.ll"
#line 646 "d2_lexer.ll"
driver.error (driver.loc_, "JSON true reserved keyword is lower case only");
YY_BREAK
case 59:
YY_RULE_SETUP
#line 647 "d2_lexer.ll"
#line 648 "d2_lexer.ll"
driver.error (driver.loc_, "JSON false reserved keyword is lower case only");
YY_BREAK
case 60:
YY_RULE_SETUP
#line 649 "d2_lexer.ll"
#line 650 "d2_lexer.ll"
driver.error (driver.loc_, "JSON null reserved keyword is lower case only");
YY_BREAK
case 61:
YY_RULE_SETUP
#line 651 "d2_lexer.ll"
#line 652 "d2_lexer.ll"
driver.error (driver.loc_, "Invalid character: " + std::string(yytext));
YY_BREAK
case YY_STATE_EOF(INITIAL):
#line 653 "d2_lexer.ll"
#line 654 "d2_lexer.ll"
{
if (driver.states_.empty()) {
return isc::d2::D2Parser::make_END(