Files

86 lines
2.2 KiB
C++
Raw Permalink Normal View History

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