Lexer daha anlaşılır hale getirildi

This commit is contained in:
abdussamedulutas 2025-12-28 14:35:18 +03:00
parent 8adeabaff1
commit 0f33740a07
1 changed files with 347 additions and 313 deletions

View File

@ -20,372 +20,406 @@ public:
int size = 0; int size = 0;
int offset = 0; int offset = 0;
std::vector<int> offsetMap; std::vector<int> offsetMap;
void beginPosition() void beginPosition();
{ int getLastPosition();
this->offsetMap.push_back(this->getLastPosition()); void acceptPosition();
} void setLastPosition(int);
int getLastPosition() bool isEnd();
{ void rejectPosition();
if(this->offsetMap.size() == 0) int * positionRange();
{ std::string getPositionRange();
return this->offset; bool include(std::string,bool);
} int getOffset();
else int setOffset(int);
{ char getchar(int);
return this->offsetMap[this->offsetMap.size() - 1]; char getchar();
} void nextChar();
} void toChar(int);
void acceptPosition() void setText(std::string);
{ void skipWhiteSpace();
int T = this->offsetMap[this->offsetMap.size() - 1]; bool isNumeric();
this->setLastPosition(T); INumber readNumeric();
} };
void setLastPosition(int n)
{
if(this->offsetMap.size() == 0)
{
this->offset = n;
}
else
{
this->offsetMap[this->offsetMap.size() - 1] = n;
}
}
bool isEnd()
{
bool result = this->size <= this->getOffset();
return result;
}
void rejectPosition()
{
this->offsetMap.pop_back();
}
int * positionRange()
{
int len = this->offsetMap.size();
if(len == 0)
{
return new int[2]{0, this->offset};
}
else if(len == 1)
{
return new int[2]{
this->offset,
this->offsetMap[len - 1]
};
}else{
return new int[2]{
this->offsetMap[len - 2],
this->offsetMap[len - 1]
};
}
}
std::string getPositionRange()
{
int *A = this->positionRange();
std::string mem;
for (int i = A[0]; i < A[1];i++) void Lexer::beginPosition()
{ {
mem.push_back(this->input.at(i)); this->offsetMap.push_back(this->getLastPosition());
} }
return mem;
}
bool include(std::string word,bool accept = true)
int Lexer::getLastPosition()
{
if(this->offsetMap.size() == 0)
{ {
this->beginPosition(); return this->offset;
for (int i = 0; i < word.size(); i++) }
else
{
return this->offsetMap[this->offsetMap.size() - 1];
}
}
void Lexer::acceptPosition()
{
int T = this->offsetMap[this->offsetMap.size() - 1];
this->setLastPosition(T);
}
void Lexer::setLastPosition(int n)
{
if(this->offsetMap.size() == 0)
{
this->offset = n;
}
else
{
this->offsetMap[this->offsetMap.size() - 1] = n;
}
}
bool Lexer::isEnd()
{
bool result = this->size <= this->getOffset();
return result;
}
void Lexer::rejectPosition()
{
this->offsetMap.pop_back();
}
int * Lexer::positionRange()
{
int len = this->offsetMap.size();
if(len == 0)
{
return new int[2]{0, this->offset};
}
else if(len == 1)
{
return new int[2]{
this->offset,
this->offsetMap[len - 1]
};
}else{
return new int[2]{
this->offsetMap[len - 2],
this->offsetMap[len - 1]
};
}
}
std::string Lexer::getPositionRange()
{
int *A = this->positionRange();
std::string mem;
for (int i = A[0]; i < A[1];i++)
{
mem.push_back(this->input.at(i));
}
return mem;
}
bool Lexer::include(std::string word,bool accept = true)
{
this->beginPosition();
for (int i = 0; i < word.size(); i++)
{
if(this->isEnd())
{ {
if(this->isEnd()) if(word.size() == i)
{ {
if(word.size() == i) break;
{ }else{
break;
}else{
this->rejectPosition();
return false;
}
}
if(word.at(i) != this->getchar())
{
this->rejectPosition(); this->rejectPosition();
return false; return false;
} }
this->nextChar();
} }
if(accept) if(word.at(i) != this->getchar())
{
this->acceptPosition();
}
else
{ {
this->rejectPosition(); this->rejectPosition();
}; return false;
return true;
}
int getOffset()
{
return this->getLastPosition();
}
int setOffset(int n)
{
this->setLastPosition(n);
return this->getLastPosition();
}
char getchar(int additionalOffset = 0)
{
int target = this->getOffset() + additionalOffset;
if(this->size - 1 < target)
{
std::cerr << "Hata yanlış erişim\n";
return '\0';
}else{
return this->input.at(target);
} }
this->nextChar();
} }
void nextChar() if(accept)
{ {
if(this->isEnd() == true) this->acceptPosition();
{
return;
};
this->setOffset(this->getOffset() + 1);
} }
void toChar(int n) else
{ {
if(this->isEnd() == true) this->rejectPosition();
{ };
return; return true;
}; }
this->setOffset(this->getOffset() + n); int Lexer::getOffset()
} {
void setText(std::string input) { return this->getLastPosition();
this->input = input; }
this->size = input.length(); int Lexer::setOffset(int n)
} {
void skipWhiteSpace() this->setLastPosition(n);
return this->getLastPosition();
}
char Lexer::getchar(int additionalOffset)
{
int target = this->getOffset() + additionalOffset;
if(this->size - 1 < target)
{ {
while(this->isEnd() == false) std::cerr << "Hata yanlış erişim\n";
{ return '\0';
switch(this->getchar()) }else{
{ return this->input.at(target);
case '\r': }
case '\n': }
case '\b': char Lexer::getchar()
case '\t': {
case ' ':{ int target = this->getOffset();
this->nextChar(); if(this->size - 1 < target)
break; {
} std::cerr << "Hata yanlış erişim\n";
default:{ return '\0';
return; }else{
} return this->input.at(target);
}
}
void Lexer::nextChar()
{
if(this->isEnd() == true)
{
return;
};
this->setOffset(this->getOffset() + 1);
}
void Lexer::toChar(int n)
{
if(this->isEnd() == true)
{
return;
};
this->setOffset(this->getOffset() + n);
}
void Lexer::setText(std::string input) {
this->input = input;
this->size = input.length();
}
void Lexer::skipWhiteSpace()
{
while(this->isEnd() == false)
{
switch(this->getchar())
{
case '\r':
case '\n':
case '\b':
case '\t':
case ' ':{
this->nextChar();
break;
}
default:{
return;
} }
} }
} }
}
bool isNumeric() bool Lexer::isNumeric()
{ {
char c = this->getchar();
switch (c)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':{
return true;
}
default:{
return false;
}
}
}
INumber Lexer::readNumeric()
{
INumber numberToken;
numberToken.start = this->getLastPosition();
if(this->getchar() == '-')
{
this->nextChar();
numberToken.positive = false;
}else if(this->getchar() == '+'){
this->nextChar();
numberToken.positive = true;
}else{
numberToken.positive = true;
}
bool nextDot = false;
if(this->getchar() == '0')
{
numberToken.token.push_back('0');
this->nextChar();
char c = this->getchar();
switch(c)
{
case 'x':{
numberToken.token.push_back(c);
numberToken.base = 16;
break;
}
case 'b':{
numberToken.token.push_back(c);
numberToken.base = 2;
break;
}
default:{
if(c != '.')
{
numberToken.token.push_back(c);
numberToken.base = 8;
}else{
numberToken.token.push_back(c);
numberToken.base = 10;
nextDot = true;
numberToken.isFloat = true;
}
break;
}
}
this->nextChar();
}else{
numberToken.base = 10;
}
while(this->isEnd() == false)
{
char c = this->getchar(); char c = this->getchar();
switch (c) switch (c)
{ {
case '0': case '0':
case '1': case '1':{
numberToken.token.push_back(c);
break;
}
case '2': case '2':
case '3': case '3':
case '4': case '4':
case '5': case '5':
case '6': case '6':
case '7': case '7':{
if(numberToken.base >= 8)
{
numberToken.token.push_back(c);
break;
}else{
numberToken.end = this->getLastPosition();
return numberToken;
}
}
case '8': case '8':
case '9':{ case '9':{
return true; if(numberToken.base >= 10)
} {
default:{
return false;
}
}
}
INumber readNumeric(){
INumber numberToken;
numberToken.start = this->getLastPosition();
if(this->getchar() == '-')
{
this->nextChar();
numberToken.positive = false;
}else if(this->getchar() == '+'){
this->nextChar();
numberToken.positive = true;
}else{
numberToken.positive = true;
}
bool nextDot = false;
if(this->getchar() == '0')
{
numberToken.token.push_back('0');
this->nextChar();
char c = this->getchar();
switch(c)
{
case 'x':{
numberToken.token.push_back(c); numberToken.token.push_back(c);
numberToken.base = 16;
break; break;
}else{
numberToken.end = this->getLastPosition();
return numberToken;
} }
case 'b':{ }
case 'a': case 'A':
case 'b': case 'B':
case 'c': case 'C':
case 'd': case 'D':
case 'f': case 'F':{
if(numberToken.base >= 16)
{
numberToken.token.push_back(c); numberToken.token.push_back(c);
numberToken.base = 2;
break; break;
}else{
numberToken.end = this->getLastPosition();
return numberToken;
} }
default:{ }
if(c != '.') case '.':{
if(nextDot == false)
{
if(numberToken.token.size() == 0)
{ {
numberToken.token.push_back(c); numberToken.token.push_back('0');
numberToken.base = 8; numberToken.token.push_back('.');
}else{ }else{
numberToken.token.push_back(c); numberToken.token.push_back('.');
numberToken.base = 10;
nextDot = true;
numberToken.isFloat = true;
} }
nextDot = true;
numberToken.isFloat = true;
break; break;
}else{
numberToken.end = this->getLastPosition();
return numberToken;
} }
} }
this->nextChar(); case 'e':case 'E':{
}else{ if(numberToken.base == 16)
numberToken.base = 10; {
}
while(this->isEnd() == false)
{
char c = this->getchar();
switch (c)
{
case '0':
case '1':{
numberToken.token.push_back(c); numberToken.token.push_back(c);
break; break;
} }
case '2': if(numberToken.base == 10)
case '3': {
case '4': numberToken.hasEpsilon = true;
case '5': numberToken.token.push_back(c);
case '6': this->nextChar();
case '7':{ c = this->getchar();
if(numberToken.base >= 8)
if(c == '+' || c == '-')
{ {
numberToken.token.push_back(c);
break;
}else{
numberToken.end = this->getLastPosition();
return numberToken;
}
}
case '8':
case '9':{
if(numberToken.base >= 10)
{
numberToken.token.push_back(c);
break;
}else{
numberToken.end = this->getLastPosition();
return numberToken;
}
}
case 'a': case 'A':
case 'b': case 'B':
case 'c': case 'C':
case 'd': case 'D':
case 'f': case 'F':{
if(numberToken.base >= 16)
{
numberToken.token.push_back(c);
break;
}else{
numberToken.end = this->getLastPosition();
return numberToken;
}
}
case '.':{
if(nextDot == false)
{
if(numberToken.token.size() == 0)
{
numberToken.token.push_back('0');
numberToken.token.push_back('.');
}else{
numberToken.token.push_back('.');
}
nextDot = true;
numberToken.isFloat = true;
break;
}else{
numberToken.end = this->getLastPosition();
return numberToken;
}
}
case 'e':case 'E':{
if(numberToken.base == 16)
{
numberToken.token.push_back(c);
break;
}
if(numberToken.base == 10)
{
numberToken.hasEpsilon = true;
numberToken.token.push_back(c); numberToken.token.push_back(c);
this->nextChar(); this->nextChar();
c = this->getchar();
if(c == '+' || c == '-')
{
numberToken.token.push_back(c);
this->nextChar();
}
while(this->isEnd() == false)
{
char c = this->getchar();
switch (c)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':{
numberToken.token.push_back(c);
break;
}
default:{
numberToken.end = this->getLastPosition();
return numberToken;
}
}
this->nextChar();
}
break;
} }
numberToken.end = this->getLastPosition();
return numberToken; while(this->isEnd() == false)
} {
default:{ char c = this->getchar();
numberToken.end = this->getLastPosition(); switch (c)
return numberToken; {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':{
numberToken.token.push_back(c);
break;
}
default:{
numberToken.end = this->getLastPosition();
return numberToken;
}
}
this->nextChar();
}
break;
} }
numberToken.end = this->getLastPosition();
return numberToken;
}
default:{
numberToken.end = this->getLastPosition();
return numberToken;
} }
this->nextChar();
} }
numberToken.end = this->getLastPosition(); this->nextChar();
return numberToken;
} }
numberToken.end = this->getLastPosition();
return numberToken;
}; };
#endif #endif