parser_context.h 3.44 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// Copyright (C) 2015-2016 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

#ifndef PARSER_CONTEXT_H
#define PARSER_CONTEXT_H
#include <string>
#include <map>
#include <vector>
#include <dhcp6/dhcp6_parser.h>
#include <dhcp6/parser_context_decl.h>
#include <exceptions/exceptions.h>

// Tell Flex the lexer's prototype ...
17
#define YY_DECL isc::dhcp::Dhcp6Parser::symbol_type parser6_lex (Parser6Context& driver)
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

// ... and declare it for the parser's sake.
YY_DECL;

namespace isc {
namespace dhcp {

/// @brief Evaluation error exception raised when trying to parse an axceptions.
class EvalParseError : public isc::Exception {
public:
    EvalParseError(const char* file, size_t line, const char* what) :
        isc::Exception(file, line, what) { };
};


/// @brief Evaluation context, an interface to the expression evaluation.
class Parser6Context
{
public:
37

38 39 40 41 42
    /// @brief Defines currently support the content supported
    typedef enum {
        PARSER_DHCP6, // This will parse the content as DHCP6 config
        PARSER_GENERIC_JSON // This will parse the content as generic JSON
    } ParserType;
43

44 45 46 47 48 49 50
    /// @brief Default constructor.
    Parser6Context();

    /// @brief destructor
    virtual ~Parser6Context();

    /// @brief JSON elements being parsed.
51
    std::vector<isc::data::ElementPtr> stack_;
52 53

    /// @brief Method called before scanning starts on a string.
54
    void scanStringBegin(const std::string& str, ParserType type);
55 56 57 58

    /// @brief Method called after the last tokens are scanned from a string.
    void scanStringEnd();

59
    /// @brief Method called before scanning starts on a file.
Francis Dupont's avatar
Francis Dupont committed
60
    void scanFileBegin(FILE * f, const std::string& filename, ParserType type);
61 62

    /// @brief Method called after the last tokens are scanned from a file.
63 64
    void scanFileEnd(FILE * f);

Francis Dupont's avatar
Francis Dupont committed
65 66 67
    /// @brief Divert input to an include file.
    static void includeFile(const std::string& filename);

68 69
    /// @brief Run the parser on the string specified.
    ///
70 71
    /// @param str string to be parsed
    /// @param parser_type specifies expected content (either DHCP6 or generic JSON)
72
    /// @return true on success.
73 74
    isc::data::ConstElementPtr parseString(const std::string& str,
                                           ParserType parser_type);
75

76
    /// @brief Run the parser on the file specified.
77 78
    isc::data::ConstElementPtr parseFile(const std::string& filename,
                                         ParserType parser_type);
79

80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
    /// @brief Error handler
    ///
    /// @param loc location within the parsed file when experienced a problem.
    /// @param what string explaining the nature of the error.
    static void error(const isc::dhcp::location& loc, const std::string& what);

    /// @brief Error handler
    ///
    /// This is a simplified error reporting tool for possible future
    /// cases when the EvalParser is not able to handle the packet.
    static void error(const std::string& what);

    /// @brief Fatal error handler
    ///
    /// This is for should not happen but fatal errors
    static void fatal(const std::string& what);

 private:
    /// @brief Flag determining scanner debugging.
    bool trace_scanning_;

    /// @brief Flag determing parser debugging.
    bool trace_parsing_;
};

}; // end of isc::eval namespace
}; // end of isc namespace

#endif