2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-08-31 14:05:33 +00:00

[#916] Checkpoint before regen 2

This commit is contained in:
Francis Dupont
2020-05-29 18:10:16 +02:00
parent 92849b6886
commit 9312d57c73
12 changed files with 59 additions and 279 deletions

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 2017-2019 Internet Systems Consortium, Inc. ("ISC") /* Copyright (C) 2017-2020 Internet Systems Consortium, Inc. ("ISC")
This Source Code Form is subject to the terms of the Mozilla Public This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -312,19 +312,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} }
} }
\"Logging\" {
switch(driver.ctx_) {
case ParserContext::CONFIG:
return AgentParser::make_LOGGING(driver.loc_);
default:
return AgentParser::make_STRING("Logging", driver.loc_);
}
}
\"loggers\" { \"loggers\" {
switch(driver.ctx_) { switch(driver.ctx_) {
case ParserContext::AGENT: case ParserContext::AGENT:
case ParserContext::LOGGING:
return AgentParser::make_LOGGERS(driver.loc_); return AgentParser::make_LOGGERS(driver.loc_);
default: default:
return AgentParser::make_STRING("loggers", driver.loc_); return AgentParser::make_STRING("loggers", driver.loc_);
@@ -412,33 +402,6 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} }
} }
\"Dhcp4\" {
switch(driver.ctx_) {
case ParserContext::CONFIG:
return AgentParser::make_DHCP4(driver.loc_);
default:
return AgentParser::make_STRING("Dhcp4", driver.loc_);
}
}
\"Dhcp6\" {
switch(driver.ctx_) {
case ParserContext::CONFIG:
return AgentParser::make_DHCP6(driver.loc_);
default:
return AgentParser::make_STRING("Dhcp6", driver.loc_);
}
}
\"DhcpDdns\" {
switch(driver.ctx_) {
case ParserContext::CONFIG:
return AgentParser::make_DHCPDDNS(driver.loc_);
default:
return AgentParser::make_STRING("DhcpDdns", driver.loc_);
}
}
{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.

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 2017-2019 Internet Systems Consortium, Inc. ("ISC") /* Copyright (C) 2017-2020 Internet Systems Consortium, Inc. ("ISC")
This Source Code Form is subject to the terms of the Mozilla Public This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -67,7 +67,6 @@ using namespace std;
LIBRARY "library" LIBRARY "library"
PARAMETERS "parameters" PARAMETERS "parameters"
LOGGING "Logging"
LOGGERS "loggers" LOGGERS "loggers"
NAME "name" NAME "name"
OUTPUT_OPTIONS "output_options" OUTPUT_OPTIONS "output_options"
@@ -79,10 +78,6 @@ using namespace std;
MAXVER "maxver" MAXVER "maxver"
PATTERN "pattern" PATTERN "pattern"
DHCP4 "Dhcp4"
DHCP6 "Dhcp6"
DHCPDDNS "DhcpDdns"
// Not real tokens, just a way to signal what the parser is expected to // Not real tokens, just a way to signal what the parser is expected to
// parse. This define the starting point. It either can be full grammar // parse. This define the starting point. It either can be full grammar
// (START_AGENT), part of the grammar related to control-agent (START_SUB_AGENT) // (START_AGENT), part of the grammar related to control-agent (START_SUB_AGENT)
@@ -106,7 +101,7 @@ using namespace std;
%% %%
// The whole grammar starts with a map, because the config file // The whole grammar starts with a map, because the config file
// consists of Control-Agent, DhcpX, Logger and DhcpDdns entries in one big { }. // consists of only Control-Agent entry in one big { }.
%start start; %start start;
// The starting token can be one of those listed below. Note these are // The starting token can be one of those listed below. Note these are
@@ -219,8 +214,7 @@ unknown_map_entry: STRING COLON {
"got unexpected keyword \"" + keyword + "\" in " + where + " map."); "got unexpected keyword \"" + keyword + "\" in " + where + " map.");
}; };
// This defines the top-level { } that holds Control-agent, Dhcp6, Dhcp4, // This defines the top-level { } that holds only Control-agent object.
// DhcpDdns or Logging objects.
agent_syntax_map: LCURLY_BRACKET { agent_syntax_map: LCURLY_BRACKET {
// This code is executed when we're about to start parsing // This code is executed when we're about to start parsing
// the content of the map // the content of the map
@@ -232,18 +226,12 @@ agent_syntax_map: LCURLY_BRACKET {
// for it. // for it.
}; };
// This represents top-level entries: Control-agent, Logging, possibly others // This represents top-level entries: Control-agent.
global_objects: global_object global_objects: global_object
| global_objects COMMA global_object
; ;
// This represents a single top level entry, e.g. Control-agent, Dhcp6 or DhcpDdns. // This represents a single top level entry, e.g. Control-agent.
global_object: agent_object global_object: agent_object
| logging_object
| dhcp4_json_object
| dhcp6_json_object
| dhcpddns_json_object
| unknown_map_entry
; ;
// This define the Control-agent object. // This define the Control-agent object.
@@ -493,55 +481,8 @@ socket_type_value : UNIX { $$ = ElementPtr(new StringElement("unix", ctx.loc2pos
// --- control-sockets end here ------------------------------------------------ // --- control-sockets end here ------------------------------------------------
// JSON entries for other global objects (Dhcp4,Dhcp6 and DhcpDdns) // --- Loggers starts here -----------------------------------------------------
dhcp4_json_object: DHCP4 {
ctx.enter(ctx.NO_KEYWORDS);
} COLON value {
ctx.stack_.back()->set("Dhcp4", $4);
ctx.leave();
};
dhcp6_json_object: DHCP6 {
ctx.enter(ctx.NO_KEYWORDS);
} COLON value {
ctx.stack_.back()->set("Dhcp6", $4);
ctx.leave();
};
dhcpddns_json_object: DHCPDDNS {
ctx.enter(ctx.NO_KEYWORDS);
} COLON value {
ctx.stack_.back()->set("DhcpDdns", $4);
ctx.leave();
};
// --- Logging starts here -----------------------------------------------------
// This defines the top level "Logging" object. It parses
// the following "Logging": { ... }. The ... is defined
// by logging_params
logging_object: LOGGING {
ElementPtr m(new MapElement(ctx.loc2pos(@1)));
ctx.stack_.back()->set("Logging", m);
ctx.stack_.push_back(m);
ctx.enter(ctx.LOGGING);
} COLON LCURLY_BRACKET logging_params RCURLY_BRACKET {
ctx.stack_.pop_back();
ctx.leave();
};
// This defines the list of allowed parameters that may appear
// in the top-level Logging object. It can either be a single
// parameter or several parameters separated by commas.
logging_params: logging_param
| logging_params COMMA logging_param
;
// There's currently only one parameter defined, which is "loggers".
logging_param: loggers;
// "loggers", the only parameter currently defined in "Logging" object,
// is "Loggers": [ ... ].
loggers: LOGGERS { loggers: LOGGERS {
ElementPtr l(new ListElement(ctx.loc2pos(@1))); ElementPtr l(new ListElement(ctx.loc2pos(@1)));
ctx.stack_.back()->set("loggers", l); ctx.stack_.back()->set("loggers", l);
@@ -558,7 +499,7 @@ loggers_entries: logger_entry
| loggers_entries COMMA logger_entry | loggers_entries COMMA logger_entry
; ;
// This defines a single entry defined in loggers in Logging. // This defines a single entry defined in loggers.
logger_entry: LCURLY_BRACKET { logger_entry: LCURLY_BRACKET {
ElementPtr l(new MapElement(ctx.loc2pos(@1))); ElementPtr l(new MapElement(ctx.loc2pos(@1)));
ctx.stack_.back()->add(l); ctx.stack_.back()->add(l);

View File

@@ -1,4 +1,4 @@
// Copyright (C) 2017-2018 Internet Systems Consortium, Inc. ("ISC") // Copyright (C) 2017-2020 Internet Systems Consortium, Inc. ("ISC")
// //
// This Source Code Form is subject to the terms of the Mozilla Public // This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -123,8 +123,6 @@ ParserContext::contextName()
return ("toplevel"); return ("toplevel");
case AGENT: case AGENT:
return ("Control-agent"); return ("Control-agent");
case LOGGING:
return ("Logging");
case CONTROL_SOCKETS: case CONTROL_SOCKETS:
return ("control-sockets"); return ("control-sockets");
case SERVER: case SERVER:

View File

@@ -1,4 +1,4 @@
// Copyright (C) 2017-2019 Internet Systems Consortium, Inc. ("ISC") // Copyright (C) 2017-2020 Internet Systems Consortium, Inc. ("ISC")
// //
// This Source Code Form is subject to the terms of the Mozilla Public // This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -152,15 +152,12 @@ public:
///< This one is used in pure JSON mode. ///< This one is used in pure JSON mode.
NO_KEYWORDS, NO_KEYWORDS,
///< Used while parsing top level (that contains Control-agent, Logging and others) ///< Used while parsing top level (that contains Control-agent)
CONFIG, CONFIG,
///< Used while parsing content of Agent. ///< Used while parsing content of Agent.
AGENT, AGENT,
///< Used while parsing content of Logging.
LOGGING,
///< Used while parsing Control-agent/control-sockets. ///< Used while parsing Control-agent/control-sockets.
CONTROL_SOCKETS, CONTROL_SOCKETS,

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 2017-2019 Internet Systems Consortium, Inc. ("ISC") /* Copyright (C) 2017-2020 Internet Systems Consortium, Inc. ("ISC")
This Source Code Form is subject to the terms of the Mozilla Public This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -419,20 +419,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} }
} }
\"Logging\" {
switch(driver.ctx_) {
case isc::d2::D2ParserContext::CONFIG:
return isc::d2::D2Parser::make_LOGGING(driver.loc_);
default:
return isc::d2::D2Parser::make_STRING("Logging", driver.loc_);
}
}
\"loggers\" { \"loggers\" {
switch(driver.ctx_) { switch(driver.ctx_) {
case isc::d2::D2ParserContext::DHCPDDNS: case isc::d2::D2ParserContext::DHCPDDNS:
case isc::d2::D2ParserContext::LOGGING:
return isc::d2::D2Parser::make_LOGGERS(driver.loc_); return isc::d2::D2Parser::make_LOGGERS(driver.loc_);
default: default:
return isc::d2::D2Parser::make_STRING("loggers", driver.loc_); return isc::d2::D2Parser::make_STRING("loggers", driver.loc_);
@@ -524,34 +513,6 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} }
} }
\"Dhcp4\" {
switch(driver.ctx_) {
case isc::d2::D2ParserContext::CONFIG:
return isc::d2::D2Parser::make_DHCP4(driver.loc_);
default:
return isc::d2::D2Parser::make_STRING("Dhcp4", driver.loc_);
}
}
\"Dhcp6\" {
switch(driver.ctx_) {
case isc::d2::D2ParserContext::CONFIG:
return isc::d2::D2Parser::make_DHCP6(driver.loc_);
default:
return isc::d2::D2Parser::make_STRING("Dhcp6", driver.loc_);
}
}
\"Control-agent\" {
switch(driver.ctx_) {
case isc::d2::D2ParserContext::CONFIG:
return isc::d2::D2Parser::make_CONTROL_AGENT(driver.loc_);
default:
return isc::d2::D2Parser::make_STRING("Control-agent", driver.loc_);
}
}
{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.

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 2017-2019 Internet Systems Consortium, Inc. ("ISC") /* Copyright (C) 2017-2020 Internet Systems Consortium, Inc. ("ISC")
This Source Code Form is subject to the terms of the Mozilla Public This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -49,10 +49,6 @@ using namespace std;
RCURLY_BRACKET "}" RCURLY_BRACKET "}"
NULL_TYPE "null" NULL_TYPE "null"
DHCP6 "Dhcp6"
DHCP4 "Dhcp4"
CONTROL_AGENT "Control-agent"
DHCPDDNS "DhcpDdns" DHCPDDNS "DhcpDdns"
IP_ADDRESS "ip-address" IP_ADDRESS "ip-address"
PORT "port" PORT "port"
@@ -79,7 +75,6 @@ using namespace std;
SOCKET_TYPE "socket-type" SOCKET_TYPE "socket-type"
SOCKET_NAME "socket-name" SOCKET_NAME "socket-name"
LOGGING "Logging"
LOGGERS "loggers" LOGGERS "loggers"
NAME "name" NAME "name"
OUTPUT_OPTIONS "output_options" OUTPUT_OPTIONS "output_options"
@@ -215,8 +210,7 @@ unknown_map_entry: STRING COLON {
}; };
// This defines the top-level { } that holds Control-agent, Dhcp6, Dhcp4, // This defines the top-level { } that holds only DhcpDdns object.
// DhcpDdns or Logging objects.
syntax_map: LCURLY_BRACKET { syntax_map: LCURLY_BRACKET {
// This code is executed when we're about to start parsing // This code is executed when we're about to start parsing
// the content of the map // the content of the map
@@ -228,18 +222,12 @@ syntax_map: LCURLY_BRACKET {
// for it. // for it.
}; };
// This represents top-level entries: Dhcp6, Dhcp4, DhcpDdns, Logging // This represents top-level entries: DhcpDdns.
global_objects: global_object global_objects: global_object
| global_objects COMMA global_object
; ;
// This represents a single top level entry, e.g. Dhcp6 or DhcpDdns. // This represents a single top level entry, e.g. DhcpDdns.
global_object: dhcp6_json_object global_object: dhcpddns_object
| logging_object
| dhcp4_json_object
| dhcpddns_object
| control_agent_json_object
| unknown_map_entry
; ;
// --- dhcp ddns --------------------------------------------- // --- dhcp ddns ---------------------------------------------
@@ -711,55 +699,8 @@ control_socket_name: SOCKET_NAME {
ctx.leave(); ctx.leave();
}; };
// ---------------------------------------------------------------- // --- loggers entry -----------------------------------------
dhcp6_json_object: DHCP6 {
ctx.enter(ctx.NO_KEYWORD);
} COLON value {
ctx.stack_.back()->set("Dhcp6", $4);
ctx.leave();
};
dhcp4_json_object: DHCP4 {
ctx.enter(ctx.NO_KEYWORD);
} COLON value {
ctx.stack_.back()->set("Dhcp4", $4);
ctx.leave();
};
control_agent_json_object: CONTROL_AGENT {
ctx.enter(ctx.NO_KEYWORD);
} COLON value {
ctx.stack_.back()->set("Control-agent", $4);
ctx.leave();
};
// --- logging entry -----------------------------------------
// This defines the top level "Logging" object. It parses
// the following "Logging": { ... }. The ... is defined
// by logging_params
logging_object: LOGGING {
ElementPtr m(new MapElement(ctx.loc2pos(@1)));
ctx.stack_.back()->set("Logging", m);
ctx.stack_.push_back(m);
ctx.enter(ctx.LOGGING);
} COLON LCURLY_BRACKET logging_params RCURLY_BRACKET {
ctx.stack_.pop_back();
ctx.leave();
};
// This defines the list of allowed parameters that may appear
// in the top-level Logging object. It can either be a single
// parameter or several parameters separated by commas.
logging_params: logging_param
| logging_params COMMA logging_param
;
// There's currently only one parameter defined, which is "loggers".
logging_param: loggers;
// "loggers", the only parameter currently defined in "Logging" object,
// is "Loggers": [ ... ]. // is "Loggers": [ ... ].
loggers: LOGGERS { loggers: LOGGERS {
ElementPtr l(new ListElement(ctx.loc2pos(@1))); ElementPtr l(new ListElement(ctx.loc2pos(@1)));
@@ -777,7 +718,7 @@ loggers_entries: logger_entry
| loggers_entries COMMA logger_entry | loggers_entries COMMA logger_entry
; ;
// This defines a single entry defined in loggers in Logging. // This defines a single entry defined in loggers.
logger_entry: LCURLY_BRACKET { logger_entry: LCURLY_BRACKET {
ElementPtr l(new MapElement(ctx.loc2pos(@1))); ElementPtr l(new MapElement(ctx.loc2pos(@1)));
ctx.stack_.back()->add(l); ctx.stack_.back()->add(l);

View File

@@ -1,4 +1,4 @@
// Copyright (C) 2017-2019 Internet Systems Consortium, Inc. ("ISC") // Copyright (C) 2017-2020 Internet Systems Consortium, Inc. ("ISC")
// //
// This Source Code Form is subject to the terms of the Mozilla Public // This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -144,8 +144,6 @@ D2ParserContext::contextName()
return("dns-servers"); return("dns-servers");
case CONTROL_SOCKET: case CONTROL_SOCKET:
return("control-socket"); return("control-socket");
case LOGGING:
return ("Logging");
case LOGGERS: case LOGGERS:
return ("loggers"); return ("loggers");
case OUTPUT_OPTIONS: case OUTPUT_OPTIONS:

View File

@@ -1,4 +1,4 @@
// Copyright (C) 2017-2019 Internet Systems Consortium, Inc. ("ISC") // Copyright (C) 2017-2020 Internet Systems Consortium, Inc. ("ISC")
// //
// This Source Code Form is subject to the terms of the Mozilla Public // This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -48,7 +48,7 @@ public:
/// This parser will parse the content as generic JSON. /// This parser will parse the content as generic JSON.
PARSER_JSON, PARSER_JSON,
///< Used for parsing top level (contains DhcpDdns, Logging, others) ///< Used for parsing top level (contains DhcpDdns)
PARSER_DHCPDDNS, PARSER_DHCPDDNS,
///< Used for parsing content of DhcpDdns. ///< Used for parsing content of DhcpDdns.
@@ -165,7 +165,7 @@ public:
///< This one is used in pure JSON mode. ///< This one is used in pure JSON mode.
NO_KEYWORD, NO_KEYWORD,
///< Used while parsing top level (contains DhcpDdns, Logging, ...) ///< Used while parsing top level (contains DhcpDdns).
CONFIG, CONFIG,
///< Used while parsing content of DhcpDdns. ///< Used while parsing content of DhcpDdns.
@@ -207,9 +207,6 @@ public:
///< Used while parsing content of a control-socket ///< Used while parsing content of a control-socket
CONTROL_SOCKET, CONTROL_SOCKET,
///< Used while parsing content of Logging
LOGGING,
/// Used while parsing DhcpDdns/loggers structures. /// Used while parsing DhcpDdns/loggers structures.
LOGGERS, LOGGERS,

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 2018-2019 Internet Systems Consortium, Inc. ("ISC") /* Copyright (C) 2018-2020 Internet Systems Consortium, Inc. ("ISC")
This Source Code Form is subject to the terms of the Mozilla Public This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -380,19 +380,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} }
} }
\"Logging\" {
switch(driver.ctx_) {
case ParserContext::CONFIG:
return NetconfParser::make_LOGGING(driver.loc_);
default:
return NetconfParser::make_STRING("Logging", driver.loc_);
}
}
\"loggers\" { \"loggers\" {
switch(driver.ctx_) { switch(driver.ctx_) {
case ParserContext::NETCONF: case ParserContext::NETCONF:
case ParserContext::LOGGING:
return NetconfParser::make_LOGGERS(driver.loc_); return NetconfParser::make_LOGGERS(driver.loc_);
default: default:
return NetconfParser::make_STRING("loggers", driver.loc_); return NetconfParser::make_STRING("loggers", driver.loc_);

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 2018-2019 Internet Systems Consortium, Inc. ("ISC") /* Copyright (C) 2018-2020 Internet Systems Consortium, Inc. ("ISC")
This Source Code Form is subject to the terms of the Mozilla Public This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -75,7 +75,6 @@ using namespace std;
LIBRARY "library" LIBRARY "library"
PARAMETERS "parameters" PARAMETERS "parameters"
LOGGING "Logging"
LOGGERS "loggers" LOGGERS "loggers"
NAME "name" NAME "name"
OUTPUT_OPTIONS "output_options" OUTPUT_OPTIONS "output_options"
@@ -223,7 +222,7 @@ unknown_map_entry: STRING COLON {
"got unexpected keyword \"" + keyword + "\" in " + where + " map."); "got unexpected keyword \"" + keyword + "\" in " + where + " map.");
}; };
// This defines the top-level { } that holds Netconf or Logging objects. // This defines the top-level { } that holds Netconf object.
netconf_syntax_map: LCURLY_BRACKET { netconf_syntax_map: LCURLY_BRACKET {
// This code is executed when we're about to start parsing // This code is executed when we're about to start parsing
// the content of the map // the content of the map
@@ -235,14 +234,13 @@ netconf_syntax_map: LCURLY_BRACKET {
// for it. // for it.
}; };
// This represents top-level entries: Netconf, Logging, possibly others // This represents top-level entries: Netconf.
global_objects: global_object global_objects: global_object
| global_objects COMMA global_object | global_objects COMMA global_object
; ;
// This represents a single top level entry, e.g. Netconf or Logging. // This represents a single top level entry, e.g. Netconf.
global_object: netconf_object global_object: netconf_object
| logging_object
; ;
// This define the Netconf object. // This define the Netconf object.
@@ -252,6 +250,9 @@ netconf_object: NETCONF {
// top level map (that's already on the stack) and put the new map // top level map (that's already on the stack) and put the new map
// on the stack as well, so child elements will be able to add // on the stack as well, so child elements will be able to add
// themselves to it. // themselves to it.
// Prevent against duplicate.
ctx.unique("Netconf, ctx.loc2pos(@1));
ElementPtr m(new MapElement(ctx.loc2pos(@1))); ElementPtr m(new MapElement(ctx.loc2pos(@1)));
ctx.stack_.back()->set("Netconf", m); ctx.stack_.back()->set("Netconf", m);
ctx.stack_.push_back(m); ctx.stack_.push_back(m);
@@ -558,33 +559,8 @@ socket_url: SOCKET_URL {
// --- managed-servers end here ------------------------------------------------ // --- managed-servers end here ------------------------------------------------
// --- Logging starts here ----------------------------------------------------- // --- Loggers starts here -----------------------------------------------------
// This defines the top level "Logging" object. It parses
// the following "Logging": { ... }. The ... is defined
// by logging_params
logging_object: LOGGING {
ElementPtr m(new MapElement(ctx.loc2pos(@1)));
ctx.stack_.back()->set("Logging", m);
ctx.stack_.push_back(m);
ctx.enter(ctx.LOGGING);
} COLON LCURLY_BRACKET logging_params RCURLY_BRACKET {
ctx.stack_.pop_back();
ctx.leave();
};
// This defines the list of allowed parameters that may appear
// in the top-level Logging object. It can either be a single
// parameter or several parameters separated by commas.
logging_params: logging_param
| logging_params COMMA logging_param
;
// There's currently only one parameter defined, which is "loggers".
logging_param: loggers;
// "loggers", the only parameter currently defined in "Logging" object,
// is "Loggers": [ ... ].
loggers: LOGGERS { loggers: LOGGERS {
ElementPtr l(new ListElement(ctx.loc2pos(@1))); ElementPtr l(new ListElement(ctx.loc2pos(@1)));
ctx.stack_.back()->set("loggers", l); ctx.stack_.back()->set("loggers", l);
@@ -601,7 +577,7 @@ loggers_entries: logger_entry
| loggers_entries COMMA logger_entry | loggers_entries COMMA logger_entry
; ;
// This defines a single entry defined in loggers in Logging. // This defines a single entry defined in loggers.
logger_entry: LCURLY_BRACKET { logger_entry: LCURLY_BRACKET {
ElementPtr l(new MapElement(ctx.loc2pos(@1))); ElementPtr l(new MapElement(ctx.loc2pos(@1)));
ctx.stack_.back()->add(l); ctx.stack_.back()->add(l);

View File

@@ -1,4 +1,4 @@
// Copyright (C) 2018 Internet Systems Consortium, Inc. ("ISC") // Copyright (C) 2018-2020 Internet Systems Consortium, Inc. ("ISC")
// //
// This Source Code Form is subject to the terms of the Mozilla Public // This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -111,6 +111,18 @@ ParserContext::require(const std::string& name,
} }
} }
void
ParserContext::unique(const std::string& name,
isc::data::Element::Position loc)
{
ConstElementPtr value = stack_.back()->get(name);
if (value) {
isc_throw(ParseError, loc << ": duplicate " << name
<< " entries in " << contextName()
<< " map (previous at " << value->getPosition() << ")");
}
}
void void
ParserContext::enter(const LexerContext& ctx) ParserContext::enter(const LexerContext& ctx)
{ {
@@ -138,8 +150,6 @@ ParserContext::contextName()
return ("toplevel"); return ("toplevel");
case NETCONF: case NETCONF:
return ("Netconf"); return ("Netconf");
case LOGGING:
return ("Logging");
case MANAGED_SERVERS: case MANAGED_SERVERS:
return ("managed-servers"); return ("managed-servers");
case SERVER: case SERVER:

View File

@@ -1,4 +1,4 @@
// Copyright (C) 2018-2019 Internet Systems Consortium, Inc. ("ISC") // Copyright (C) 2018-2020 Internet Systems Consortium, Inc. ("ISC")
// //
// This Source Code Form is subject to the terms of the Mozilla Public // This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -161,20 +161,28 @@ public:
isc::data::Element::Position open_loc, isc::data::Element::Position open_loc,
isc::data::Element::Position close_loc); isc::data::Element::Position close_loc);
/// @brief Check if a parameter is already present
///
/// Check if a parameter is already present in the map at the top
/// of the stack and raise an error when it is.
///
/// @param name name of the parameter to check
/// @param loc location of the current parameter
/// @throw ParseError
void unique(const std::string& name,
isc::data::Element::Position loc);
/// @brief Defines syntactic contexts for lexical tie-ins /// @brief Defines syntactic contexts for lexical tie-ins
typedef enum { typedef enum {
///< This one is used in pure JSON mode. ///< This one is used in pure JSON mode.
NO_KEYWORDS, NO_KEYWORDS,
///< Used while parsing top level (that contains Netconf, Logging and others) ///< Used while parsing top level (that contains Netconf)
CONFIG, CONFIG,
///< Used while parsing content of Netconf. ///< Used while parsing content of Netconf.
NETCONF, NETCONF,
///< Used while parsing content of Logging.
LOGGING,
/// Used while parsing Netconf/managed-servers. /// Used while parsing Netconf/managed-servers.
MANAGED_SERVERS, MANAGED_SERVERS,