1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 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 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
/*
* Copyright (C) 2020 Linux Studio Plugins Project <https://lsp-plug.in/>
* (C) 2020 Vladimir Sadovnikov <sadko4u@gmail.com>
*
* This file is part of lsp-runtime-lib
* Created on: 14 окт. 2019 г.
*
* lsp-runtime-lib is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* lsp-runtime-lib is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with lsp-runtime-lib. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef LSP_PLUG_IN_FMT_JSON_TOKENIZER_H_
#define LSP_PLUG_IN_FMT_JSON_TOKENIZER_H_
#include <lsp-plug.in/runtime/version.h>
#include <lsp-plug.in/runtime/LSPString.h>
#include <lsp-plug.in/io/IInSequence.h>
#include <lsp-plug.in/fmt/json/token.h>
namespace lsp
{
namespace json
{
class Tokenizer
{
private:
Tokenizer & operator = (const Tokenizer &);
friend class Serializer;
protected:
io::IInSequence *pIn;
lsp_swchar_t cCurrent;
token_t enToken;
LSPString sValue;
union
{
double fValue;
ssize_t iValue;
};
status_t nError;
size_t nUnget;
size_t nIoSize;
size_t nIoOffset;
bool bEscaping; // Escaping mode
lsp_wchar_t *pIoBuf;
protected:
lsp_swchar_t skip_whitespace();
status_t fill_buffer();
lsp_swchar_t get_char();
inline lsp_swchar_t lookup();
token_t commit(token_t token);
inline token_t skip(token_t token) { cCurrent = -1; return enToken = token; }
lsp_swchar_t commit_lookup(token_t token);
inline token_t set_error(status_t code);
static bool is_reserved_word(const LSPString *text);
static bool is_valid_identifier(const LSPString *text);
static bool is_identifier_start(lsp_wchar_t ch);
static bool is_identifier(lsp_wchar_t ch);
static bool parse_digit(int *digit, lsp_wchar_t ch, int radix);
token_t parse_string(token_t type);
token_t parse_identifier();
token_t parse_single_line_comment();
token_t parse_multiline_comment();
token_t parse_number();
public:
explicit Tokenizer(io::IInSequence *in);
virtual ~Tokenizer();
public:
/**
* Get token
* @param get force token lookup
* @return current token value
*/
token_t get_token(bool get);
/**
* Unget token
*/
inline void unget() { ++nUnget; };
/**
* Get current token
* @return current token
*/
inline token_t current() const { return enToken; }
/**
* Get current token value for tokens that consist of characters
* @return current token value
*/
inline const LSPString *text_value() const { return &sValue; }
/**
* Get floating-point value of the token
* @return floating-point value of the token
*/
inline const double float_value() const { return fValue; }
/**
* Get integer value of the token
* @return integer value of the token
*/
inline ssize_t int_value() const { return iValue; }
/**
* Get last error code
* @return last error code
*/
inline status_t error() const { return nError; }
};
} /* namespace json */
} /* namespace lsp */
#endif /* LSP_PLUG_IN_FMT_JSON_TOKENIZER_H_ */
|