⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lexer.h

📁 编译原理的作业 编译器
💻 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 + -