Lexer daha anlaşılır hale getirildi
This commit is contained in:
parent
8adeabaff1
commit
0f33740a07
660
core/Lexer.cpp
660
core/Lexer.cpp
|
|
@ -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
|
||||||
Loading…
Reference in New Issue