📄 lexer.h
字号:
#ifndef LEXER_H_
#define LEXER_H_
#include "config.h"
#include "hashtable.h"
#include "type.h"
extern const char* opList[];
extern const char* comErr[];
enum TokType
{
TOK_IDENTIFIER = 0X01,
TOK_INT_CONST = 0X02,
TOK_FLT_CONST = 0X03,
TOK_CHAR_CONST = 0X04,
TOK_STR_CONST = 0X05,
TOK_COMMA = 0X06,
TOK_BAD = 0X07,
TOK_NOMORE = 0X08,
TOK_KEYWORD = 0X09,
TOK_LP_S = 0X0A,
TOK_RP_S = 0X0B,
TOK_LP_B = 0X0C,
TOK_RP_B = 0X0D,
TOK_LP_M = 0X0E,
TOK_RP_M = 0X0F,
TOK_EOF = 0X10,
TOK_SEMICOLON = 0X11,
TOK_COMMENT = 0X12,
TOK_BACKSLASH = 0X13,
TOK_DIRECTIVE = 0X14,
};
struct Token
{
Token();
char text[ID_SIZE];
TokType type;
S64 arg; //Token arg;
};
struct Line
{
Line();
char _buffer[LINE_SIZE];
int _lineNum;
bool _eof;
char *_fileName;
};
class File
{
public:
File(const char* fileName);
void GetLine(Line& line);
char GetChar();
char* GetFileName()
{
return _fileName;
}
private:
char _buffer[BUFFER_SIZE]; //Internal Buffer;
int _curPos; //Cur Read Position;
int _numElems; //Elems in Buffer;
int _curLine;
FILE* _file;
char _fileName[FILE_NAME_LENGTH];
private:
void FillBuffer();
};
class Lexer
{
public:
Lexer(File& file, Line& line);
static bool Match(Token& tok, TokType type);
void ProcessNumConst(Token& tok);
void ProcessCharConst(Token& tok);
void ProcessStrConst(Token& tok);
void ProcessIdentifier(Token& tok);
void ProcessDirective(Token& tok);
void PrintToken(Token& tok);
void GetNextToken(Token& tok);
void BackOneToken() { _curPos = _lastTokPos; }
Token& GetNextToken()
{
GetNextToken(_tok);
return _tok;
}
void CheckNumeric(Token& tok);
private:
char GetNextChar();
void Back();
void Forward();
char SkipWhiteSpace();
private:
Token _tok;
File& _curFile;
Line& _curLine;
int _curPos;
int _lastTokPos;
HashTable<MapBucket> _keywords;
HashTable<std::string> _directives;
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -