67 lines
1.4 KiB
C
67 lines
1.4 KiB
C
|
#ifndef __LEXAL_H__
|
||
|
#define __LEXAL_H__
|
||
|
|
||
|
|
||
|
#include "streams.h"
|
||
|
|
||
|
|
||
|
class Lexeme
|
||
|
{
|
||
|
public:
|
||
|
typedef enum Type {
|
||
|
String,
|
||
|
Integer,
|
||
|
Float,
|
||
|
Ident,
|
||
|
Symbol,
|
||
|
Eof
|
||
|
};
|
||
|
|
||
|
private:
|
||
|
int line;
|
||
|
int pos;
|
||
|
Type type;
|
||
|
std::wstring content;
|
||
|
|
||
|
public:
|
||
|
Lexeme() { };
|
||
|
Lexeme(Type type, const std::wstring &content, int line, int pos);
|
||
|
~Lexeme() { };
|
||
|
|
||
|
public:
|
||
|
const Type getType() const { return type; };
|
||
|
const std::wstring getContent() const { return content; };
|
||
|
std::wstring getPosStr() const;
|
||
|
int getLine() const { return line; };
|
||
|
int getPos() const { return pos; };
|
||
|
};
|
||
|
|
||
|
|
||
|
class Lexal
|
||
|
{
|
||
|
private:
|
||
|
UtfStreamReader &reader;
|
||
|
int line;
|
||
|
int pos;
|
||
|
|
||
|
public:
|
||
|
Lexal(UtfStreamReader &reader);
|
||
|
~Lexal() { };
|
||
|
|
||
|
public:
|
||
|
Lexeme getNext();
|
||
|
static std::wstring posToStr(int line, int pos);
|
||
|
|
||
|
private:
|
||
|
void skipSpaces();
|
||
|
void skipToLineEnd();
|
||
|
void skipMultilineComment(int startLine, int startPos);
|
||
|
Lexeme readIdent(int startLine, int startPos, wchar_t first);
|
||
|
Lexeme readNumber(int startLine, int startPos, wchar_t first);
|
||
|
Lexeme readString(int startLine, int startPos, wchar_t quote);
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif
|
||
|
|