From: Francis Dupont Date: Mon, 28 Nov 2016 16:47:48 +0000 (+0100) Subject: [5014_phase2] Added Element position X-Git-Tag: trac5036_base2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8d5dca26e6acca0b2c5d0727d311e0da8123f478;p=thirdparty%2Fkea.git [5014_phase2] Added Element position --- diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index f48bff75c4..4eef1f9138 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -159,11 +159,11 @@ start: TOPLEVEL_GENERIC_JSON { ctx.ctx_ = ctx.NO_KEYWORD; } map2 // Note that ctx_ is NO_KEYWORD here // Values rule -value: INTEGER { $$ = ElementPtr(new IntElement($1)); } - | FLOAT { $$ = ElementPtr(new DoubleElement($1)); } - | BOOLEAN { $$ = ElementPtr(new BoolElement($1)); } - | STRING { $$ = ElementPtr(new StringElement($1)); } - | NULL_TYPE { $$ = ElementPtr(new NullElement()); } +value: INTEGER { $$ = ElementPtr(new IntElement($1, ctx.loc2pos(@1))); } + | FLOAT { $$ = ElementPtr(new DoubleElement($1, ctx.loc2pos(@1))); } + | BOOLEAN { $$ = ElementPtr(new BoolElement($1, ctx.loc2pos(@1))); } + | STRING { $$ = ElementPtr(new StringElement($1, ctx.loc2pos(@1))); } + | NULL_TYPE { $$ = ElementPtr(new NullElement(ctx.loc2pos(@1))); } | map2 { $$ = ctx.stack_.back(); ctx.stack_.pop_back(); } | list_generic { $$ = ctx.stack_.back(); ctx.stack_.pop_back(); } ; @@ -171,7 +171,7 @@ value: INTEGER { $$ = ElementPtr(new IntElement($1)); } map2: LCURLY_BRACKET { // This code is executed when we're about to start parsing // the content of the map - ElementPtr m(new MapElement()); + ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.push_back(m); } map_content RCURLY_BRACKET { // map parsing completed. If we ever want to do any wrap up @@ -196,7 +196,7 @@ not_empty_map: STRING COLON value { ; list_generic: LSQUARE_BRACKET { - ElementPtr l(new ListElement()); + ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.push_back(l); } list_content RSQUARE_BRACKET { // list parsing complete. Put any sanity checking here @@ -243,7 +243,7 @@ unknown_map_entry: STRING COLON { syntax_map: LCURLY_BRACKET { // This code is executed when we're about to start parsing // the content of the map - ElementPtr m(new MapElement()); + ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.push_back(m); } global_objects RCURLY_BRACKET { // map parsing completed. If we ever want to do any wrap up @@ -267,7 +267,7 @@ global_object: dhcp6_object dhcp6_object: DHCP6 { // This code is executed when we're about to start parsing // the content of the map - ElementPtr m(new MapElement()); + ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("Dhcp6", m); ctx.stack_.push_back(m); ctx.enter(ctx.DHCP6); @@ -307,27 +307,27 @@ global_param: preferred_lifetime ; preferred_lifetime: PREFERRED_LIFETIME COLON INTEGER { - ElementPtr prf(new IntElement($3)); + ElementPtr prf(new IntElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set("preferred-lifetime", prf); }; valid_lifetime: VALID_LIFETIME COLON INTEGER { - ElementPtr prf(new IntElement($3)); + ElementPtr prf(new IntElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set("valid-lifetime", prf); }; renew_timer: RENEW_TIMER COLON INTEGER { - ElementPtr prf(new IntElement($3)); + ElementPtr prf(new IntElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set("renew-timer", prf); }; rebind_timer: REBIND_TIMER COLON INTEGER { - ElementPtr prf(new IntElement($3)); + ElementPtr prf(new IntElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set("rebind-timer", prf); }; interfaces_config: INTERFACES_CONFIG { - ElementPtr i(new MapElement()); + ElementPtr i(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("interfaces-config", i); ctx.stack_.push_back(i); ctx.enter(ctx.INTERFACES_CONFIG); @@ -337,7 +337,7 @@ interfaces_config: INTERFACES_CONFIG { }; interface_config_map: INTERFACES { - ElementPtr l(new ListElement()); + ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("interfaces", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); @@ -347,7 +347,7 @@ interface_config_map: INTERFACES { }; lease_database: LEASE_DATABASE { - ElementPtr i(new MapElement()); + ElementPtr i(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("lease-database", i); ctx.stack_.push_back(i); ctx.enter(ctx.LEASE_DATABASE); @@ -357,7 +357,7 @@ lease_database: LEASE_DATABASE { }; hosts_database: HOSTS_DATABASE { - ElementPtr i(new MapElement()); + ElementPtr i(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("hosts-database", i); ctx.stack_.push_back(i); ctx.enter(ctx.HOSTS_DATABASE); @@ -383,7 +383,7 @@ database_map_param: type type: TYPE { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr prf(new StringElement($4)); + ElementPtr prf(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("type", prf); ctx.leave(); }; @@ -391,7 +391,7 @@ type: TYPE { user: USER { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr user(new StringElement($4)); + ElementPtr user(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("user", user); ctx.leave(); }; @@ -399,7 +399,7 @@ user: USER { password: PASSWORD { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr pwd(new StringElement($4)); + ElementPtr pwd(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("password", pwd); ctx.leave(); }; @@ -407,7 +407,7 @@ password: PASSWORD { host: HOST { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr h(new StringElement($4)); + ElementPtr h(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("host", h); ctx.leave(); }; @@ -415,23 +415,23 @@ host: HOST { name: NAME { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr name(new StringElement($4)); + ElementPtr name(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("name", name); ctx.leave(); }; persist: PERSIST COLON BOOLEAN { - ElementPtr n(new BoolElement($3)); + ElementPtr n(new BoolElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set("persist", n); }; lfc_interval: LFC_INTERVAL COLON INTEGER { - ElementPtr n(new IntElement($3)); + ElementPtr n(new IntElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set("lfc-interval", n); }; mac_sources: MAC_SOURCES { - ElementPtr l(new ListElement()); + ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("mac-sources", l); ctx.stack_.push_back(l); ctx.enter(ctx.MAC_SOURCES); @@ -449,17 +449,17 @@ mac_sources_value: duid_id ; duid_id : DUID { - ElementPtr duid(new StringElement("duid")); + ElementPtr duid(new StringElement("duid", ctx.loc2pos(@1))); ctx.stack_.back()->add(duid); }; string_id : STRING { - ElementPtr duid(new StringElement($1)); + ElementPtr duid(new StringElement($1, ctx.loc2pos(@1))); ctx.stack_.back()->add(duid); }; host_reservation_identifiers: HOST_RESERVATION_IDENTIFIERS { - ElementPtr l(new ListElement()); + ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("host-reservation-identifiers", l); ctx.stack_.push_back(l); ctx.enter(ctx.HOST_RESERVATION_IDENTIFIERS); @@ -477,12 +477,12 @@ host_reservation_identifier: duid_id ; hw_address_id : HW_ADDRESS { - ElementPtr hwaddr(new StringElement("hw-address")); + ElementPtr hwaddr(new StringElement("hw-address", ctx.loc2pos(@1))); ctx.stack_.back()->add(hwaddr); }; relay_supplied_options: RELAY_SUPPLIED_OPTIONS { - ElementPtr l(new ListElement()); + ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("relay-supplied-options", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); @@ -492,7 +492,7 @@ relay_supplied_options: RELAY_SUPPLIED_OPTIONS { }; hooks_libraries: HOOKS_LIBRARIES { - ElementPtr l(new ListElement()); + ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("hooks-libraries", l); ctx.stack_.push_back(l); ctx.enter(ctx.HOOKS_LIBRARIES); @@ -510,7 +510,7 @@ not_empty_hooks_libraries_list: hooks_library ; hooks_library: LCURLY_BRACKET { - ElementPtr m(new MapElement()); + ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } hooks_params RCURLY_BRACKET { @@ -524,14 +524,14 @@ hooks_params: hooks_param hooks_param: LIBRARY { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr lib(new StringElement($4)); + ElementPtr lib(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("library", lib); ctx.leave(); }; // --- expired-leases-processing ------------------------ expired_leases_processing: EXPIRED_LEASES_PROCESSING { - ElementPtr m(new MapElement()); + ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("expired-leases-processing", m); ctx.stack_.push_back(m); ctx.enter(ctx.NO_KEYWORD); @@ -548,7 +548,7 @@ expired_leases_params: expired_leases_param // Instead of explicitly listing all allowed expired leases parameters, we // simply say that all of them as integers. expired_leases_param: STRING COLON INTEGER { - ElementPtr value(new IntElement($3)); + ElementPtr value(new IntElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set($1, value); } @@ -556,7 +556,7 @@ expired_leases_param: STRING COLON INTEGER { // This defines subnet6 as a list of maps. // "subnet6": [ ... ] subnet6_list: SUBNET6 { - ElementPtr l(new ListElement()); + ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("subnet6", l); ctx.stack_.push_back(l); ctx.enter(ctx.SUBNET6); @@ -581,7 +581,7 @@ not_empty_subnet6_list: subnet6 // This defines a single subnet, i.e. a single map with // subnet6 array. subnet6: LCURLY_BRACKET { - ElementPtr m(new MapElement()); + ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } subnet6_params RCURLY_BRACKET { @@ -623,7 +623,7 @@ subnet6_param: option_data_list subnet: SUBNET { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr subnet(new StringElement($4)); + ElementPtr subnet(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("subnet", subnet); ctx.leave(); }; @@ -631,7 +631,7 @@ subnet: SUBNET { interface: INTERFACE { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr iface(new StringElement($4)); + ElementPtr iface(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("interface", iface); ctx.leave(); }; @@ -639,13 +639,13 @@ interface: INTERFACE { client_class: CLIENT_CLASS { ctx.enter(ctx.CLIENT_CLASS); } COLON STRING { - ElementPtr cls(new StringElement($4)); + ElementPtr cls(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("client-class", cls); ctx.leave(); }; id: ID COLON INTEGER { - ElementPtr id(new IntElement($3)); + ElementPtr id(new IntElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set("id", id); }; @@ -654,7 +654,7 @@ id: ID COLON INTEGER { // This defines the "option-data": [ ... ] entry that may appear // in several places, but most notably in subnet6 entries. option_data_list: OPTION_DATA { - ElementPtr l(new ListElement()); + ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("option-data", l); ctx.stack_.push_back(l); ctx.enter(ctx.OPTION_DATA); @@ -676,7 +676,7 @@ not_empty_option_data_list: option_data_entry // This defines th content of a single entry { ... } within // option-data list. option_data_entry: LCURLY_BRACKET { - ElementPtr m(new MapElement()); + ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } option_data_params RCURLY_BRACKET { @@ -707,26 +707,26 @@ option_data_name: name; option_data_data: DATA { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr data(new StringElement($4)); + ElementPtr data(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("data", data); ctx.leave(); }; option_data_code: CODE COLON INTEGER { - ElementPtr code(new IntElement($3)); + ElementPtr code(new IntElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set("code", code); }; option_data_space: SPACE { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr space(new StringElement($4)); + ElementPtr space(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("space", space); ctx.leave(); }; option_data_csv_format: CSV_FORMAT COLON BOOLEAN { - ElementPtr space(new BoolElement($3)); + ElementPtr space(new BoolElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set("csv-format", space); }; @@ -734,7 +734,7 @@ option_data_csv_format: CSV_FORMAT COLON BOOLEAN { // This defines the "pools": [ ... ] entry that may appear in subnet6. pools_list: POOLS { - ElementPtr l(new ListElement()); + ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("pools", l); ctx.stack_.push_back(l); ctx.enter(ctx.POOLS); @@ -754,7 +754,7 @@ not_empty_pools_list: pool_list_entry ; pool_list_entry: LCURLY_BRACKET { - ElementPtr m(new MapElement()); + ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } pool_params RCURLY_BRACKET { @@ -773,7 +773,7 @@ pool_param: pool_entry pool_entry: POOL { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr pool(new StringElement($4)); + ElementPtr pool(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("pool", pool); ctx.leave(); }; @@ -782,7 +782,7 @@ pool_entry: POOL { // --- pd-pools ---------------------------------------------- pd_pools_list: PD_POOLS { - ElementPtr l(new ListElement()); + ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("pd-pools", l); ctx.stack_.push_back(l); ctx.enter(ctx.PD_POOLS); @@ -802,7 +802,7 @@ not_empty_pd_pools_list: pd_pool_entry ; pd_pool_entry: LCURLY_BRACKET { - ElementPtr m(new MapElement()); + ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } pd_pool_params RCURLY_BRACKET { @@ -823,18 +823,18 @@ pd_pool_param: pd_prefix pd_prefix: PREFIX { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr prf(new StringElement($4)); + ElementPtr prf(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("prefix", prf); ctx.leave(); } pd_prefix_len: PREFIX_LEN COLON INTEGER { - ElementPtr prf(new IntElement($3)); + ElementPtr prf(new IntElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set("prefix-len", prf); } pd_delegated_len: DELEGATED_LEN COLON INTEGER { - ElementPtr deleg(new IntElement($3)); + ElementPtr deleg(new IntElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set("delegated-len", deleg); } @@ -842,7 +842,7 @@ pd_delegated_len: DELEGATED_LEN COLON INTEGER { // --- reservations ------------------------------------------ reservations: RESERVATIONS { - ElementPtr l(new ListElement()); + ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("reservations", l); ctx.stack_.push_back(l); ctx.enter(ctx.RESERVATIONS); @@ -860,7 +860,7 @@ not_empty_reservations_list: reservation ; reservation: LCURLY_BRACKET { - ElementPtr m(new MapElement()); + ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } reservation_params RCURLY_BRACKET { @@ -887,7 +887,7 @@ reservation_param: duid ; ip_addresses: IP_ADDRESSES { - ElementPtr l(new ListElement()); + ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("ip-addresses", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); @@ -897,7 +897,7 @@ ip_addresses: IP_ADDRESSES { }; prefixes: PREFIXES { - ElementPtr l(new ListElement()); + ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("prefixes", l); ctx.stack_.push_back(l); ctx.enter(ctx.NO_KEYWORD); @@ -909,7 +909,7 @@ prefixes: PREFIXES { duid: DUID { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr d(new StringElement($4)); + ElementPtr d(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("duid", d); ctx.leave(); }; @@ -917,7 +917,7 @@ duid: DUID { hw_address: HW_ADDRESS { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr hw(new StringElement($4)); + ElementPtr hw(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("hw-address", hw); ctx.leave(); }; @@ -925,13 +925,13 @@ hw_address: HW_ADDRESS { hostname: HOSTNAME { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr host(new StringElement($4)); + ElementPtr host(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("hostname", host); ctx.leave(); } reservation_client_classes: CLIENT_CLASSES { - ElementPtr c(new ListElement()); + ElementPtr c(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("client-classes", c); ctx.stack_.push_back(c); ctx.enter(ctx.NO_KEYWORD); @@ -944,7 +944,7 @@ reservation_client_classes: CLIENT_CLASSES { // --- client classes ---------------------------------------- client_classes: CLIENT_CLASSES { - ElementPtr l(new ListElement()); + ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("client-classes", l); ctx.stack_.push_back(l); ctx.enter(ctx.CLIENT_CLASSES); @@ -958,7 +958,7 @@ client_classes_list: client_class ; client_class: LCURLY_BRACKET { - ElementPtr m(new MapElement()); + ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } client_class_params RCURLY_BRACKET { @@ -984,7 +984,7 @@ client_class_name: name; client_class_test: TEST { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr test(new StringElement($4)); + ElementPtr test(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("test", test); ctx.leave(); } @@ -994,7 +994,7 @@ client_class_test: TEST { // --- server-id --------------------------------------------- server_id: SERVER_ID { - ElementPtr m(new MapElement()); + ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("server-id", m); ctx.stack_.push_back(m); ctx.enter(ctx.SERVER_ID); @@ -1017,32 +1017,32 @@ server_id_param: type ; htype: HTYPE COLON INTEGER { - ElementPtr htype(new IntElement($3)); + ElementPtr htype(new IntElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set("htype", htype); }; identifier: IDENTIFIER { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr id(new StringElement($4)); + ElementPtr id(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("identifier", id); ctx.leave(); }; time: TIME COLON INTEGER { - ElementPtr time(new IntElement($3)); + ElementPtr time(new IntElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set("time", time); }; enterprise_id: ENTERPRISE_ID COLON INTEGER { - ElementPtr time(new IntElement($3)); + ElementPtr time(new IntElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set("enterprise-id", time); }; // --- end of server-id -------------------------------------- dhcp4o6_port: DHCP4O6_PORT COLON INTEGER { - ElementPtr time(new IntElement($3)); + ElementPtr time(new IntElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set("dhcp4o6-port", time); }; @@ -1052,7 +1052,7 @@ dhcp4o6_port: DHCP4O6_PORT COLON INTEGER { // the following "Logging": { ... }. The ... is defined // by logging_params logging_object: LOGGING { - ElementPtr m(new MapElement()); + ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("Logging", m); ctx.stack_.push_back(m); ctx.enter(ctx.LOGGING); @@ -1074,7 +1074,7 @@ logging_param: loggers; // "loggers", the only parameter currently defined in "Logging" object, // is "Loggers": [ ... ]. loggers: LOGGERS { - ElementPtr l(new ListElement()); + ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("loggers", l); ctx.stack_.push_back(l); ctx.enter(ctx.LOGGERS); @@ -1091,7 +1091,7 @@ loggers_entries: logger_entry // This defines a single entry defined in loggers in Logging. logger_entry: LCURLY_BRACKET { - ElementPtr l(new MapElement()); + ElementPtr l(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->add(l); ctx.stack_.push_back(l); } logger_params RCURLY_BRACKET { @@ -1110,19 +1110,19 @@ logger_param: name ; debuglevel: DEBUGLEVEL COLON INTEGER { - ElementPtr dl(new IntElement($3)); + ElementPtr dl(new IntElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set("debuglevel", dl); }; severity: SEVERITY { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr sev(new StringElement($4)); + ElementPtr sev(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("severity", sev); ctx.leave(); }; output_options_list: OUTPUT_OPTIONS { - ElementPtr l(new ListElement()); + ElementPtr l(new ListElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("output_options", l); ctx.stack_.push_back(l); ctx.enter(ctx.OUTPUT_OPTIONS); @@ -1136,7 +1136,7 @@ output_options_list_content: output_entry ; output_entry: LCURLY_BRACKET { - ElementPtr m(new MapElement()); + ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->add(m); ctx.stack_.push_back(m); } output_params RCURLY_BRACKET { @@ -1150,13 +1150,13 @@ output_params: output_param output_param: OUTPUT { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr sev(new StringElement($4)); + ElementPtr sev(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("output", sev); ctx.leave(); }; dhcp_ddns: DHCP_DDNS { - ElementPtr m(new MapElement()); + ElementPtr m(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("dhcp-ddns", m); ctx.stack_.push_back(m); ctx.enter(ctx.DHCP_DDNS); @@ -1175,14 +1175,14 @@ dhcp_ddns_param: enable_updates ; enable_updates: ENABLE_UPDATES COLON BOOLEAN { - ElementPtr b(new BoolElement($3)); + ElementPtr b(new BoolElement($3, ctx.loc2pos(@3))); ctx.stack_.back()->set("enable-updates", b); }; qualifying_suffix: QUALIFYING_SUFFIX { ctx.enter(ctx.NO_KEYWORD); } COLON STRING { - ElementPtr qs(new StringElement($4)); + ElementPtr qs(new StringElement($4, ctx.loc2pos(@4))); ctx.stack_.back()->set("qualifying-suffix", qs); ctx.leave(); }; diff --git a/src/bin/dhcp6/parser_context.cc b/src/bin/dhcp6/parser_context.cc index 7bf69ecbb5..6b8459b847 100644 --- a/src/bin/dhcp6/parser_context.cc +++ b/src/bin/dhcp6/parser_context.cc @@ -85,6 +85,15 @@ Parser6Context::fatal (const std::string& what) isc_throw(Dhcp6ParseError, what); } +isc::data::Element::Position +Parser6Context::loc2pos(isc::dhcp::location& loc) +{ + const std::string& file = *loc.begin.filename; + const uint32_t line = loc.begin.line; + const uint32_t pos = loc.begin.column; + return (isc::data::Element::Position(file, line, pos)); +} + void Parser6Context::enter(const ParserContext& ctx) { diff --git a/src/bin/dhcp6/parser_context.h b/src/bin/dhcp6/parser_context.h index cafee4be90..60c26614b1 100644 --- a/src/bin/dhcp6/parser_context.h +++ b/src/bin/dhcp6/parser_context.h @@ -92,6 +92,12 @@ public: /// Used by YY_FATAL_ERROR macro so required to be static. static void fatal(const std::string& what); + /// @brief Convert position + /// + /// Convert a bison location into an element position + /// (take the begin, the end is lost) + isc::data::Element::Position loc2pos(isc::dhcp::location& loc); + /// @brief Defines syntactic contexts for lexical tie-ins typedef enum { /// at toplevel diff --git a/src/bin/dhcp6/tests/kea_controller_unittest.cc b/src/bin/dhcp6/tests/kea_controller_unittest.cc index 68a3f07c93..9f65ed2372 100644 --- a/src/bin/dhcp6/tests/kea_controller_unittest.cc +++ b/src/bin/dhcp6/tests/kea_controller_unittest.cc @@ -389,7 +389,7 @@ TEST_F(JSONFileBackendTest, recursiveInclude) { "}"; string include = "\"eth\", "; string msg = "configuration error using file '" + string(TEST_FILE) + - "': Too many nested include."; + "': Too many nested include."; writeFile(TEST_FILE, config_recursive_include); writeFile(TEST_INCLUDE, include);