1
0
Fork 0

Codechange: use std::string_view in squirrel lexer

pull/14211/head
Rubidium 2025-05-03 21:19:20 +02:00 committed by rubidium42
parent 4255a94779
commit 635ca3739f
3 changed files with 24 additions and 61 deletions

View File

@ -88,7 +88,7 @@ public:
//do nothing
}
else {
const SQChar *etypename;
std::string_view etypename;
if(tok > 255) {
switch(tok)
{
@ -105,7 +105,7 @@ public:
etypename = "FLOAT";
break;
default:
etypename = _lex.Tok2Str(tok);
etypename = _lex.Tok2Str(tok).value_or("<unknown>");
}
throw CompileException(fmt::format("expected '{}'", etypename));
}
@ -116,10 +116,10 @@ public:
switch(tok)
{
case TK_IDENTIFIER:
ret = _fs->CreateString(_lex._svalue);
ret = _fs->CreateString(_lex.View());
break;
case TK_STRING_LITERAL:
ret = _fs->CreateString(std::string_view(_lex._svalue,_lex._longstr.size()-1));
ret = _fs->CreateString(_lex.View());
break;
case TK_INTEGER:
ret = SQObjectPtr(_lex._nvalue);
@ -594,7 +594,7 @@ public:
switch(_token)
{
case TK_STRING_LITERAL: {
_fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(_fs->CreateString(std::string_view(_lex._svalue,_lex._longstr.size()-1))));
_fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(_fs->CreateString(_lex.View())));
Lex();
}
break;
@ -614,7 +614,7 @@ public:
SQObject id;
SQObject constant;
switch(_token) {
case TK_IDENTIFIER: id = _fs->CreateString(_lex._svalue); break;
case TK_IDENTIFIER: id = _fs->CreateString(_lex.View()); break;
case TK_THIS: id = _fs->CreateString("this"); break;
case TK_CONSTRUCTOR: id = _fs->CreateString("constructor"); break;
}
@ -1099,7 +1099,7 @@ public:
val._unVal.fFloat = _lex._fvalue;
break;
case TK_STRING_LITERAL:
val = _fs->CreateString(std::string_view(_lex._svalue,_lex._longstr.size()-1));
val = _fs->CreateString(_lex.View());
break;
case '-':
Lex();

View File

@ -85,7 +85,6 @@ SQLexer::SQLexer(SQSharedState *ss, SQLEXREADFUNC rg, SQUserPointer up)
_prevtoken = -1;
_curtoken = -1;
_svalue = nullptr;
_nvalue = 0;
_fvalue = 0;
@ -103,7 +102,7 @@ void SQLexer::Next()
_currdata = SQUIRREL_EOB;
}
const SQChar *SQLexer::Tok2Str(SQInteger tok)
std::optional<std::string_view> SQLexer::Tok2Str(SQInteger tok)
{
SQObjectPtr itr, key, val;
SQInteger nitr;
@ -112,7 +111,7 @@ const SQChar *SQLexer::Tok2Str(SQInteger tok)
if(((SQInteger)_integer(val)) == tok)
return _stringval(key);
}
return nullptr;
return std::nullopt;
}
void SQLexer::LexBlockComment()
@ -270,7 +269,7 @@ SQInteger SQLexer::Lex()
return 0;
}
SQInteger SQLexer::GetIDType(SQChar *s)
SQInteger SQLexer::GetIDType(std::string_view s)
{
SQObjectPtr t;
if(_keywords->Get(SQString::Create(_sharedstate, s), t)) {
@ -349,50 +348,17 @@ SQInteger SQLexer::ReadString(char32_t ndelim,bool verbatim)
break;
}
}
TERMINATE_BUFFER();
SQInteger len = _longstr.size()-1;
if(ndelim == '\'') {
if(len == 0) throw CompileException("empty constant");
if(len > 1) throw CompileException("constant too long");
if(_longstr.empty()) throw CompileException("empty constant");
if(_longstr.size() > 1) throw CompileException("constant too long");
_nvalue = _longstr[0];
return TK_INTEGER;
}
_svalue = &_longstr[0];
return TK_STRING_LITERAL;
}
void LexHexadecimal(const SQChar *s,SQUnsignedInteger *res)
{
*res = 0;
while(*s != 0)
{
if(isdigit(*s)) *res = (*res)*16+((*s++)-'0');
else if(isxdigit(*s)) *res = (*res)*16+(toupper(*s++)-'A'+10);
else { assert(0); }
}
}
void LexInteger(const SQChar *s,SQUnsignedInteger *res)
{
*res = 0;
while(*s != 0)
{
*res = (*res)*10+((*s++)-'0');
}
}
SQInteger scisodigit(SQChar c) { return c >= '0' && c <= '7'; }
void LexOctal(const SQChar *s,SQUnsignedInteger *res)
{
*res = 0;
while(*s != 0)
{
if(scisodigit(*s)) *res = (*res)*8+((*s++)-'0');
else { assert(0); }
}
}
SQInteger isexponent(SQInteger c) { return c == 'e' || c=='E'; }
@ -447,20 +413,21 @@ SQInteger SQLexer::ReadNumber()
NEXT();
}
}
TERMINATE_BUFFER();
switch(type) {
case TSCIENTIFIC:
case TFLOAT:
_fvalue = (SQFloat)strtod(&_longstr[0],&sTemp);
case TFLOAT: {
std::string str{View()};
_fvalue = (SQFloat)strtod(str.c_str(),&sTemp);
return TK_FLOAT;
}
case TINT:
LexInteger(&_longstr[0],(SQUnsignedInteger *)&_nvalue);
_nvalue = ParseInteger<SQUnsignedInteger>(View(), 10).value_or(0);
return TK_INTEGER;
case THEX:
LexHexadecimal(&_longstr[0],(SQUnsignedInteger *)&_nvalue);
_nvalue = ParseInteger<SQUnsignedInteger>(View(), 16).value_or(0);
return TK_INTEGER;
case TOCTAL:
LexOctal(&_longstr[0],(SQUnsignedInteger *)&_nvalue);
_nvalue = ParseInteger<SQUnsignedInteger>(View(), 8).value_or(0);
return TK_INTEGER;
}
return 0;
@ -474,10 +441,6 @@ SQInteger SQLexer::ReadID()
APPEND_CHAR(CUR_CHAR);
NEXT();
} while(isalnum(CUR_CHAR) || CUR_CHAR == '_');
TERMINATE_BUFFER();
res = GetIDType(&_longstr[0]);
if(res == TK_IDENTIFIER || res == TK_CONSTRUCTOR) {
_svalue = &_longstr[0];
}
res = GetIDType(View());
return res;
}

View File

@ -7,9 +7,9 @@ struct SQLexer
~SQLexer();
SQLexer(SQSharedState *ss,SQLEXREADFUNC rg,SQUserPointer up);
SQInteger Lex();
const SQChar *Tok2Str(SQInteger tok);
std::optional<std::string_view> Tok2Str(SQInteger tok);
private:
SQInteger GetIDType(SQChar *s);
SQInteger GetIDType(std::string_view s);
SQInteger ReadString(char32_t ndelim,bool verbatim);
SQInteger ReadNumber();
void LexBlockComment();
@ -19,14 +19,12 @@ private:
SQTable *_keywords;
void INIT_TEMP_STRING() { _longstr.resize(0); }
void APPEND_CHAR(char32_t c);
void TERMINATE_BUFFER() { _longstr.push_back('\0'); }
public:
SQInteger _prevtoken;
SQInteger _currentline;
SQInteger _lasttokenline;
SQInteger _currentcolumn;
const SQChar *_svalue;
SQInteger _nvalue;
SQFloat _fvalue;
SQLEXREADFUNC _readf;
@ -34,6 +32,8 @@ public:
char32_t _currdata;
SQSharedState *_sharedstate;
sqvector<SQChar> _longstr;
std::string_view View() const { return std::string_view(_longstr._vals, _longstr.size()); }
};
#endif