Kea  2.1.7-git
master_lexer.h
Go to the documentation of this file.
1 // Copyright (C) 2012-2015 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 1
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 
19 namespace isc {
20 namespace dns {
21 namespace master_lexer_internal {
22 class State;
23 }
24 
39 class MasterToken {
40 public:
47  enum Type {
50  INITIAL_WS,
51  // for detecting it)
53  NOVALUE_TYPE_MAX = INITIAL_WS,
54  STRING,
60  };
61 
63  enum ErrorCode {
66  UNEXPECTED_END,
67  UNBALANCED_QUOTES,
69  NO_TOKEN_PRODUCED,
70  NUMBER_OUT_OF_RANGE,
74  MAX_ERROR_CODE
75  };
77 
95  struct StringRegion {
96  const char* beg;
97  size_t len;
98  };
99 
105  explicit MasterToken(Type type) : type_(type) {
106  if (type > NOVALUE_TYPE_MAX) {
107  isc_throw(InvalidParameter, "Token per-type constructor "
108  "called with invalid type: " << type);
109  }
110  }
111 
127  MasterToken(const char* str_beg, size_t str_len, bool quoted = false) :
128  type_(quoted ? QSTRING : STRING)
129  {
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 { return (type_); }
158 
164  const StringRegion& getStringRegion() const {
165  if (type_ != STRING && type_ != QSTRING) {
167  "Token::getStringRegion() for non string-variant type");
168  }
169  return (val_.str_region_);
170  }
171 
183  std::string getString() const {
184  std::string ret;
185  getString(ret);
186  return (ret);
187  }
188 
205  void getString(std::string& ret) const {
206  if (type_ != STRING && type_ != QSTRING) {
208  "Token::getString() for non string-variant type");
209  }
210  ret.assign(val_.str_region_.beg,
211  val_.str_region_.beg + val_.str_region_.len);
212  }
213 
218  uint32_t getNumber() const {
219  if (type_ != NUMBER) {
221  "Token::getNumber() for non number type");
222  }
223  return (val_.number_);
224  }
225 
231  if (type_ != ERROR) {
233  "Token::getErrorCode() for non error type");
234  }
235  return (val_.error_code_);
236  };
237 
247  std::string getErrorText() const;
248 
249 private:
250  Type type_; // this is not const so the class can be assignable
251 
252  // We use a union to represent different types of token values via the
253  // unified Token class. The class integrity should ensure valid operation
254  // on the union; getter methods should only refer to the member set at
255  // the construction.
256  union {
258  uint32_t number_;
260  } val_;
261 };
262 
301 class MasterLexer : public boost::noncopyable {
303 public:
306  class ReadError : public Unexpected {
307  public:
308  ReadError(const char* file, size_t line, const char* what) :
309  Unexpected(file, line, what)
310  {}
311  };
312 
321  public:
322  LexerError(const char* file, size_t line, MasterToken error_token) :
323  isc::dns::Exception(file, line, error_token.getErrorText().c_str()),
324  token_(error_token)
325  {}
327  };
328 
337  static const size_t SOURCE_SIZE_UNKNOWN;
338 
343  enum Options {
344  NONE = 0,
345  INITIAL_WS = 1,
346  QSTRING = 2,
348  NUMBER = 4
349  };
350 
354  MasterLexer();
355 
359  ~MasterLexer();
360 
385  bool pushSource(const char* filename, std::string* error = NULL);
386 
417  void pushSource(std::istream& input);
418 
431  void popSource();
432 
436  size_t getSourceCount() const;
437 
453  std::string getSourceName() const;
454 
469  size_t getSourceLine() const;
470 
497  size_t getTotalSourceSize() const;
498 
536  size_t getPosition() const;
537 
565  const MasterToken& getNextToken(Options options = NONE);
566 
637  const MasterToken& getNextToken(MasterToken::Type expect,
638  bool eol_ok = false);
639 
655  void ungetToken();
656 
657 private:
658  struct MasterLexerImpl;
659  MasterLexerImpl* impl_;
660 };
661 
668  return (static_cast<MasterLexer::Options>(
669  static_cast<unsigned>(o1) | static_cast<unsigned>(o2)));
670 }
671 
672 } // namespace dns
673 } // namespace isc
674 #endif // MASTER_LEXER_H
675 
676 // Local Variables:
677 // mode: c++
678 // End:
ErrorCode
Enumeration for lexer error codes.
Definition: master_lexer.h:63
MasterToken(uint32_t number)
Constructor for number type of token.
Definition: master_lexer.h:138
static const size_t SOURCE_SIZE_UNKNOWN
Special value for input source size meaning "unknown".
Definition: master_lexer.h:337
const char * beg
The start address of the string.
Definition: master_lexer.h:96
size_t len
The length of the string in bytes.
Definition: master_lexer.h:97
A generic exception that is thrown if a parameter given to a method or function is considered invalid...
ErrorCode getErrorCode() const
Return the error code of a error type token.
Definition: master_lexer.h:230
std::string getString() const
Return the value of a string-variant token as a string object.
Definition: master_lexer.h:183
Exception thrown from a wrapper version of MasterLexer::getNextToken() for non fatal errors...
Definition: master_lexer.h:320
The lexer is just initialized and has no token.
Definition: master_lexer.h:64
LexerError(const char *file, size_t line, MasterToken error_token)
Definition: master_lexer.h:322
End of line detected.
Definition: master_lexer.h:48
MasterToken(const char *str_beg, size_t str_len, bool quoted=false)
Constructor for string and quoted-string types of token.
Definition: master_lexer.h:127
Type getType() const
Return the token type.
Definition: master_lexer.h:157
End of file detected.
Definition: master_lexer.h:49
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
uint32_t getNumber() const
Return the value of a string-variant token as a string object.
Definition: master_lexer.h:218
Unbalanced parentheses detected.
Definition: master_lexer.h:65
StringRegion str_region_
Definition: master_lexer.h:257
A generic exception that is thrown when an unexpected error condition occurs.
Type
Enumeration for token types.
Definition: master_lexer.h:47
A single string quoted by double-quotes (").
Definition: master_lexer.h:57
Exception thrown when we fail to read from the input stream or file.
Definition: master_lexer.h:306
Number is expected but not recognized.
Definition: master_lexer.h:72
Defines the logger used by the top-level component of kea-lfc.
void getString(std::string &ret) const
Fill in a string with the value of a string-variant token.
Definition: master_lexer.h:205
A simple representation of a range of a string.
Definition: master_lexer.h:95
Options
Options for getNextToken.
Definition: master_lexer.h:343
A generic exception that is thrown if a function is called in a prohibited way.
Tokens for MasterLexer.
Definition: master_lexer.h:39
Tokenization state for MasterLexer.
A decimal number (unsigned 32-bit)
Definition: master_lexer.h:58
MasterToken(ErrorCode error_code)
Constructor for error type of token.
Definition: master_lexer.h:146
Unexpected quotes character detected.
Definition: master_lexer.h:73
const StringRegion & getStringRegion() const
Return the value of a string-variant token.
Definition: master_lexer.h:164
MasterLexer::Options operator|(MasterLexer::Options o1, MasterLexer::Options o2)
Operator to combine MasterLexer options.
Definition: master_lexer.h:667
ReadError(const char *file, size_t line, const char *what)
Definition: master_lexer.h:308
MasterToken(Type type)
Constructor for non-value type of token.
Definition: master_lexer.h:105
Tokenizer for parsing DNS master files.
Definition: master_lexer.h:301