diff --git a/include/chaiscript/language/chaiscript_parser.hpp b/include/chaiscript/language/chaiscript_parser.hpp index 6cec512..bd18a6d 100644 --- a/include/chaiscript/language/chaiscript_parser.hpp +++ b/include/chaiscript/language/chaiscript_parser.hpp @@ -58,11 +58,6 @@ namespace chaiscript class ChaiScript_Parser { - static constexpr const char * const m_multiline_comment_begin = "/*"; - static constexpr const char * const m_multiline_comment_end = "*/"; - static constexpr const char * const m_singleline_comment = "//"; - - static std::array, detail::max_alphabet> build_alphabet() { std::array, detail::max_alphabet> alphabet = {}; @@ -71,55 +66,55 @@ namespace chaiscript alpha.fill(false); } - alphabet[detail::symbol_alphabet][static_cast('?')]=true; - alphabet[detail::symbol_alphabet][static_cast('+')]=true; - alphabet[detail::symbol_alphabet][static_cast('-')]=true; - alphabet[detail::symbol_alphabet][static_cast('*')]=true; - alphabet[detail::symbol_alphabet][static_cast('/')]=true; - alphabet[detail::symbol_alphabet][static_cast('|')]=true; - alphabet[detail::symbol_alphabet][static_cast('&')]=true; - alphabet[detail::symbol_alphabet][static_cast('^')]=true; - alphabet[detail::symbol_alphabet][static_cast('=')]=true; - alphabet[detail::symbol_alphabet][static_cast('.')]=true; - alphabet[detail::symbol_alphabet][static_cast('<')]=true; - alphabet[detail::symbol_alphabet][static_cast('>')]=true; + alphabet[detail::symbol_alphabet][static_cast('?')]=true; + alphabet[detail::symbol_alphabet][static_cast('+')]=true; + alphabet[detail::symbol_alphabet][static_cast('-')]=true; + alphabet[detail::symbol_alphabet][static_cast('*')]=true; + alphabet[detail::symbol_alphabet][static_cast('/')]=true; + alphabet[detail::symbol_alphabet][static_cast('|')]=true; + alphabet[detail::symbol_alphabet][static_cast('&')]=true; + alphabet[detail::symbol_alphabet][static_cast('^')]=true; + alphabet[detail::symbol_alphabet][static_cast('=')]=true; + alphabet[detail::symbol_alphabet][static_cast('.')]=true; + alphabet[detail::symbol_alphabet][static_cast('<')]=true; + alphabet[detail::symbol_alphabet][static_cast('>')]=true; - for ( int c = 'a' ; c <= 'z' ; ++c ) { alphabet[detail::keyword_alphabet][c]=true; } - for ( int c = 'A' ; c <= 'Z' ; ++c ) { alphabet[detail::keyword_alphabet][c]=true; } - for ( int c = '0' ; c <= '9' ; ++c ) { alphabet[detail::keyword_alphabet][c]=true; } - alphabet[detail::keyword_alphabet][static_cast('_')]=true; + for ( size_t c = 'a' ; c <= 'z' ; ++c ) { alphabet[detail::keyword_alphabet][c]=true; } + for ( size_t c = 'A' ; c <= 'Z' ; ++c ) { alphabet[detail::keyword_alphabet][c]=true; } + for ( size_t c = '0' ; c <= '9' ; ++c ) { alphabet[detail::keyword_alphabet][c]=true; } + alphabet[detail::keyword_alphabet][static_cast('_')]=true; - for ( int c = '0' ; c <= '9' ; ++c ) { alphabet[detail::int_alphabet][c]=true; } - for ( int c = '0' ; c <= '9' ; ++c ) { alphabet[detail::float_alphabet][c]=true; } - alphabet[detail::float_alphabet][static_cast('.')]=true; + for ( size_t c = '0' ; c <= '9' ; ++c ) { alphabet[detail::int_alphabet][c]=true; } + for ( size_t c = '0' ; c <= '9' ; ++c ) { alphabet[detail::float_alphabet][c]=true; } + alphabet[detail::float_alphabet][static_cast('.')]=true; - for ( int c = '0' ; c <= '9' ; ++c ) { alphabet[detail::hex_alphabet][c]=true; } - for ( int c = 'a' ; c <= 'f' ; ++c ) { alphabet[detail::hex_alphabet][c]=true; } - for ( int c = 'A' ; c <= 'F' ; ++c ) { alphabet[detail::hex_alphabet][c]=true; } + for ( size_t c = '0' ; c <= '9' ; ++c ) { alphabet[detail::hex_alphabet][c]=true; } + for ( size_t c = 'a' ; c <= 'f' ; ++c ) { alphabet[detail::hex_alphabet][c]=true; } + for ( size_t c = 'A' ; c <= 'F' ; ++c ) { alphabet[detail::hex_alphabet][c]=true; } - alphabet[detail::x_alphabet][static_cast('x')]=true; - alphabet[detail::x_alphabet][static_cast('X')]=true; + alphabet[detail::x_alphabet][static_cast('x')]=true; + alphabet[detail::x_alphabet][static_cast('X')]=true; - for ( int c = '0' ; c <= '1' ; ++c ) { alphabet[detail::bin_alphabet][c]=true; } - alphabet[detail::b_alphabet][static_cast('b')]=true; - alphabet[detail::b_alphabet][static_cast('B')]=true; + for ( size_t c = '0' ; c <= '1' ; ++c ) { alphabet[detail::bin_alphabet][c]=true; } + alphabet[detail::b_alphabet][static_cast('b')]=true; + alphabet[detail::b_alphabet][static_cast('B')]=true; - for ( int c = 'a' ; c <= 'z' ; ++c ) { alphabet[detail::id_alphabet][c]=true; } - for ( int c = 'A' ; c <= 'Z' ; ++c ) { alphabet[detail::id_alphabet][c]=true; } - alphabet[detail::id_alphabet][static_cast('_')] = true; + for ( size_t c = 'a' ; c <= 'z' ; ++c ) { alphabet[detail::id_alphabet][c]=true; } + for ( size_t c = 'A' ; c <= 'Z' ; ++c ) { alphabet[detail::id_alphabet][c]=true; } + alphabet[detail::id_alphabet][static_cast('_')] = true; - alphabet[detail::white_alphabet][static_cast(' ')]=true; - alphabet[detail::white_alphabet][static_cast('\t')]=true; + alphabet[detail::white_alphabet][static_cast(' ')]=true; + alphabet[detail::white_alphabet][static_cast('\t')]=true; - alphabet[detail::int_suffix_alphabet][static_cast('l')] = true; - alphabet[detail::int_suffix_alphabet][static_cast('L')] = true; - alphabet[detail::int_suffix_alphabet][static_cast('u')] = true; - alphabet[detail::int_suffix_alphabet][static_cast('U')] = true; + alphabet[detail::int_suffix_alphabet][static_cast('l')] = true; + alphabet[detail::int_suffix_alphabet][static_cast('L')] = true; + alphabet[detail::int_suffix_alphabet][static_cast('u')] = true; + alphabet[detail::int_suffix_alphabet][static_cast('U')] = true; - alphabet[detail::float_suffix_alphabet][static_cast('l')] = true; - alphabet[detail::float_suffix_alphabet][static_cast('L')] = true; - alphabet[detail::float_suffix_alphabet][static_cast('f')] = true; - alphabet[detail::float_suffix_alphabet][static_cast('F')] = true; + alphabet[detail::float_suffix_alphabet][static_cast('l')] = true; + alphabet[detail::float_suffix_alphabet][static_cast('L')] = true; + alphabet[detail::float_suffix_alphabet][static_cast('f')] = true; + alphabet[detail::float_suffix_alphabet][static_cast('F')] = true; return alphabet; } @@ -130,35 +125,26 @@ namespace chaiscript return alpha; } - const std::array, detail::max_alphabet> &m_alphabet = create_alphabet(); - - static const std::vector> build_operator_matches() { - std::vector> operator_matches; - operator_matches.emplace_back(std::initializer_list({"?"})); - operator_matches.emplace_back(std::initializer_list({"||"})); - operator_matches.emplace_back(std::initializer_list({"&&"})); - operator_matches.emplace_back(std::initializer_list({"|"})); - operator_matches.emplace_back(std::initializer_list({"^"})); - operator_matches.emplace_back(std::initializer_list({"&"})); - operator_matches.emplace_back(std::initializer_list({"==", "!="})); - operator_matches.emplace_back(std::initializer_list({"<", "<=", ">", ">="})); - operator_matches.emplace_back(std::initializer_list({"<<", ">>"})); - - //We share precedence here but then separate them later - operator_matches.emplace_back(std::initializer_list({"+", "-"})); - - //We share precedence here but then separate them later - operator_matches.emplace_back(std::initializer_list({"*", "/", "%"})); - - return operator_matches; - }; static const std::vector> &create_operator_matches() { - static const auto operator_matches = build_operator_matches(); + static const std::vector> operator_matches { + {"?"}, + {"||"}, + {"&&"}, + {"|"}, + {"^"}, + {"&"}, + {"==", "!="}, + {"<", "<=", ">", ">="}, + {"<<", ">>"}, + //We share precedence here but then separate them later + {"+", "-"}, + {"*", "/", "%"} + }; + return operator_matches; } - const std::vector> &m_operator_matches = create_operator_matches(); static const std::array &create_operators() { static const std::array operators = {{ @@ -177,6 +163,12 @@ namespace chaiscript return operators; } + static constexpr const char * const m_multiline_comment_begin = "/*"; + static constexpr const char * const m_multiline_comment_end = "*/"; + static constexpr const char * const m_singleline_comment = "//"; + + const std::array, detail::max_alphabet> &m_alphabet = create_alphabet(); + const std::vector> &m_operator_matches = create_operator_matches(); const std::array &m_operators = create_operators(); std::shared_ptr m_filename;