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

View File

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

View File

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