Kea 2.7.5
master_lexer.h
Go to the documentation of this file.
1// Copyright (C) 2012-2024 Internet Systems Consortium, Inc. ("ISC")
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7#ifndef MASTER_LEXER_H
8#define MASTER_LEXER_H
9
10#include <dns/exceptions.h>
11
12#include <istream>
13#include <string>
14
15#include <stdint.h>
16
17#include <boost/noncopyable.hpp>
18#include <boost/shared_ptr.hpp>
19
20namespace isc {
21namespace dns {
22namespace master_lexer_internal {
23class State;
24}
25
41public:
62
78
96 struct StringRegion {
97 const char* beg;
98 size_t len;
99 };
100
106 explicit MasterToken(Type type) : type_(type) {
107 if (type > NOVALUE_TYPE_MAX) {
108 isc_throw(InvalidParameter, "Token per-type constructor "
109 "called with invalid type: " << type);
110 }
111 }
112
128 MasterToken(const char* str_beg, size_t str_len, bool quoted = false) :
129 type_(quoted ? QSTRING : STRING) {
130 val_.str_region_.beg = str_beg;
131 val_.str_region_.len = str_len;
132 }
133
138 explicit MasterToken(uint32_t number) : type_(NUMBER) {
139 val_.number_ = number;
140 }
141
146 explicit MasterToken(ErrorCode error_code) : type_(ERROR) {
147 if (!(error_code < MAX_ERROR_CODE)) {
148 isc_throw(InvalidParameter, "Invalid master lexer error code: "
149 << error_code);
150 }
151 val_.error_code_ = error_code;
152 }
153
157 Type getType() const {
158 return (type_);
159 }
160
167 if (type_ != STRING && type_ != QSTRING) {
169 "Token::getStringRegion() for non string-variant type");
170 }
171 return (val_.str_region_);
172 }
173
185 std::string getString() const {
186 std::string ret;
187 getString(ret);
188 return (ret);
189 }
190
207 void getString(std::string& ret) const {
208 if (type_ != STRING && type_ != QSTRING) {
210 "Token::getString() for non string-variant type");
211 }
212 ret.assign(val_.str_region_.beg,
213 val_.str_region_.beg + val_.str_region_.len);
214 }
215
220 uint32_t getNumber() const {
221 if (type_ != NUMBER) {
223 "Token::getNumber() for non number type");
224 }
225 return (val_.number_);
226 }
227
233 if (type_ != ERROR) {
235 "Token::getErrorCode() for non error type");
236 }
237 return (val_.error_code_);
238 };
239
249 std::string getErrorText() const;
250
251private:
252 Type type_; // this is not const so the class can be assignable
253
254 // We use a union to represent different types of token values via the
255 // unified Token class. The class integrity should ensure valid operation
256 // on the union; getter methods should only refer to the member set at
257 // the construction.
258 union {
260 uint32_t number_;
262 } val_;
263};
264
303class MasterLexer : public boost::noncopyable {
305public:
308 class ReadError : public Unexpected {
309 public:
310 ReadError(const char* file, size_t line, const char* what) :
311 Unexpected(file, line, what)
312 {}
313 };
314
323 public:
324 LexerError(const char* file, size_t line, MasterToken error_token) :
325 isc::dns::Exception(file, line, error_token.getErrorText().c_str()),
326 token_(error_token)
327 {}
329 };
330
339 static const size_t SOURCE_SIZE_UNKNOWN;
340
345 enum Options {
346 NONE = 0,
347 INITIAL_WS = 1,
350 NUMBER = 4
351 };
352
357
362
387 bool pushSource(const char* filename, std::string* error = 0);
388
419 void pushSource(std::istream& input);
420
433 void popSource();
434
438 size_t getSourceCount() const;
439
455 std::string getSourceName() const;
456
471 size_t getSourceLine() const;
472
499 size_t getTotalSourceSize() const;
500
538 size_t getPosition() const;
539
568
640 bool eol_ok = false);
641
658
659private:
660 struct MasterLexerImpl;
661 boost::shared_ptr<MasterLexerImpl> impl_;
662};
663
670 return (static_cast<MasterLexer::Options>(
671 static_cast<unsigned>(o1) | static_cast<unsigned>(o2)));
672}
673
674} // namespace dns
675} // namespace isc
676#endif // MASTER_LEXER_H
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
A generic exception that is thrown if a function is called in a prohibited way.
A generic exception that is thrown if a parameter given to a method or function is considered invalid...
A generic exception that is thrown when an unexpected error condition occurs.
Exception thrown from a wrapper version of MasterLexer::getNextToken() for non fatal errors.
LexerError(const char *file, size_t line, MasterToken error_token)
Exception thrown when we fail to read from the input stream or file.
ReadError(const char *file, size_t line, const char *what)
Tokenizer for parsing DNS master files.
Options
Options for getNextToken.
@ QSTRING
recognize quoted string
@ NUMBER
recognize numeric text as integer
@ INITIAL_WS
recognize begin-of-line spaces after an end-of-line
MasterLexer()
The constructor.
void ungetToken()
Return the last token back to the lexer.
size_t getSourceCount() const
Get number of sources inside the lexer.
bool pushSource(const char *filename, std::string *error=0)
Open a file and make it the current input source of MasterLexer.
size_t getTotalSourceSize() const
Return the total size of pushed sources.
std::string getSourceName() const
Return the name of the current input source name.
const MasterToken & getNextToken(Options options=NONE)
Parse and return another token from the input.
const MasterToken & getNextToken(MasterToken::Type expect, bool eol_ok=false)
Parse the input for the expected type of token.
size_t getPosition() const
Return the position of lexer in the pushed sources so far.
void popSource()
Stop using the most recently opened input source (file or stream).
void pushSource(std::istream &input)
Make the given stream the current input source of MasterLexer.
~MasterLexer()
The destructor.
static const size_t SOURCE_SIZE_UNKNOWN
Special value for input source size meaning "unknown".
size_t getSourceLine() const
Return the input source line number.
Tokens for MasterLexer.
MasterToken(ErrorCode error_code)
Constructor for error type of token.
ErrorCode getErrorCode() const
Return the error code of a error type token.
ErrorCode
Enumeration for lexer error codes.
@ NO_TOKEN_PRODUCED
No token was produced.
@ UNEXPECTED_END
The lexer reaches the end of line or file unexpectedly.
@ BAD_NUMBER
Number is expected but not recognized.
@ NOT_STARTED
The lexer is just initialized and has no token.
@ MAX_ERROR_CODE
Max integer corresponding to valid error codes.
@ NUMBER_OUT_OF_RANGE
Number was out of range.
@ UNBALANCED_PAREN
Unbalanced parentheses detected.
@ UNBALANCED_QUOTES
Unbalanced quotations detected.
@ UNEXPECTED_QUOTES
Unexpected quotes character detected.
MasterToken(const char *str_beg, size_t str_len, bool quoted=false)
Constructor for string and quoted-string types of token.
uint32_t getNumber() const
Return the value of a string-variant token as a string object.
StringRegion str_region_
void getString(std::string &ret) const
Fill in a string with the value of a string-variant token.
std::string getString() const
Return the value of a string-variant token as a string object.
Type
Enumeration for token types.
@ INITIAL_WS
White spaces at the beginning of a line after an end of line or at the beginning of file (if asked.
@ NOVALUE_TYPE_MAX
Max integer corresponding to no-value (type only) types.
@ ERROR
Error detected in getting a token.
@ NUMBER
A decimal number (unsigned 32-bit)
@ END_OF_LINE
End of line detected.
@ STRING
A single string.
@ QSTRING
A single string quoted by double-quotes (").
@ END_OF_FILE
End of file detected.
Type getType() const
Return the token type.
const StringRegion & getStringRegion() const
Return the value of a string-variant token.
MasterToken(uint32_t number)
Constructor for number type of token.
std::string getErrorText() const
Return a textual description of the error of a error type token.
MasterToken(Type type)
Constructor for non-value type of token.
Tokenization state for MasterLexer.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
MasterLexer::Options operator|(MasterLexer::Options o1, MasterLexer::Options o2)
Operator to combine MasterLexer options.
Defines the logger used by the top-level component of kea-lfc.
A simple representation of a range of a string.
size_t len
The length of the string in bytes.
const char * beg
The start address of the string.