2015-05-07 18:10:22 -07:00
|
|
|
#ifndef CLEXER_HPP
|
|
|
|
|
#define CLEXER_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <list>
|
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
|
|
class CLexer
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
enum TokenType
|
|
|
|
|
{
|
2015-05-09 16:45:41 -07:00
|
|
|
INVALID,
|
2015-05-07 18:10:22 -07:00
|
|
|
IDENTIFIER, //Names which can be expanded.
|
|
|
|
|
COMMA, //,
|
|
|
|
|
SEMICOLON,
|
|
|
|
|
OPEN, //{[(
|
|
|
|
|
CLOSE, //}])
|
2015-05-09 16:45:41 -07:00
|
|
|
PREPROCESSOR, //Begins with #
|
2015-05-07 18:10:22 -07:00
|
|
|
NEWLINE,
|
|
|
|
|
WHITESPACE,
|
|
|
|
|
IGNORE,
|
|
|
|
|
COMMENT,
|
|
|
|
|
STRING,
|
2015-05-09 16:45:41 -07:00
|
|
|
NUMBER,
|
|
|
|
|
KEYWORD,
|
|
|
|
|
FUNCTION,
|
|
|
|
|
MACRO,
|
|
|
|
|
OPERATOR
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum OperatorType
|
|
|
|
|
{
|
2015-05-07 18:10:22 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct Token
|
|
|
|
|
{
|
2015-05-09 16:45:41 -07:00
|
|
|
Token()
|
|
|
|
|
: type(INVALID),
|
|
|
|
|
degenerate(false)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-07 18:10:22 -07:00
|
|
|
std::string value;
|
|
|
|
|
TokenType type;
|
2015-05-09 16:45:41 -07:00
|
|
|
union
|
|
|
|
|
{
|
|
|
|
|
OperatorType opType;
|
|
|
|
|
};
|
|
|
|
|
bool degenerate;
|
2015-05-07 18:10:22 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef std::list<CLexer::Token> TokenList;
|
|
|
|
|
typedef TokenList::iterator TokenIterator;
|
|
|
|
|
|
2015-05-09 16:45:41 -07:00
|
|
|
CLexer();
|
2015-05-07 18:10:22 -07:00
|
|
|
|
2015-05-09 16:45:41 -07:00
|
|
|
void lex(char* start, char* end, TokenList& tokens);
|
2015-05-07 18:10:22 -07:00
|
|
|
private:
|
|
|
|
|
bool _searchString(const std::string& str, char in) const;
|
|
|
|
|
bool _isTrivial(char in) const;
|
|
|
|
|
bool _isIdentifierStart(char in) const;
|
|
|
|
|
bool _isIdentifierBody(char in) const;
|
|
|
|
|
bool _isNumber(char in) const;
|
2015-05-09 16:45:41 -07:00
|
|
|
bool _isBinary(char in) const;
|
2015-05-07 18:10:22 -07:00
|
|
|
bool _isHex(char in) const;
|
2015-05-09 16:45:41 -07:00
|
|
|
bool _isOperatorStart(char in) const;
|
|
|
|
|
bool _isOperator(const std::string& val) const;
|
|
|
|
|
bool _isKeyword(const std::string& val) const;
|
2015-05-07 18:10:22 -07:00
|
|
|
char* _parseToken(char* start, char* end, Token& out);
|
|
|
|
|
char* _parseLiteral(char* start, char* end, Token& out);
|
|
|
|
|
char* _parseLineComment(char* start, char* end, Token& out);
|
|
|
|
|
char* _parseBlockComment(char* start, char* end, Token& out);
|
|
|
|
|
char* _parseNumber(char* start, char* end, Token& out);
|
2015-05-09 16:45:41 -07:00
|
|
|
char* _parseBinaryConstant(char* start, char* end, Token& out);
|
2015-05-07 18:10:22 -07:00
|
|
|
char* _parseHexConstant(char* start, char* end, Token& out);
|
|
|
|
|
char* _parseFloatingPoint(char* start, char* end, Token& out);
|
|
|
|
|
char* _parseCharacterLiteral(char* start, char* end, Token& out);
|
|
|
|
|
char* _parseStringLiteral(char* start, char* end, Token& out);
|
|
|
|
|
char* _parseIdentifier(char* start, char* end, Token& out);
|
2015-05-09 16:45:41 -07:00
|
|
|
char* _parseOperator(char* start, char* end, Token& out);
|
|
|
|
|
Token* m_lastIdentifier;
|
2015-05-07 18:10:22 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif // CLEXER_HPP
|