dhcp6_lexer.ll 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694
  1. /* Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC")
  2. This Source Code Form is subject to the terms of the Mozilla Public
  3. License, v. 2.0. If a copy of the MPL was not distributed with this
  4. file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. %{ /* -*- C++ -*- */
  6. #include <cerrno>
  7. #include <climits>
  8. #include <cstdlib>
  9. #include <string>
  10. #include <dhcp6/parser_context.h>
  11. #include <asiolink/io_address.h>
  12. #include <boost/lexical_cast.hpp>
  13. #include <exceptions/exceptions.h>
  14. /* Please avoid C++ style comments (// ... eol) as they break flex 2.6.2 */
  15. /* Work around an incompatibility in flex (at least versions
  16. 2.5.31 through 2.5.33): it generates code that does
  17. not conform to C89. See Debian bug 333231
  18. <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>. */
  19. # undef yywrap
  20. # define yywrap() 1
  21. namespace {
  22. bool start_token_flag = false;
  23. isc::dhcp::Parser6Context::ParserType start_token_value;
  24. unsigned int comment_start_line = 0;
  25. };
  26. /* To avoid the call to exit... oops! */
  27. #define YY_FATAL_ERROR(msg) isc::dhcp::Parser6Context::fatal(msg)
  28. %}
  29. /* noyywrap disables automatic rewinding for the next file to parse. Since we
  30. always parse only a single string, there's no need to do any wraps. And
  31. using yywrap requires linking with -lfl, which provides the default yywrap
  32. implementation that always returns 1 anyway. */
  33. %option noyywrap
  34. /* nounput simplifies the lexer, by removing support for putting a character
  35. back into the input stream. We never use such capability anyway. */
  36. %option nounput
  37. /* batch means that we'll never use the generated lexer interactively. */
  38. %option batch
  39. /* avoid to get static global variables to remain with C++. */
  40. /* in last resort %option reentrant */
  41. /* Enables debug mode. To see the debug messages, one needs to also set
  42. yy_flex_debug to 1, then the debug messages will be printed on stderr. */
  43. %option debug
  44. /* I have no idea what this option does, except it was specified in the bison
  45. examples and Postgres folks added it to remove gcc 4.3 warnings. Let's
  46. be on the safe side and keep it. */
  47. %option noinput
  48. %x COMMENT
  49. %x DIR_ENTER DIR_INCLUDE DIR_EXIT
  50. /* These are not token expressions yet, just convenience expressions that
  51. can be used during actual token definitions. Note some can match
  52. incorrect inputs (e.g., IP addresses) which must be checked. */
  53. int \-?[0-9]+
  54. blank [ \t\r]
  55. UnicodeEscapeSequence u[0-9A-Fa-f]{4}
  56. JSONEscapeCharacter ["\\/bfnrt]
  57. JSONEscapeSequence {JSONEscapeCharacter}|{UnicodeEscapeSequence}
  58. JSONStandardCharacter [^\x00-\x1f"\\]
  59. JSONStringCharacter {JSONStandardCharacter}|\\{JSONEscapeSequence}
  60. JSONString \"{JSONStringCharacter}*\"
  61. /* for errors */
  62. BadUnicodeEscapeSequence u[0-9A-Fa-f]{0,3}[^0-9A-Fa-f]
  63. BadJSONEscapeSequence [^"\\/bfnrtu]|{BadUnicodeEscapeSequence}
  64. ControlCharacter [\x00-\x1f]
  65. ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
  66. %{
  67. /* This code run each time a pattern is matched. It updates the location
  68. by moving it ahead by yyleng bytes. yyleng specifies the length of the
  69. currently matched token. */
  70. #define YY_USER_ACTION driver.loc_.columns(yyleng);
  71. %}
  72. %%
  73. %{
  74. /* This part of the code is copied over to the verbatim to the top
  75. of the generated yylex function. Explanation:
  76. http://www.gnu.org/software/bison/manual/html_node/Multiple-start_002dsymbols.html */
  77. /* Code run each time yylex is called. */
  78. driver.loc_.step();
  79. if (start_token_flag) {
  80. start_token_flag = false;
  81. switch (start_token_value) {
  82. case Parser6Context::PARSER_JSON:
  83. default:
  84. return isc::dhcp::Dhcp6Parser::make_TOPLEVEL_JSON(driver.loc_);
  85. case Parser6Context::PARSER_DHCP6:
  86. return isc::dhcp::Dhcp6Parser::make_TOPLEVEL_DHCP6(driver.loc_);
  87. case Parser6Context::SUBPARSER_DHCP6:
  88. return isc::dhcp::Dhcp6Parser::make_SUB_DHCP6(driver.loc_);
  89. case Parser6Context::PARSER_INTERFACES:
  90. return isc::dhcp::Dhcp6Parser::make_SUB_INTERFACES6(driver.loc_);
  91. case Parser6Context::PARSER_SUBNET6:
  92. return isc::dhcp::Dhcp6Parser::make_SUB_SUBNET6(driver.loc_);
  93. case Parser6Context::PARSER_POOL6:
  94. return isc::dhcp::Dhcp6Parser::make_SUB_POOL6(driver.loc_);
  95. case Parser6Context::PARSER_PD_POOL:
  96. return isc::dhcp::Dhcp6Parser::make_SUB_PD_POOL(driver.loc_);
  97. case Parser6Context::PARSER_HOST_RESERVATION:
  98. return isc::dhcp::Dhcp6Parser::make_SUB_RESERVATION(driver.loc_);
  99. case Parser6Context::PARSER_OPTION_DEFS:
  100. return isc::dhcp::Dhcp6Parser::make_SUB_OPTION_DEFS(driver.loc_);
  101. case Parser6Context::PARSER_OPTION_DEF:
  102. return isc::dhcp::Dhcp6Parser::make_SUB_OPTION_DEF(driver.loc_);
  103. case Parser6Context::PARSER_OPTION_DATA:
  104. return isc::dhcp::Dhcp6Parser::make_SUB_OPTION_DATA(driver.loc_);
  105. case Parser6Context::PARSER_HOOKS_LIBRARY:
  106. return isc::dhcp::Dhcp6Parser::make_SUB_HOOKS_LIBRARY(driver.loc_);
  107. case Parser6Context::PARSER_DHCP_DDNS:
  108. return isc::dhcp::Dhcp6Parser::make_SUB_DHCP_DDNS(driver.loc_);
  109. }
  110. }
  111. %}
  112. #.* ;
  113. "//"(.*) ;
  114. "/*" {
  115. BEGIN(COMMENT);
  116. comment_start_line = driver.loc_.end.line;;
  117. }
  118. <COMMENT>"*/" BEGIN(INITIAL);
  119. <COMMENT>. ;
  120. <COMMENT><<EOF>> {
  121. isc_throw(Dhcp6ParseError, "Comment not closed. (/* in line " << comment_start_line);
  122. }
  123. "<?" BEGIN(DIR_ENTER);
  124. <DIR_ENTER>"include" BEGIN(DIR_INCLUDE);
  125. <DIR_INCLUDE>\"([^\"\n])+\" {
  126. /* Include directive. */
  127. /* Extract the filename. */
  128. std::string tmp(yytext+1);
  129. tmp.resize(tmp.size() - 1);
  130. driver.includeFile(tmp);
  131. }
  132. <DIR_ENTER,DIR_INCLUDE,DIR_EXIT><<EOF>> {
  133. isc_throw(Dhcp6ParseError, "Directive not closed.");
  134. }
  135. <DIR_EXIT>"?>" BEGIN(INITIAL);
  136. <*>{blank}+ {
  137. /* Ok, we found a with space. Let's ignore it and update loc variable. */
  138. driver.loc_.step();
  139. }
  140. <*>[\n]+ {
  141. /* Newline found. Let's update the location and continue. */
  142. driver.loc_.lines(yyleng);
  143. driver.loc_.step();
  144. }
  145. \"enable-updates\" {
  146. switch(driver.ctx_) {
  147. case isc::dhcp::Parser6Context::DHCP_DDNS:
  148. return isc::dhcp::Dhcp6Parser::make_ENABLE_UPDATES(driver.loc_);
  149. default:
  150. return isc::dhcp::Dhcp6Parser::make_STRING("enable-updates", driver.loc_);
  151. }
  152. }
  153. \"qualifying-suffix\" {
  154. switch(driver.ctx_) {
  155. case isc::dhcp::Parser6Context::DHCP_DDNS:
  156. return isc::dhcp::Dhcp6Parser::make_QUALIFYING_SUFFIX(driver.loc_);
  157. default:
  158. return isc::dhcp::Dhcp6Parser::make_STRING("qualifying-suffix", driver.loc_);
  159. }
  160. }
  161. \"server-ip\" {
  162. switch(driver.ctx_) {
  163. case isc::dhcp::Parser6Context::DHCP_DDNS:
  164. return isc::dhcp::Dhcp6Parser::make_SERVER_IP(driver.loc_);
  165. default:
  166. return isc::dhcp::Dhcp6Parser::make_STRING("server-ip", driver.loc_);
  167. }
  168. }
  169. \"server-port\" {
  170. switch(driver.ctx_) {
  171. case isc::dhcp::Parser6Context::DHCP_DDNS:
  172. return isc::dhcp::Dhcp6Parser::make_SERVER_PORT(driver.loc_);
  173. default:
  174. return isc::dhcp::Dhcp6Parser::make_STRING("server-port", driver.loc_);
  175. }
  176. }
  177. \"sender-ip\" {
  178. switch(driver.ctx_) {
  179. case isc::dhcp::Parser6Context::DHCP_DDNS:
  180. return isc::dhcp::Dhcp6Parser::make_SENDER_IP(driver.loc_);
  181. default:
  182. return isc::dhcp::Dhcp6Parser::make_STRING("sender-ip", driver.loc_);
  183. }
  184. }
  185. \"sender-port\" {
  186. switch(driver.ctx_) {
  187. case isc::dhcp::Parser6Context::DHCP_DDNS:
  188. return isc::dhcp::Dhcp6Parser::make_SENDER_PORT(driver.loc_);
  189. default:
  190. return isc::dhcp::Dhcp6Parser::make_STRING("sender-port", driver.loc_);
  191. }
  192. }
  193. \"max-queue-size\" {
  194. switch(driver.ctx_) {
  195. case isc::dhcp::Parser6Context::DHCP_DDNS:
  196. return isc::dhcp::Dhcp6Parser::make_MAX_QUEUE_SIZE(driver.loc_);
  197. default:
  198. return isc::dhcp::Dhcp6Parser::make_STRING("max-queue-size", driver.loc_);
  199. }
  200. }
  201. \"ncr-protocol\" {
  202. switch(driver.ctx_) {
  203. case isc::dhcp::Parser6Context::DHCP_DDNS:
  204. return isc::dhcp::Dhcp6Parser::make_NCR_PROTOCOL(driver.loc_);
  205. default:
  206. return isc::dhcp::Dhcp6Parser::make_STRING("ncr-protocol", driver.loc_);
  207. }
  208. }
  209. \"ncr-format\" {
  210. switch(driver.ctx_) {
  211. case isc::dhcp::Parser6Context::DHCP_DDNS:
  212. return isc::dhcp::Dhcp6Parser::make_NCR_FORMAT(driver.loc_);
  213. default:
  214. return isc::dhcp::Dhcp6Parser::make_STRING("ncr-format", driver.loc_);
  215. }
  216. }
  217. \"always-include-fqdn\" {
  218. switch(driver.ctx_) {
  219. case isc::dhcp::Parser6Context::DHCP_DDNS:
  220. return isc::dhcp::Dhcp6Parser::make_ALWAYS_INCLUDE_FQDN(driver.loc_);
  221. default:
  222. return isc::dhcp::Dhcp6Parser::make_STRING("always-include-fqdn", driver.loc_);
  223. }
  224. }
  225. \"override-no-update\" {
  226. switch(driver.ctx_) {
  227. case isc::dhcp::Parser6Context::DHCP_DDNS:
  228. return isc::dhcp::Dhcp6Parser::make_OVERRIDE_NO_UPDATE(driver.loc_);
  229. default:
  230. return isc::dhcp::Dhcp6Parser::make_STRING("override-no-update", driver.loc_);
  231. }
  232. }
  233. \"override-client-update\" {
  234. switch(driver.ctx_) {
  235. case isc::dhcp::Parser6Context::DHCP_DDNS:
  236. return isc::dhcp::Dhcp6Parser::make_OVERRIDE_CLIENT_UPDATE(driver.loc_);
  237. default:
  238. return isc::dhcp::Dhcp6Parser::make_STRING("override-client-update", driver.loc_);
  239. }
  240. }
  241. \"replace-client-name\" {
  242. switch(driver.ctx_) {
  243. case isc::dhcp::Parser6Context::DHCP_DDNS:
  244. return isc::dhcp::Dhcp6Parser::make_REPLACE_CLIENT_NAME(driver.loc_);
  245. default:
  246. return isc::dhcp::Dhcp6Parser::make_STRING("replace-client-name", driver.loc_);
  247. }
  248. }
  249. \"generated-prefix\" {
  250. switch(driver.ctx_) {
  251. case isc::dhcp::Parser6Context::DHCP_DDNS:
  252. return isc::dhcp::Dhcp6Parser::make_GENERATED_PREFIX(driver.loc_);
  253. default:
  254. return isc::dhcp::Dhcp6Parser::make_STRING("generated-prefix", driver.loc_);
  255. }
  256. }
  257. (?i:\"UDP\") {
  258. /* dhcp-ddns value keywords are case insensitive */
  259. if (driver.ctx_ == isc::dhcp::Parser6Context::NCR_PROTOCOL) {
  260. return isc::dhcp::Dhcp6Parser::make_UDP(driver.loc_);
  261. }
  262. std::string tmp(yytext+1);
  263. tmp.resize(tmp.size() - 1);
  264. return isc::dhcp::Dhcp6Parser::make_STRING(tmp, driver.loc_);
  265. }
  266. (?i:\"TCP\") {
  267. /* dhcp-ddns value keywords are case insensitive */
  268. if (driver.ctx_ == isc::dhcp::Parser6Context::NCR_PROTOCOL) {
  269. return isc::dhcp::Dhcp6Parser::make_TCP(driver.loc_);
  270. }
  271. std::string tmp(yytext+1);
  272. tmp.resize(tmp.size() - 1);
  273. return isc::dhcp::Dhcp6Parser::make_STRING(tmp, driver.loc_);
  274. }
  275. (?i:\"JSON\") {
  276. /* dhcp-ddns value keywords are case insensitive */
  277. if (driver.ctx_ == isc::dhcp::Parser6Context::NCR_FORMAT) {
  278. return isc::dhcp::Dhcp6Parser::make_JSON(driver.loc_);
  279. }
  280. std::string tmp(yytext+1);
  281. tmp.resize(tmp.size() - 1);
  282. return isc::dhcp::Dhcp6Parser::make_STRING(tmp, driver.loc_);
  283. }
  284. (?i:\"when-present\") {
  285. /* dhcp-ddns value keywords are case insensitive */
  286. if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) {
  287. return isc::dhcp::Dhcp6Parser::make_WHEN_PRESENT(driver.loc_);
  288. }
  289. std::string tmp(yytext+1);
  290. tmp.resize(tmp.size() - 1);
  291. return isc::dhcp::Dhcp6Parser::make_STRING(tmp, driver.loc_);
  292. }
  293. (?i:\"true\") {
  294. /* dhcp-ddns value keywords are case insensitive */
  295. if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) {
  296. return isc::dhcp::Dhcp6Parser::make_WHEN_PRESENT(driver.loc_);
  297. }
  298. std::string tmp(yytext+1);
  299. tmp.resize(tmp.size() - 1);
  300. return isc::dhcp::Dhcp6Parser::make_STRING(tmp, driver.loc_);
  301. }
  302. (?i:\"never\") {
  303. /* dhcp-ddns value keywords are case insensitive */
  304. if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) {
  305. return isc::dhcp::Dhcp6Parser::make_NEVER(driver.loc_);
  306. }
  307. std::string tmp(yytext+1);
  308. tmp.resize(tmp.size() - 1);
  309. return isc::dhcp::Dhcp6Parser::make_STRING(tmp, driver.loc_);
  310. }
  311. (?i:\"false\") {
  312. /* dhcp-ddns value keywords are case insensitive */
  313. if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) {
  314. return isc::dhcp::Dhcp6Parser::make_NEVER(driver.loc_);
  315. }
  316. std::string tmp(yytext+1);
  317. tmp.resize(tmp.size() - 1);
  318. return isc::dhcp::Dhcp6Parser::make_STRING(tmp, driver.loc_);
  319. }
  320. (?i:\"always\") {
  321. /* dhcp-ddns value keywords are case insensitive */
  322. if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) {
  323. return isc::dhcp::Dhcp6Parser::make_ALWAYS(driver.loc_);
  324. }
  325. std::string tmp(yytext+1);
  326. tmp.resize(tmp.size() - 1);
  327. return isc::dhcp::Dhcp6Parser::make_STRING(tmp, driver.loc_);
  328. }
  329. (?i:\"when-not-present\") {
  330. /* dhcp-ddns value keywords are case insensitive */
  331. if (driver.ctx_ == isc::dhcp::Parser6Context::REPLACE_CLIENT_NAME) {
  332. return isc::dhcp::Dhcp6Parser::make_WHEN_NOT_PRESENT(driver.loc_);
  333. }
  334. std::string tmp(yytext+1);
  335. tmp.resize(tmp.size() - 1);
  336. return isc::dhcp::Dhcp6Parser::make_STRING(tmp, driver.loc_);
  337. }
  338. \"Dhcp6\" {
  339. switch(driver.ctx_) {
  340. case isc::dhcp::Parser6Context::CONFIG:
  341. return isc::dhcp::Dhcp6Parser::make_DHCP6(driver.loc_);
  342. default:
  343. return isc::dhcp::Dhcp6Parser::make_STRING("Dhcp6", driver.loc_);
  344. }
  345. }
  346. \"interfaces-config\" {
  347. switch(driver.ctx_) {
  348. case isc::dhcp::Parser6Context::DHCP6:
  349. return isc::dhcp::Dhcp6Parser::make_INTERFACES_CONFIG(driver.loc_);
  350. default:
  351. return isc::dhcp::Dhcp6Parser::make_STRING("interfaces-config", driver.loc_);
  352. }
  353. }
  354. \"interfaces\" {
  355. switch(driver.ctx_) {
  356. case isc::dhcp::Parser6Context::INTERFACES_CONFIG:
  357. return isc::dhcp::Dhcp6Parser::make_INTERFACES(driver.loc_);
  358. default:
  359. return isc::dhcp::Dhcp6Parser::make_STRING("interfaces", driver.loc_);
  360. }
  361. }
  362. \"re-detect\" {
  363. switch(driver.ctx_) {
  364. case isc::dhcp::Parser6Context::INTERFACES_CONFIG:
  365. return isc::dhcp::Dhcp6Parser::make_RE_DETECT(driver.loc_);
  366. default:
  367. return isc::dhcp::Dhcp6Parser::make_STRING("re-detect", driver.loc_);
  368. }
  369. }
  370. \"lease-database\" {
  371. switch(driver.ctx_) {
  372. case isc::dhcp::Parser6Context::DHCP6:
  373. return isc::dhcp::Dhcp6Parser::make_LEASE_DATABASE(driver.loc_);
  374. default:
  375. return isc::dhcp::Dhcp6Parser::make_STRING("lease-database", driver.loc_);
  376. }
  377. }
  378. \"hosts-database\" {
  379. switch(driver.ctx_) {
  380. case isc::dhcp::Parser6Context::DHCP6:
  381. return isc::dhcp::Dhcp6Parser::make_HOSTS_DATABASE(driver.loc_);
  382. default:
  383. return isc::dhcp::Dhcp6Parser::make_STRING("hosts-database", driver.loc_);
  384. }
  385. }
  386. \"readonly\" {
  387. switch(driver.ctx_) {
  388. case isc::dhcp::Parser6Context::HOSTS_DATABASE:
  389. return isc::dhcp::Dhcp6Parser::make_READONLY(driver.loc_);
  390. default:
  391. return isc::dhcp::Dhcp6Parser::make_STRING("readonly", driver.loc_);
  392. }
  393. }
  394. \"type\" {
  395. switch(driver.ctx_) {
  396. case isc::dhcp::Parser6Context::LEASE_DATABASE:
  397. case isc::dhcp::Parser6Context::HOSTS_DATABASE:
  398. case isc::dhcp::Parser6Context::OPTION_DEF:
  399. case isc::dhcp::Parser6Context::SERVER_ID:
  400. return isc::dhcp::Dhcp6Parser::make_TYPE(driver.loc_);
  401. default:
  402. return isc::dhcp::Dhcp6Parser::make_STRING("type", driver.loc_);
  403. }
  404. }
  405. \"memfile\" {
  406. switch(driver.ctx_) {
  407. case isc::dhcp::Parser6Context::DATABASE_TYPE:
  408. return isc::dhcp::Dhcp6Parser::make_MEMFILE(driver.loc_);
  409. default:
  410. return isc::dhcp::Dhcp6Parser::make_STRING("memfile", driver.loc_);
  411. }
  412. }
  413. \"mysql\" {
  414. switch(driver.ctx_) {
  415. case isc::dhcp::Parser6Context::DATABASE_TYPE:
  416. return isc::dhcp::Dhcp6Parser::make_MYSQL(driver.loc_);
  417. default:
  418. return isc::dhcp::Dhcp6Parser::make_STRING("mysql", driver.loc_);
  419. }
  420. }
  421. \"postgresql\" {
  422. switch(driver.ctx_) {
  423. case isc::dhcp::Parser6Context::DATABASE_TYPE:
  424. return isc::dhcp::Dhcp6Parser::make_POSTGRESQL(driver.loc_);
  425. default:
  426. return isc::dhcp::Dhcp6Parser::make_STRING("postgresql", driver.loc_);
  427. }
  428. }
  429. \"cql\" {
  430. switch(driver.ctx_) {
  431. case isc::dhcp::Parser6Context::DATABASE_TYPE:
  432. return isc::dhcp::Dhcp6Parser::make_CQL(driver.loc_);
  433. default:
  434. return isc::dhcp::Dhcp6Parser::make_STRING("cql", driver.loc_);
  435. }
  436. }
  437. \"user\" {
  438. switch(driver.ctx_) {
  439. case isc::dhcp::Parser6Context::LEASE_DATABASE:
  440. case isc::dhcp::Parser6Context::HOSTS_DATABASE:
  441. return isc::dhcp::Dhcp6Parser::make_USER(driver.loc_);
  442. default:
  443. return isc::dhcp::Dhcp6Parser::make_STRING("user", driver.loc_);
  444. }
  445. }
  446. \"password\" {
  447. switch(driver.ctx_) {
  448. case isc::dhcp::Parser6Context::LEASE_DATABASE:
  449. case isc::dhcp::Parser6Context::HOSTS_DATABASE:
  450. return isc::dhcp::Dhcp6Parser::make_PASSWORD(driver.loc_);
  451. default:
  452. return isc::dhcp::Dhcp6Parser::make_STRING("password", driver.loc_);
  453. }
  454. }
  455. \"host\" {
  456. switch(driver.ctx_) {
  457. case isc::dhcp::Parser6Context::LEASE_DATABASE:
  458. case isc::dhcp::Parser6Context::HOSTS_DATABASE:
  459. return isc::dhcp::Dhcp6Parser::make_HOST(driver.loc_);
  460. default:
  461. return isc::dhcp::Dhcp6Parser::make_STRING("host", driver.loc_);
  462. }
  463. }
  464. \"port\" {
  465. switch(driver.ctx_) {
  466. case isc::dhcp::Parser6Context::LEASE_DATABASE:
  467. case isc::dhcp::Parser6Context::HOSTS_DATABASE:
  468. return isc::dhcp::Dhcp6Parser::make_PORT(driver.loc_);
  469. default:
  470. return isc::dhcp::Dhcp6Parser::make_STRING("port", driver.loc_);
  471. }
  472. }
  473. \"persist\" {
  474. switch(driver.ctx_) {
  475. case isc::dhcp::Parser6Context::LEASE_DATABASE:
  476. case isc::dhcp::Parser6Context::HOSTS_DATABASE:
  477. case isc::dhcp::Parser6Context::SERVER_ID:
  478. return isc::dhcp::Dhcp6Parser::make_PERSIST(driver.loc_);
  479. default:
  480. return isc::dhcp::Dhcp6Parser::make_STRING("persist", driver.loc_);
  481. }
  482. }
  483. \"lfc-interval\" {
  484. switch(driver.ctx_) {
  485. case isc::dhcp::Parser6Context::LEASE_DATABASE:
  486. case isc::dhcp::Parser6Context::HOSTS_DATABASE:
  487. return isc::dhcp::Dhcp6Parser::make_LFC_INTERVAL(driver.loc_);
  488. default:
  489. return isc::dhcp::Dhcp6Parser::make_STRING("lfc-interval", driver.loc_);
  490. }
  491. }
  492. \"connect-timeout\" {
  493. switch(driver.ctx_) {
  494. case isc::dhcp::Parser6Context::LEASE_DATABASE:
  495. case isc::dhcp::Parser6Context::HOSTS_DATABASE:
  496. return isc::dhcp::Dhcp6Parser::make_CONNECT_TIMEOUT(driver.loc_);
  497. default:
  498. return isc::dhcp::Dhcp6Parser::make_STRING("connect-timeout", driver.loc_);
  499. }
  500. }
  501. \"keyspace\" {
  502. switch(driver.ctx_) {
  503. case isc::dhcp::Parser6Context::LEASE_DATABASE:
  504. case isc::dhcp::Parser6Context::HOSTS_DATABASE:
  505. return isc::dhcp::Dhcp6Parser::make_KEYSPACE(driver.loc_);
  506. default:
  507. return isc::dhcp::Dhcp6Parser::make_STRING("keyspace", driver.loc_);
  508. }
  509. }
  510. \"contact-points\" {
  511. switch(driver.ctx_) {
  512. case isc::dhcp::Parser6Context::LEASE_DATABASE:
  513. case isc::dhcp::Parser6Context::HOSTS_DATABASE:
  514. return isc::dhcp::Dhcp6Parser::make_CONTACT_POINTS(driver.loc_);
  515. default:
  516. return isc::dhcp::Dhcp6Parser::make_STRING("contact-points", driver.loc_);
  517. }
  518. }
  519. \"preferred-lifetime\" {
  520. switch(driver.ctx_) {
  521. case isc::dhcp::Parser6Context::DHCP6:
  522. case isc::dhcp::Parser6Context::SUBNET6:
  523. return isc::dhcp::Dhcp6Parser::make_PREFERRED_LIFETIME(driver.loc_);
  524. default:
  525. return isc::dhcp::Dhcp6Parser::make_STRING("preferred-lifetime", driver.loc_);
  526. }
  527. }
  528. \"valid-lifetime\" {
  529. switch(driver.ctx_) {
  530. case isc::dhcp::Parser6Context::DHCP6:
  531. case isc::dhcp::Parser6Context::SUBNET6:
  532. return isc::dhcp::Dhcp6Parser::make_VALID_LIFETIME(driver.loc_);
  533. default:
  534. return isc::dhcp::Dhcp6Parser::make_STRING("valid-lifetime", driver.loc_);
  535. }
  536. }
  537. \"renew-timer\" {
  538. switch(driver.ctx_) {
  539. case isc::dhcp::Parser6Context::DHCP6:
  540. case isc::dhcp::Parser6Context::SUBNET6:
  541. return isc::dhcp::Dhcp6Parser::make_RENEW_TIMER(driver.loc_);
  542. default:
  543. return isc::dhcp::Dhcp6Parser::make_STRING("renew-timer", driver.loc_);
  544. }
  545. }
  546. \"rebind-timer\" {
  547. switch(driver.ctx_) {
  548. case isc::dhcp::Parser6Context::DHCP6:
  549. case isc::dhcp::Parser6Context::SUBNET6:
  550. return isc::dhcp::Dhcp6Parser::make_REBIND_TIMER(driver.loc_);
  551. default:
  552. return isc::dhcp::Dhcp6Parser::make_STRING("rebind-timer", driver.loc_);
  553. }
  554. }
  555. \"decline-probation-period\" {
  556. switch(driver.ctx_) {
  557. case isc::dhcp::Parser6Context::DHCP6:
  558. return isc::dhcp::Dhcp6Parser::make_DECLINE_PROBATION_PERIOD(driver.loc_);
  559. default:
  560. return isc::dhcp::Dhcp6Parser::make_STRING("decline-probation-period", driver.loc_);
  561. }
  562. }
  563. \"subnet6\" {
  564. switch(driver.ctx_) {
  565. case isc::dhcp::Parser6Context::DHCP6:
  566. return isc::dhcp::Dhcp6Parser::make_SUBNET6(driver.loc_);
  567. default:
  568. return isc::dhcp::Dhcp6Parser::make_STRING("subnet6", driver.loc_);
  569. }
  570. }
  571. \"option-def\" {
  572. switch(driver.ctx_) {
  573. case isc::dhcp::Parser6Context::DHCP6:
  574. return isc::dhcp::Dhcp6Parser::make_OPTION_DEF(driver.loc_);
  575. default:
  576. return isc::dhcp::Dhcp6Parser::make_STRING("option-def", driver.loc_);
  577. }
  578. }
  579. \"option-data\" {
  580. switch(driver.ctx_) {
  581. case isc::dhcp::Parser6Context::DHCP6:
  582. case isc::dhcp::Parser6Context::SUBNET6:
  583. case isc::dhcp::Parser6Context::POOLS:
  584. case isc::dhcp::Parser6Context::PD_POOLS:
  585. case isc::dhcp::Parser6Context::RESERVATIONS:
  586. case isc::dhcp::Parser6Context::CLIENT_CLASSES:
  587. case isc::dhcp::Parser6Context::CLIENT_CLASS:
  588. return isc::dhcp::Dhcp6Parser::make_OPTION_DATA(driver.loc_);
  589. default:
  590. return isc::dhcp::Dhcp6Parser::make_STRING("option-data", driver.loc_);
  591. }
  592. }
  593. \"name\" {
  594. switch(driver.ctx_) {
  595. case isc::dhcp::Parser6Context::LEASE_DATABASE:
  596. case isc::dhcp::Parser6Context::HOSTS_DATABASE:
  597. case isc::dhcp::Parser6Context::OPTION_DEF:
  598. case isc::dhcp::Parser6Context::OPTION_DATA:
  599. case isc::dhcp::Parser6Context::CLIENT_CLASSES:
  600. case isc::dhcp::Parser6Context::CLIENT_CLASS:
  601. case isc::dhcp::Parser6Context::LOGGERS:
  602. return isc::dhcp::Dhcp6Parser::make_NAME(driver.loc_);
  603. default:
  604. return isc::dhcp::Dhcp6Parser::make_STRING("name", driver.loc_);
  605. }
  606. }
  607. \"data\" {
  608. switch(driver.ctx_) {
  609. case isc::dhcp::Parser6Context::OPTION_DATA:
  610. return isc::dhcp::Dhcp6Parser::make_DATA(driver.loc_);
  611. default:
  612. return isc::dhcp::Dhcp6Parser::make_STRING("data", driver.loc_);
  613. }
  614. }
  615. \"always-send\" {
  616. switch(driver.ctx_) {
  617. case isc::dhcp::Parser6Context::OPTION_DATA:
  618. return isc::dhcp::Dhcp6Parser::make_ALWAYS_SEND(driver.loc_);
  619. default:
  620. return isc::dhcp::Dhcp6Parser::make_STRING("always-send", driver.loc_);
  621. }
  622. }
  623. \"pools\" {
  624. switch(driver.ctx_) {
  625. case isc::dhcp::Parser6Context::SUBNET6:
  626. return isc::dhcp::Dhcp6Parser::make_POOLS(driver.loc_);
  627. default:
  628. return isc::dhcp::Dhcp6Parser::make_STRING("pools", driver.loc_);
  629. }
  630. }
  631. \"pd-pools\" {
  632. switch(driver.ctx_) {
  633. case isc::dhcp::Parser6Context::SUBNET6:
  634. return isc::dhcp::Dhcp6Parser::make_PD_POOLS(driver.loc_);
  635. default:
  636. return isc::dhcp::Dhcp6Parser::make_STRING("pd-pools", driver.loc_);
  637. }
  638. }
  639. \"prefix\" {
  640. switch(driver.ctx_) {
  641. case isc::dhcp::Parser6Context::PD_POOLS:
  642. return isc::dhcp::Dhcp6Parser::make_PREFIX(driver.loc_);
  643. default:
  644. return isc::dhcp::Dhcp6Parser::make_STRING("prefix", driver.loc_);
  645. }
  646. }
  647. \"prefix-len\" {
  648. switch(driver.ctx_) {
  649. case isc::dhcp::Parser6Context::PD_POOLS:
  650. return isc::dhcp::Dhcp6Parser::make_PREFIX_LEN(driver.loc_);
  651. default:
  652. return isc::dhcp::Dhcp6Parser::make_STRING("prefix-len", driver.loc_);
  653. }
  654. }
  655. \"excluded-prefix\" {
  656. switch(driver.ctx_) {
  657. case isc::dhcp::Parser6Context::PD_POOLS:
  658. return isc::dhcp::Dhcp6Parser::make_EXCLUDED_PREFIX(driver.loc_);
  659. default:
  660. return isc::dhcp::Dhcp6Parser::make_STRING("excluded-prefix", driver.loc_);
  661. }
  662. }
  663. \"excluded-prefix-len\" {
  664. switch(driver.ctx_) {
  665. case isc::dhcp::Parser6Context::PD_POOLS:
  666. return isc::dhcp::Dhcp6Parser::make_EXCLUDED_PREFIX_LEN(driver.loc_);
  667. default:
  668. return isc::dhcp::Dhcp6Parser::make_STRING("excluded-prefix-len", driver.loc_);
  669. }
  670. }
  671. \"delegated-len\" {
  672. switch(driver.ctx_) {
  673. case isc::dhcp::Parser6Context::PD_POOLS:
  674. return isc::dhcp::Dhcp6Parser::make_DELEGATED_LEN(driver.loc_);
  675. default:
  676. return isc::dhcp::Dhcp6Parser::make_STRING("delegated-len", driver.loc_);
  677. }
  678. }
  679. \"pool\" {
  680. switch(driver.ctx_) {
  681. case isc::dhcp::Parser6Context::POOLS:
  682. return isc::dhcp::Dhcp6Parser::make_POOL(driver.loc_);
  683. default:
  684. return isc::dhcp::Dhcp6Parser::make_STRING("pool", driver.loc_);
  685. }
  686. }
  687. \"user-context\" {
  688. switch(driver.ctx_) {
  689. case isc::dhcp::Parser6Context::POOLS:
  690. case isc::dhcp::Parser6Context::PD_POOLS:
  691. return isc::dhcp::Dhcp6Parser::make_USER_CONTEXT(driver.loc_);
  692. default:
  693. return isc::dhcp::Dhcp6Parser::make_STRING("user-context", driver.loc_);
  694. }
  695. }
  696. \"subnet\" {
  697. switch(driver.ctx_) {
  698. case isc::dhcp::Parser6Context::SUBNET6:
  699. return isc::dhcp::Dhcp6Parser::make_SUBNET(driver.loc_);
  700. default:
  701. return isc::dhcp::Dhcp6Parser::make_STRING("subnet", driver.loc_);
  702. }
  703. }
  704. \"interface\" {
  705. switch(driver.ctx_) {
  706. case isc::dhcp::Parser6Context::SUBNET6:
  707. return isc::dhcp::Dhcp6Parser::make_INTERFACE(driver.loc_);
  708. default:
  709. return isc::dhcp::Dhcp6Parser::make_STRING("interface", driver.loc_);
  710. }
  711. }
  712. \"interface-id\" {
  713. switch(driver.ctx_) {
  714. case isc::dhcp::Parser6Context::SUBNET6:
  715. return isc::dhcp::Dhcp6Parser::make_INTERFACE_ID(driver.loc_);
  716. default:
  717. return isc::dhcp::Dhcp6Parser::make_STRING("interface-id", driver.loc_);
  718. }
  719. }
  720. \"id\" {
  721. switch(driver.ctx_) {
  722. case isc::dhcp::Parser6Context::SUBNET6:
  723. return isc::dhcp::Dhcp6Parser::make_ID(driver.loc_);
  724. default:
  725. return isc::dhcp::Dhcp6Parser::make_STRING("id", driver.loc_);
  726. }
  727. }
  728. \"rapid-commit\" {
  729. switch(driver.ctx_) {
  730. case isc::dhcp::Parser6Context::SUBNET6:
  731. return isc::dhcp::Dhcp6Parser::make_RAPID_COMMIT(driver.loc_);
  732. default:
  733. return isc::dhcp::Dhcp6Parser::make_STRING("rapid-commit", driver.loc_);
  734. }
  735. }
  736. \"reservation-mode\" {
  737. switch(driver.ctx_) {
  738. case isc::dhcp::Parser6Context::SUBNET6:
  739. return isc::dhcp::Dhcp6Parser::make_RESERVATION_MODE(driver.loc_);
  740. default:
  741. return isc::dhcp::Dhcp6Parser::make_STRING("reservation-mode", driver.loc_);
  742. }
  743. }
  744. \"disabled\" {
  745. switch(driver.ctx_) {
  746. case isc::dhcp::Parser6Context::RESERVATION_MODE:
  747. return isc::dhcp::Dhcp6Parser::make_DISABLED(driver.loc_);
  748. default:
  749. return isc::dhcp::Dhcp6Parser::make_STRING("disabled", driver.loc_);
  750. }
  751. }
  752. \"off\" {
  753. switch(driver.ctx_) {
  754. case isc::dhcp::Parser6Context::RESERVATION_MODE:
  755. return isc::dhcp::Dhcp6Parser::make_DISABLED(driver.loc_);
  756. default:
  757. return isc::dhcp::Dhcp6Parser::make_STRING("off", driver.loc_);
  758. }
  759. }
  760. \"out-of-pool\" {
  761. switch(driver.ctx_) {
  762. case isc::dhcp::Parser6Context::RESERVATION_MODE:
  763. return isc::dhcp::Dhcp6Parser::make_OUT_OF_POOL(driver.loc_);
  764. default:
  765. return isc::dhcp::Dhcp6Parser::make_STRING("out-of-pool", driver.loc_);
  766. }
  767. }
  768. \"all\" {
  769. switch(driver.ctx_) {
  770. case isc::dhcp::Parser6Context::RESERVATION_MODE:
  771. return isc::dhcp::Dhcp6Parser::make_ALL(driver.loc_);
  772. default:
  773. return isc::dhcp::Dhcp6Parser::make_STRING("all", driver.loc_);
  774. }
  775. }
  776. \"code\" {
  777. switch(driver.ctx_) {
  778. case isc::dhcp::Parser6Context::OPTION_DEF:
  779. case isc::dhcp::Parser6Context::OPTION_DATA:
  780. return isc::dhcp::Dhcp6Parser::make_CODE(driver.loc_);
  781. default:
  782. return isc::dhcp::Dhcp6Parser::make_STRING("code", driver.loc_);
  783. }
  784. }
  785. \"mac-sources\" {
  786. switch(driver.ctx_) {
  787. case isc::dhcp::Parser6Context::DHCP6:
  788. return isc::dhcp::Dhcp6Parser::make_MAC_SOURCES(driver.loc_);
  789. default:
  790. return isc::dhcp::Dhcp6Parser::make_STRING("mac-sources", driver.loc_);
  791. }
  792. }
  793. \"relay-supplied-options\" {
  794. switch(driver.ctx_) {
  795. case isc::dhcp::Parser6Context::DHCP6:
  796. return isc::dhcp::Dhcp6Parser::make_RELAY_SUPPLIED_OPTIONS(driver.loc_);
  797. default:
  798. return isc::dhcp::Dhcp6Parser::make_STRING("relay-supplied-options", driver.loc_);
  799. }
  800. }
  801. \"host-reservation-identifiers\" {
  802. switch(driver.ctx_) {
  803. case isc::dhcp::Parser6Context::DHCP6:
  804. return isc::dhcp::Dhcp6Parser::make_HOST_RESERVATION_IDENTIFIERS(driver.loc_);
  805. default:
  806. return isc::dhcp::Dhcp6Parser::make_STRING("host-reservation-identifiers", driver.loc_);
  807. }
  808. }
  809. \"Logging\" {
  810. switch(driver.ctx_) {
  811. case isc::dhcp::Parser6Context::CONFIG:
  812. return isc::dhcp::Dhcp6Parser::make_LOGGING(driver.loc_);
  813. default:
  814. return isc::dhcp::Dhcp6Parser::make_STRING("Logging", driver.loc_);
  815. }
  816. }
  817. \"loggers\" {
  818. switch(driver.ctx_) {
  819. case isc::dhcp::Parser6Context::LOGGING:
  820. return isc::dhcp::Dhcp6Parser::make_LOGGERS(driver.loc_);
  821. default:
  822. return isc::dhcp::Dhcp6Parser::make_STRING("loggers", driver.loc_);
  823. }
  824. }
  825. \"output_options\" {
  826. switch(driver.ctx_) {
  827. case isc::dhcp::Parser6Context::LOGGERS:
  828. return isc::dhcp::Dhcp6Parser::make_OUTPUT_OPTIONS(driver.loc_);
  829. default:
  830. return isc::dhcp::Dhcp6Parser::make_STRING("output_options", driver.loc_);
  831. }
  832. }
  833. \"output\" {
  834. switch(driver.ctx_) {
  835. case isc::dhcp::Parser6Context::OUTPUT_OPTIONS:
  836. return isc::dhcp::Dhcp6Parser::make_OUTPUT(driver.loc_);
  837. default:
  838. return isc::dhcp::Dhcp6Parser::make_STRING("output", driver.loc_);
  839. }
  840. }
  841. \"flush\" {
  842. switch(driver.ctx_) {
  843. case isc::dhcp::Parser6Context::OUTPUT_OPTIONS:
  844. return isc::dhcp::Dhcp6Parser::make_FLUSH(driver.loc_);
  845. default:
  846. return isc::dhcp::Dhcp6Parser::make_STRING("flush", driver.loc_);
  847. }
  848. }
  849. \"maxsize\" {
  850. switch(driver.ctx_) {
  851. case isc::dhcp::Parser6Context::OUTPUT_OPTIONS:
  852. return isc::dhcp::Dhcp6Parser::make_MAXSIZE(driver.loc_);
  853. default:
  854. return isc::dhcp::Dhcp6Parser::make_STRING("maxsize", driver.loc_);
  855. }
  856. }
  857. \"maxver\" {
  858. switch(driver.ctx_) {
  859. case isc::dhcp::Parser6Context::OUTPUT_OPTIONS:
  860. return isc::dhcp::Dhcp6Parser::make_MAXVER(driver.loc_);
  861. default:
  862. return isc::dhcp::Dhcp6Parser::make_STRING("maxver", driver.loc_);
  863. }
  864. }
  865. \"debuglevel\" {
  866. switch(driver.ctx_) {
  867. case isc::dhcp::Parser6Context::LOGGERS:
  868. return isc::dhcp::Dhcp6Parser::make_DEBUGLEVEL(driver.loc_);
  869. default:
  870. return isc::dhcp::Dhcp6Parser::make_STRING("debuglevel", driver.loc_);
  871. }
  872. }
  873. \"severity\" {
  874. switch(driver.ctx_) {
  875. case isc::dhcp::Parser6Context::LOGGERS:
  876. return isc::dhcp::Dhcp6Parser::make_SEVERITY(driver.loc_);
  877. default:
  878. return isc::dhcp::Dhcp6Parser::make_STRING("severity", driver.loc_);
  879. }
  880. }
  881. \"client-classes\" {
  882. switch(driver.ctx_) {
  883. case isc::dhcp::Parser6Context::DHCP6:
  884. case isc::dhcp::Parser6Context::RESERVATIONS:
  885. return isc::dhcp::Dhcp6Parser::make_CLIENT_CLASSES(driver.loc_);
  886. default:
  887. return isc::dhcp::Dhcp6Parser::make_STRING("client-classes", driver.loc_);
  888. }
  889. }
  890. \"client-class\" {
  891. switch(driver.ctx_) {
  892. case isc::dhcp::Parser6Context::SUBNET6:
  893. case isc::dhcp::Parser6Context::CLIENT_CLASSES:
  894. return isc::dhcp::Dhcp6Parser::make_CLIENT_CLASS(driver.loc_);
  895. default:
  896. return isc::dhcp::Dhcp6Parser::make_STRING("client-class", driver.loc_);
  897. }
  898. }
  899. \"test\" {
  900. switch(driver.ctx_) {
  901. case isc::dhcp::Parser6Context::CLIENT_CLASSES:
  902. case isc::dhcp::Parser6Context::CLIENT_CLASS:
  903. return isc::dhcp::Dhcp6Parser::make_TEST(driver.loc_);
  904. default:
  905. return isc::dhcp::Dhcp6Parser::make_STRING("test", driver.loc_);
  906. }
  907. }
  908. \"reservations\" {
  909. switch(driver.ctx_) {
  910. case isc::dhcp::Parser6Context::SUBNET6:
  911. return isc::dhcp::Dhcp6Parser::make_RESERVATIONS(driver.loc_);
  912. default:
  913. return isc::dhcp::Dhcp6Parser::make_STRING("reservations", driver.loc_);
  914. }
  915. }
  916. \"ip-addresses\" {
  917. switch(driver.ctx_) {
  918. case isc::dhcp::Parser6Context::RESERVATIONS:
  919. return isc::dhcp::Dhcp6Parser::make_IP_ADDRESSES(driver.loc_);
  920. default:
  921. return isc::dhcp::Dhcp6Parser::make_STRING("ip-addresses", driver.loc_);
  922. }
  923. }
  924. \"prefixes\" {
  925. switch(driver.ctx_) {
  926. case isc::dhcp::Parser6Context::RESERVATIONS:
  927. return isc::dhcp::Dhcp6Parser::make_PREFIXES(driver.loc_);
  928. default:
  929. return isc::dhcp::Dhcp6Parser::make_STRING("prefixes", driver.loc_);
  930. }
  931. }
  932. \"duid\" {
  933. switch(driver.ctx_) {
  934. case isc::dhcp::Parser6Context::MAC_SOURCES:
  935. case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS:
  936. case isc::dhcp::Parser6Context::RESERVATIONS:
  937. return isc::dhcp::Dhcp6Parser::make_DUID(driver.loc_);
  938. default:
  939. return isc::dhcp::Dhcp6Parser::make_STRING("duid", driver.loc_);
  940. }
  941. }
  942. \"hw-address\" {
  943. switch(driver.ctx_) {
  944. case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS:
  945. case isc::dhcp::Parser6Context::RESERVATIONS:
  946. return isc::dhcp::Dhcp6Parser::make_HW_ADDRESS(driver.loc_);
  947. default:
  948. return isc::dhcp::Dhcp6Parser::make_STRING("hw-address", driver.loc_);
  949. }
  950. }
  951. \"hostname\" {
  952. switch(driver.ctx_) {
  953. case isc::dhcp::Parser6Context::RESERVATIONS:
  954. return isc::dhcp::Dhcp6Parser::make_HOSTNAME(driver.loc_);
  955. default:
  956. return isc::dhcp::Dhcp6Parser::make_STRING("hostname", driver.loc_);
  957. }
  958. }
  959. \"flex-id\" {
  960. switch(driver.ctx_) {
  961. case isc::dhcp::Parser6Context::HOST_RESERVATION_IDENTIFIERS:
  962. case isc::dhcp::Parser6Context::RESERVATIONS:
  963. return isc::dhcp::Dhcp6Parser::make_FLEX_ID(driver.loc_);
  964. default:
  965. return isc::dhcp::Dhcp6Parser::make_STRING("flex-id", driver.loc_);
  966. }
  967. }
  968. \"space\" {
  969. switch(driver.ctx_) {
  970. case isc::dhcp::Parser6Context::OPTION_DEF:
  971. case isc::dhcp::Parser6Context::OPTION_DATA:
  972. return isc::dhcp::Dhcp6Parser::make_SPACE(driver.loc_);
  973. default:
  974. return isc::dhcp::Dhcp6Parser::make_STRING("space", driver.loc_);
  975. }
  976. }
  977. \"csv-format\" {
  978. switch(driver.ctx_) {
  979. case isc::dhcp::Parser6Context::OPTION_DATA:
  980. return isc::dhcp::Dhcp6Parser::make_CSV_FORMAT(driver.loc_);
  981. default:
  982. return isc::dhcp::Dhcp6Parser::make_STRING("csv-format", driver.loc_);
  983. }
  984. }
  985. \"record-types\" {
  986. switch(driver.ctx_) {
  987. case isc::dhcp::Parser6Context::OPTION_DEF:
  988. return isc::dhcp::Dhcp6Parser::make_RECORD_TYPES(driver.loc_);
  989. default:
  990. return isc::dhcp::Dhcp6Parser::make_STRING("record-types", driver.loc_);
  991. }
  992. }
  993. \"encapsulate\" {
  994. switch(driver.ctx_) {
  995. case isc::dhcp::Parser6Context::OPTION_DEF:
  996. return isc::dhcp::Dhcp6Parser::make_ENCAPSULATE(driver.loc_);
  997. default:
  998. return isc::dhcp::Dhcp6Parser::make_STRING("encapsulate", driver.loc_);
  999. }
  1000. }
  1001. \"array\" {
  1002. switch(driver.ctx_) {
  1003. case isc::dhcp::Parser6Context::OPTION_DEF:
  1004. return isc::dhcp::Dhcp6Parser::make_ARRAY(driver.loc_);
  1005. default:
  1006. return isc::dhcp::Dhcp6Parser::make_STRING("array", driver.loc_);
  1007. }
  1008. }
  1009. \"relay\" {
  1010. switch(driver.ctx_) {
  1011. case isc::dhcp::Parser6Context::SUBNET6:
  1012. return isc::dhcp::Dhcp6Parser::make_RELAY(driver.loc_);
  1013. default:
  1014. return isc::dhcp::Dhcp6Parser::make_STRING("relay", driver.loc_);
  1015. }
  1016. }
  1017. \"ip-address\" {
  1018. switch(driver.ctx_) {
  1019. case isc::dhcp::Parser6Context::RELAY:
  1020. return isc::dhcp::Dhcp6Parser::make_IP_ADDRESS(driver.loc_);
  1021. default:
  1022. return isc::dhcp::Dhcp6Parser::make_STRING("ip-address", driver.loc_);
  1023. }
  1024. }
  1025. \"hooks-libraries\" {
  1026. switch(driver.ctx_) {
  1027. case isc::dhcp::Parser6Context::DHCP6:
  1028. return isc::dhcp::Dhcp6Parser::make_HOOKS_LIBRARIES(driver.loc_);
  1029. default:
  1030. return isc::dhcp::Dhcp6Parser::make_STRING("hooks-libraries", driver.loc_);
  1031. }
  1032. }
  1033. \"parameters\" {
  1034. switch(driver.ctx_) {
  1035. case isc::dhcp::Parser6Context::HOOKS_LIBRARIES:
  1036. return isc::dhcp::Dhcp6Parser::make_PARAMETERS(driver.loc_);
  1037. default:
  1038. return isc::dhcp::Dhcp6Parser::make_STRING("parameters", driver.loc_);
  1039. }
  1040. }
  1041. \"library\" {
  1042. switch(driver.ctx_) {
  1043. case isc::dhcp::Parser6Context::HOOKS_LIBRARIES:
  1044. return isc::dhcp::Dhcp6Parser::make_LIBRARY(driver.loc_);
  1045. default:
  1046. return isc::dhcp::Dhcp6Parser::make_STRING("library", driver.loc_);
  1047. }
  1048. }
  1049. \"server-id\" {
  1050. switch(driver.ctx_) {
  1051. case isc::dhcp::Parser6Context::DHCP6:
  1052. return isc::dhcp::Dhcp6Parser::make_SERVER_ID(driver.loc_);
  1053. default:
  1054. return isc::dhcp::Dhcp6Parser::make_STRING("server-id", driver.loc_);
  1055. }
  1056. }
  1057. \"LLT\" {
  1058. switch(driver.ctx_) {
  1059. case isc::dhcp::Parser6Context::DUID_TYPE:
  1060. return isc::dhcp::Dhcp6Parser::make_LLT(driver.loc_);
  1061. default:
  1062. return isc::dhcp::Dhcp6Parser::make_STRING("LLT", driver.loc_);
  1063. }
  1064. }
  1065. \"EN\" {
  1066. switch(driver.ctx_) {
  1067. case isc::dhcp::Parser6Context::DUID_TYPE:
  1068. return isc::dhcp::Dhcp6Parser::make_EN(driver.loc_);
  1069. default:
  1070. return isc::dhcp::Dhcp6Parser::make_STRING("EN", driver.loc_);
  1071. }
  1072. }
  1073. \"LL\" {
  1074. switch(driver.ctx_) {
  1075. case isc::dhcp::Parser6Context::DUID_TYPE:
  1076. return isc::dhcp::Dhcp6Parser::make_LL(driver.loc_);
  1077. default:
  1078. return isc::dhcp::Dhcp6Parser::make_STRING("LL", driver.loc_);
  1079. }
  1080. }
  1081. \"identifier\" {
  1082. switch(driver.ctx_) {
  1083. case isc::dhcp::Parser6Context::SERVER_ID:
  1084. return isc::dhcp::Dhcp6Parser::make_IDENTIFIER(driver.loc_);
  1085. default:
  1086. return isc::dhcp::Dhcp6Parser::make_STRING("identifier", driver.loc_);
  1087. }
  1088. }
  1089. \"htype\" {
  1090. switch(driver.ctx_) {
  1091. case isc::dhcp::Parser6Context::SERVER_ID:
  1092. return isc::dhcp::Dhcp6Parser::make_HTYPE(driver.loc_);
  1093. default:
  1094. return isc::dhcp::Dhcp6Parser::make_STRING("htype", driver.loc_);
  1095. }
  1096. }
  1097. \"time\" {
  1098. switch(driver.ctx_) {
  1099. case isc::dhcp::Parser6Context::SERVER_ID:
  1100. return isc::dhcp::Dhcp6Parser::make_TIME(driver.loc_);
  1101. default:
  1102. return isc::dhcp::Dhcp6Parser::make_STRING("time", driver.loc_);
  1103. }
  1104. }
  1105. \"enterprise-id\" {
  1106. switch(driver.ctx_) {
  1107. case isc::dhcp::Parser6Context::SERVER_ID:
  1108. return isc::dhcp::Dhcp6Parser::make_ENTERPRISE_ID(driver.loc_);
  1109. default:
  1110. return isc::dhcp::Dhcp6Parser::make_STRING("enterprise-id", driver.loc_);
  1111. }
  1112. }
  1113. \"expired-leases-processing\" {
  1114. switch(driver.ctx_) {
  1115. case isc::dhcp::Parser6Context::DHCP6:
  1116. return isc::dhcp::Dhcp6Parser::make_EXPIRED_LEASES_PROCESSING(driver.loc_);
  1117. default:
  1118. return isc::dhcp::Dhcp6Parser::make_STRING("expired-leases-processing", driver.loc_);
  1119. }
  1120. }
  1121. \"reclaim-timer-wait-time\" {
  1122. switch(driver.ctx_) {
  1123. case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
  1124. return isc::dhcp::Dhcp6Parser::make_RECLAIM_TIMER_WAIT_TIME(driver.loc_);
  1125. default:
  1126. return isc::dhcp::Dhcp6Parser::make_STRING("reclaim-timer-wait-time", driver.loc_);
  1127. }
  1128. }
  1129. \"flush-reclaimed-timer-wait-time\" {
  1130. switch(driver.ctx_) {
  1131. case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
  1132. return isc::dhcp::Dhcp6Parser::make_FLUSH_RECLAIMED_TIMER_WAIT_TIME(driver.loc_);
  1133. default:
  1134. return isc::dhcp::Dhcp6Parser::make_STRING("flush-reclaimed-timer-wait-time", driver.loc_);
  1135. }
  1136. }
  1137. \"hold-reclaimed-time\" {
  1138. switch(driver.ctx_) {
  1139. case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
  1140. return isc::dhcp::Dhcp6Parser::make_HOLD_RECLAIMED_TIME(driver.loc_);
  1141. default:
  1142. return isc::dhcp::Dhcp6Parser::make_STRING("hold-reclaimed-time", driver.loc_);
  1143. }
  1144. }
  1145. \"max-reclaim-leases\" {
  1146. switch(driver.ctx_) {
  1147. case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
  1148. return isc::dhcp::Dhcp6Parser::make_MAX_RECLAIM_LEASES(driver.loc_);
  1149. default:
  1150. return isc::dhcp::Dhcp6Parser::make_STRING("max-reclaim-leases", driver.loc_);
  1151. }
  1152. }
  1153. \"max-reclaim-time\" {
  1154. switch(driver.ctx_) {
  1155. case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
  1156. return isc::dhcp::Dhcp6Parser::make_MAX_RECLAIM_TIME(driver.loc_);
  1157. default:
  1158. return isc::dhcp::Dhcp6Parser::make_STRING("max-reclaim-time", driver.loc_);
  1159. }
  1160. }
  1161. \"unwarned-reclaim-cycles\" {
  1162. switch(driver.ctx_) {
  1163. case isc::dhcp::Parser6Context::EXPIRED_LEASES_PROCESSING:
  1164. return isc::dhcp::Dhcp6Parser::make_UNWARNED_RECLAIM_CYCLES(driver.loc_);
  1165. default:
  1166. return isc::dhcp::Dhcp6Parser::make_STRING("unwarned-reclaim-cycles", driver.loc_);
  1167. }
  1168. }
  1169. \"dhcp4o6-port\" {
  1170. switch(driver.ctx_) {
  1171. case isc::dhcp::Parser6Context::DHCP6:
  1172. return isc::dhcp::Dhcp6Parser::make_DHCP4O6_PORT(driver.loc_);
  1173. default:
  1174. return isc::dhcp::Dhcp6Parser::make_STRING("dhcp4o6-port", driver.loc_);
  1175. }
  1176. }
  1177. \"control-socket\" {
  1178. switch(driver.ctx_) {
  1179. case isc::dhcp::Parser6Context::DHCP6:
  1180. return isc::dhcp::Dhcp6Parser::make_CONTROL_SOCKET(driver.loc_);
  1181. default:
  1182. return isc::dhcp::Dhcp6Parser::make_STRING("control-socket", driver.loc_);
  1183. }
  1184. }
  1185. \"socket-type\" {
  1186. switch(driver.ctx_) {
  1187. case isc::dhcp::Parser6Context::CONTROL_SOCKET:
  1188. return isc::dhcp::Dhcp6Parser::make_SOCKET_TYPE(driver.loc_);
  1189. default:
  1190. return isc::dhcp::Dhcp6Parser::make_STRING("socket-type", driver.loc_);
  1191. }
  1192. }
  1193. \"socket-name\" {
  1194. switch(driver.ctx_) {
  1195. case isc::dhcp::Parser6Context::CONTROL_SOCKET:
  1196. return isc::dhcp::Dhcp6Parser::make_SOCKET_NAME(driver.loc_);
  1197. default:
  1198. return isc::dhcp::Dhcp6Parser::make_STRING("socket-name", driver.loc_);
  1199. }
  1200. }
  1201. \"dhcp-ddns\" {
  1202. switch(driver.ctx_) {
  1203. case isc::dhcp::Parser6Context::DHCP6:
  1204. return isc::dhcp::Dhcp6Parser::make_DHCP_DDNS(driver.loc_);
  1205. default:
  1206. return isc::dhcp::Dhcp6Parser::make_STRING("dhcp-ddns", driver.loc_);
  1207. }
  1208. }
  1209. \"Dhcp4\" {
  1210. switch(driver.ctx_) {
  1211. case isc::dhcp::Parser6Context::CONFIG:
  1212. return isc::dhcp::Dhcp6Parser::make_DHCP4(driver.loc_);
  1213. default:
  1214. return isc::dhcp::Dhcp6Parser::make_STRING("Dhcp4", driver.loc_);
  1215. }
  1216. }
  1217. \"DhcpDdns\" {
  1218. switch(driver.ctx_) {
  1219. case isc::dhcp::Parser6Context::CONFIG:
  1220. return isc::dhcp::Dhcp6Parser::make_DHCPDDNS(driver.loc_);
  1221. default:
  1222. return isc::dhcp::Dhcp6Parser::make_STRING("DhcpDdns", driver.loc_);
  1223. }
  1224. }
  1225. \"Control-agent\" {
  1226. switch(driver.ctx_) {
  1227. case isc::dhcp::Parser6Context::CONFIG:
  1228. return isc::dhcp::Dhcp6Parser::make_CONTROL_AGENT(driver.loc_);
  1229. default:
  1230. return isc::dhcp::Dhcp6Parser::make_STRING("Control-agent", driver.loc_);
  1231. }
  1232. }
  1233. {JSONString} {
  1234. /* A string has been matched. It contains the actual string and single quotes.
  1235. We need to get those quotes out of the way and just use its content, e.g.
  1236. for 'foo' we should get foo */
  1237. std::string raw(yytext+1);
  1238. size_t len = raw.size() - 1;
  1239. raw.resize(len);
  1240. std::string decoded;
  1241. decoded.reserve(len);
  1242. for (size_t pos = 0; pos < len; ++pos) {
  1243. int b = 0;
  1244. char c = raw[pos];
  1245. switch (c) {
  1246. case '"':
  1247. /* impossible condition */
  1248. driver.error(driver.loc_, "Bad quote in \"" + raw + "\"");
  1249. case '\\':
  1250. ++pos;
  1251. if (pos >= len) {
  1252. /* impossible condition */
  1253. driver.error(driver.loc_, "Overflow escape in \"" + raw + "\"");
  1254. }
  1255. c = raw[pos];
  1256. switch (c) {
  1257. case '"':
  1258. case '\\':
  1259. case '/':
  1260. decoded.push_back(c);
  1261. break;
  1262. case 'b':
  1263. decoded.push_back('\b');
  1264. break;
  1265. case 'f':
  1266. decoded.push_back('\f');
  1267. break;
  1268. case 'n':
  1269. decoded.push_back('\n');
  1270. break;
  1271. case 'r':
  1272. decoded.push_back('\r');
  1273. break;
  1274. case 't':
  1275. decoded.push_back('\t');
  1276. break;
  1277. case 'u':
  1278. /* support only \u0000 to \u00ff */
  1279. ++pos;
  1280. if (pos + 4 > len) {
  1281. /* impossible condition */
  1282. driver.error(driver.loc_,
  1283. "Overflow unicode escape in \"" + raw + "\"");
  1284. }
  1285. if ((raw[pos] != '0') || (raw[pos + 1] != '0')) {
  1286. driver.error(driver.loc_, "Unsupported unicode escape in \"" + raw + "\"");
  1287. }
  1288. pos += 2;
  1289. c = raw[pos];
  1290. if ((c >= '0') && (c <= '9')) {
  1291. b = (c - '0') << 4;
  1292. } else if ((c >= 'A') && (c <= 'F')) {
  1293. b = (c - 'A' + 10) << 4;
  1294. } else if ((c >= 'a') && (c <= 'f')) {
  1295. b = (c - 'a' + 10) << 4;
  1296. } else {
  1297. /* impossible condition */
  1298. driver.error(driver.loc_, "Not hexadecimal in unicode escape in \"" + raw + "\"");
  1299. }
  1300. pos++;
  1301. c = raw[pos];
  1302. if ((c >= '0') && (c <= '9')) {
  1303. b |= c - '0';
  1304. } else if ((c >= 'A') && (c <= 'F')) {
  1305. b |= c - 'A' + 10;
  1306. } else if ((c >= 'a') && (c <= 'f')) {
  1307. b |= c - 'a' + 10;
  1308. } else {
  1309. /* impossible condition */
  1310. driver.error(driver.loc_, "Not hexadecimal in unicode escape in \"" + raw + "\"");
  1311. }
  1312. decoded.push_back(static_cast<char>(b & 0xff));
  1313. break;
  1314. default:
  1315. /* impossible condition */
  1316. driver.error(driver.loc_, "Bad escape in \"" + raw + "\"");
  1317. }
  1318. break;
  1319. default:
  1320. if ((c >= 0) && (c < 0x20)) {
  1321. /* impossible condition */
  1322. driver.error(driver.loc_, "Invalid control in \"" + raw + "\"");
  1323. }
  1324. decoded.push_back(c);
  1325. }
  1326. }
  1327. return isc::dhcp::Dhcp6Parser::make_STRING(decoded, driver.loc_);
  1328. }
  1329. \"{JSONStringCharacter}*{ControlCharacter}{ControlCharacterFill}*\" {
  1330. /* Bad string with a forbidden control character inside */
  1331. driver.error(driver.loc_, "Invalid control in " + std::string(yytext));
  1332. }
  1333. \"{JSONStringCharacter}*\\{BadJSONEscapeSequence}[^\x00-\x1f"]*\" {
  1334. /* Bad string with a bad escape inside */
  1335. driver.error(driver.loc_, "Bad escape in " + std::string(yytext));
  1336. }
  1337. \"{JSONStringCharacter}*\\\" {
  1338. /* Bad string with an open escape at the end */
  1339. driver.error(driver.loc_, "Overflow escape in " + std::string(yytext));
  1340. }
  1341. "[" { return isc::dhcp::Dhcp6Parser::make_LSQUARE_BRACKET(driver.loc_); }
  1342. "]" { return isc::dhcp::Dhcp6Parser::make_RSQUARE_BRACKET(driver.loc_); }
  1343. "{" { return isc::dhcp::Dhcp6Parser::make_LCURLY_BRACKET(driver.loc_); }
  1344. "}" { return isc::dhcp::Dhcp6Parser::make_RCURLY_BRACKET(driver.loc_); }
  1345. "," { return isc::dhcp::Dhcp6Parser::make_COMMA(driver.loc_); }
  1346. ":" { return isc::dhcp::Dhcp6Parser::make_COLON(driver.loc_); }
  1347. {int} {
  1348. /* An integer was found. */
  1349. std::string tmp(yytext);
  1350. int64_t integer = 0;
  1351. try {
  1352. /* In substring we want to use negative values (e.g. -1).
  1353. In enterprise-id we need to use values up to 0xffffffff.
  1354. To cover both of those use cases, we need at least
  1355. int64_t. */
  1356. integer = boost::lexical_cast<int64_t>(tmp);
  1357. } catch (const boost::bad_lexical_cast &) {
  1358. driver.error(driver.loc_, "Failed to convert " + tmp + " to an integer.");
  1359. }
  1360. /* The parser needs the string form as double conversion is no lossless */
  1361. return isc::dhcp::Dhcp6Parser::make_INTEGER(integer, driver.loc_);
  1362. }
  1363. [-+]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)? {
  1364. /* A floating point was found. */
  1365. std::string tmp(yytext);
  1366. double fp = 0.0;
  1367. try {
  1368. fp = boost::lexical_cast<double>(tmp);
  1369. } catch (const boost::bad_lexical_cast &) {
  1370. driver.error(driver.loc_, "Failed to convert " + tmp + " to a floating point.");
  1371. }
  1372. return isc::dhcp::Dhcp6Parser::make_FLOAT(fp, driver.loc_);
  1373. }
  1374. true|false {
  1375. string tmp(yytext);
  1376. return isc::dhcp::Dhcp6Parser::make_BOOLEAN(tmp == "true", driver.loc_);
  1377. }
  1378. null {
  1379. return isc::dhcp::Dhcp6Parser::make_NULL_TYPE(driver.loc_);
  1380. }
  1381. (?i:true) driver.error (driver.loc_, "JSON true reserved keyword is lower case only");
  1382. (?i:false) driver.error (driver.loc_, "JSON false reserved keyword is lower case only");
  1383. (?i:null) driver.error (driver.loc_, "JSON null reserved keyword is lower case only");
  1384. <*>. driver.error (driver.loc_, "Invalid character: " + std::string(yytext));
  1385. <<EOF>> {
  1386. if (driver.states_.empty()) {
  1387. return isc::dhcp::Dhcp6Parser::make_END(driver.loc_);
  1388. }
  1389. driver.loc_ = driver.locs_.back();
  1390. driver.locs_.pop_back();
  1391. driver.file_ = driver.files_.back();
  1392. driver.files_.pop_back();
  1393. if (driver.sfile_) {
  1394. fclose(driver.sfile_);
  1395. driver.sfile_ = 0;
  1396. }
  1397. if (!driver.sfiles_.empty()) {
  1398. driver.sfile_ = driver.sfiles_.back();
  1399. driver.sfiles_.pop_back();
  1400. }
  1401. parser6__delete_buffer(YY_CURRENT_BUFFER);
  1402. parser6__switch_to_buffer(driver.states_.back());
  1403. driver.states_.pop_back();
  1404. BEGIN(DIR_EXIT);
  1405. }
  1406. %%
  1407. using namespace isc::dhcp;
  1408. void
  1409. Parser6Context::scanStringBegin(const std::string& str, ParserType parser_type)
  1410. {
  1411. start_token_flag = true;
  1412. start_token_value = parser_type;
  1413. file_ = "<string>";
  1414. sfile_ = 0;
  1415. loc_.initialize(&file_);
  1416. yy_flex_debug = trace_scanning_;
  1417. YY_BUFFER_STATE buffer;
  1418. buffer = parser6__scan_bytes(str.c_str(), str.size());
  1419. if (!buffer) {
  1420. fatal("cannot scan string");
  1421. /* fatal() throws an exception so this can't be reached */
  1422. }
  1423. }
  1424. void
  1425. Parser6Context::scanFileBegin(FILE * f,
  1426. const std::string& filename,
  1427. ParserType parser_type)
  1428. {
  1429. start_token_flag = true;
  1430. start_token_value = parser_type;
  1431. file_ = filename;
  1432. sfile_ = f;
  1433. loc_.initialize(&file_);
  1434. yy_flex_debug = trace_scanning_;
  1435. YY_BUFFER_STATE buffer;
  1436. /* See dhcp6_lexer.cc header for available definitions */
  1437. buffer = parser6__create_buffer(f, 65536 /*buffer size*/);
  1438. if (!buffer) {
  1439. fatal("cannot scan file " + filename);
  1440. }
  1441. parser6__switch_to_buffer(buffer);
  1442. }
  1443. void
  1444. Parser6Context::scanEnd() {
  1445. if (sfile_)
  1446. fclose(sfile_);
  1447. sfile_ = 0;
  1448. static_cast<void>(parser6_lex_destroy());
  1449. /* Close files */
  1450. while (!sfiles_.empty()) {
  1451. FILE* f = sfiles_.back();
  1452. if (f) {
  1453. fclose(f);
  1454. }
  1455. sfiles_.pop_back();
  1456. }
  1457. /* Delete states */
  1458. while (!states_.empty()) {
  1459. parser6__delete_buffer(states_.back());
  1460. states_.pop_back();
  1461. }
  1462. }
  1463. void
  1464. Parser6Context::includeFile(const std::string& filename) {
  1465. if (states_.size() > 10) {
  1466. fatal("Too many nested include.");
  1467. }
  1468. FILE* f = fopen(filename.c_str(), "r");
  1469. if (!f) {
  1470. fatal("Can't open include file " + filename);
  1471. }
  1472. if (sfile_) {
  1473. sfiles_.push_back(sfile_);
  1474. }
  1475. sfile_ = f;
  1476. states_.push_back(YY_CURRENT_BUFFER);
  1477. YY_BUFFER_STATE buffer;
  1478. buffer = parser6__create_buffer(f, 65536 /*buffer size*/);
  1479. if (!buffer) {
  1480. fatal( "Can't scan include file " + filename);
  1481. }
  1482. parser6__switch_to_buffer(buffer);
  1483. files_.push_back(file_);
  1484. file_ = filename;
  1485. locs_.push_back(loc_);
  1486. loc_.initialize(&file_);
  1487. BEGIN(INITIAL);
  1488. }
  1489. namespace {
  1490. /** To avoid unused function error */
  1491. class Dummy {
  1492. /* cppcheck-suppress unusedPrivateFunction */
  1493. void dummy() { yy_fatal_error("Fix me: how to disable its definition?"); }
  1494. };
  1495. }