/* * Copyright 2006-2014 Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: * Stephan Aßmus * Rene Gollent * John Scipione * Ingo Weinhold */ #ifndef C_LANGUAGE_TOKENIZER #define C_LANGUAGE_TOKENIZER #include #include namespace CLanguage { enum { TOKEN_NONE = 0, TOKEN_IDENTIFIER, TOKEN_CONSTANT, TOKEN_END_OF_LINE, TOKEN_PLUS, TOKEN_MINUS, TOKEN_STAR, TOKEN_SLASH, TOKEN_MODULO, TOKEN_OPENING_PAREN, TOKEN_CLOSING_PAREN, TOKEN_OPENING_SQUARE_BRACKET, TOKEN_CLOSING_SQUARE_BRACKET, TOKEN_OPENING_CURLY_BRACE, TOKEN_CLOSING_CURLY_BRACE, TOKEN_ASSIGN, TOKEN_LOGICAL_AND, TOKEN_LOGICAL_OR, TOKEN_LOGICAL_NOT, TOKEN_BITWISE_AND, TOKEN_BITWISE_OR, TOKEN_BITWISE_NOT, TOKEN_BITWISE_XOR, TOKEN_EQ, TOKEN_NE, TOKEN_GT, TOKEN_GE, TOKEN_LT, TOKEN_LE, TOKEN_BACKSLASH, TOKEN_CONDITION, TOKEN_COLON, TOKEN_SEMICOLON, TOKEN_COMMA, TOKEN_PERIOD, TOKEN_POUND, TOKEN_SINGLE_QUOTE, TOKEN_DOUBLE_QUOTE, TOKEN_STRING_LITERAL, TOKEN_BEGIN_COMMENT_BLOCK, TOKEN_END_COMMENT_BLOCK, TOKEN_INLINE_COMMENT, TOKEN_MEMBER_PTR }; class ParseException { public: ParseException(const char* message, int32 position) : message(message), position(position) { } ParseException(const ParseException& other) : message(other.message), position(other.position) { } BString message; int32 position; }; struct Token { Token(); Token(const Token& other); Token(const char* string, int32 length, int32 position, int32 type); Token& operator=(const Token& other); BString string; int32 type; BVariant value; int32 position; }; class Tokenizer { public: Tokenizer(); void SetTo(const char* string); const Token& NextToken(); void RewindToken(); private: bool _ParseOperator(); char _Peek() const; static bool _IsHexDigit(char c); Token& _ParseHexOperand(); int32 _CurrentPos() const; private: BString fString; const char* fCurrentChar; Token fCurrentToken; bool fReuseToken; }; } // namespace CLanguage #endif // C_LANGUAGE_TOKENIZER