📄 lex.cpp
字号:
#include <iostream>
#include <fstream>
#include <cctype>
#include <string>
#include <vector>
#include "lex.h"
using namespace std;
int iskey(const string);
vector<NODE>::size_type find_table(const string);
vector<NODE> id_table;
string strbuf;
size_t line = 1;
int token(std::ifstream & in, TOKE & toke)
{
int ch;
bool state = true;
string str;
while (state)
{
state = false;
ch = in.get();
if (ch == EOF)
{
toke.num = -1;
//toke.pos = -1;
toke.line = line;
return 0;
}
else if (isalpha(ch) || ch == '_')
{
str.append(1 , tolower(ch));
while (true)
{
if ((ch = in.get()) != EOF)
{
if (isalnum(ch) || ch == '_')
str.append(1 , tolower(ch));
else
{
in.unget();
break;
}
}
else
break;
}
int n = iskey(str);
if (n != 0)
{
toke.num = n;
//toke.pos = -1;
toke.line = line;
}
else
{
toke.num = ID;
toke.pos = find_table(str);
toke.line = line;
}
}
else if (isdigit(ch))
{
str.append(1 , ch);
while (true)
{
if ((ch = in.get()) != EOF)
{
if (isdigit(ch))
str.append(1 , ch);
else
{
in.unget();
break;
}
}
else
break;
}
toke.num = INT;
toke.pos = find_table(str);
toke.line = line;
}
else if (ch == '<')
{
ch = in.get();
if (ch == '=')
{
toke.num = LE;
//toke.pos = -1;
toke.line = line;
}
else if (ch == '>')
{
toke.num = NE;
//toke.pos = -1;
toke.line = line;
}
else
{
toke.num = LT;
//toke.pos = -1;
toke.line = line;
in.unget();
}
}
else if (ch == '=')
{
toke.num = EQ;
//toke.pos = -1;
toke.line = line;
}
else if (ch == '>')
{
if (( ch = in.get()) == '=')
{
toke.num = GE;
//toke.pos = -1;
toke.line = line;
}
else
{
toke.num = GT;
//toke.pos = -1;
toke.line = line;
in.unget();
}
}
else if (ch == ':')
{
if ((ch = in.get()) == '=')
{
toke.num = EVALUATE;
//toke.pos = -1;
toke.line = line;
}
else
{
toke.num = CLN;
//toke.pos = -1;
toke.line = line;
in.unget();
}
}
else if (ch == '+')
{
toke.num = ADD;
//toke.pos = -1;
toke.line = line;
}
else if (ch == '-')
{
toke.num = SUB;
//toke.pos = -1;
toke.line = line;
}
else if (ch == '*')
{
toke.num = MUL;
//toke.pos = -1;
toke.line = line;
}
else if (ch == '/')
{
if ((ch = in.get()) == '/')
{
while ((ch = in.get()) != '\n')
{
if (ch == EOF )
return 0;
}
state = true;
++line;
}
else
{
toke.num = DIV;
//toke.pos = -1;
toke.line = line;
in.unget();
}
}
else if (ch == ',')
{
toke.num = COMMA;
//toke.pos = -1;
toke.line = line;
}
else if (ch == ';')
{
toke.num = SEMICOLON;
//toke.pos = -1;
toke.line = line;
}
else if (ch == '.')
{
if ((ch = in.get()) == '.')
{
toke.num = SPOINTS;
//toke.pos = -1;
toke.line = line;
}
else
{
toke.num = PERIOD;
//toke.pos = -1;
toke.line = line;
in.unget();
}
}
else if (ch == '(')
{
toke.num = LBRACE;
//toke.pos = -1;
toke.line = line;
}
else if (ch == ')')
{
toke.num = RBRACE;
//toke.pos = -1;
toke.line = line;
}
else if (ch == '[')
{
toke.num = LBRACKTE;
//toke.pos = -1;
toke.line = line;
}
else if (ch == ']')
{
toke.num = RBRACKTE;
//toke.pos = -1;
toke.line = line;
}
else if (ch == '\'')
{
toke.num = SQUOTES;
//toke.pos = -1;
toke.line = line;
while (true)
{
ch = in.get();
if (ch == '\\')
{
str.append(1 , ch);
str.append(1 , in.get());
}
else if (ch == '\'')
break;
else if (ch == '\n')
{
toke.num = 2; //2 字符串缺少单引号
//toke.pos = -1;
toke.line = line;
++line;
return -1;
}
else
str.append(1 , ch);
}
}
else if (ch == '^')
{
toke.num = POINTER;
//toke.pos = -1;
toke.line = line;
}
else if (ch == '{')
{
while ((ch = in.get()) != '}')
{
if (ch == EOF )
{
toke.num = 3; //3 注释缺少右括号
//toke.pos = -1;
toke.line = line;
return -1;
}
else if (ch == '\n')
++line;
}
state = true;
}
else if (isspace(ch))
{
if (ch == '\n')
++line;
state = true;
}
else
{
toke.num = 1; // 闈炴硶瀛楃
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -