mirror of
https://github.com/autc04/Retro68.git
synced 2024-12-27 23:31:44 +00:00
handle strings properly (remove quotes, handle escapes)
This commit is contained in:
parent
70b5b36d47
commit
6763bf3b4d
@ -7,13 +7,15 @@
|
|||||||
|
|
||||||
using namespace boost::wave;
|
using namespace boost::wave;
|
||||||
|
|
||||||
static int readInt(const char *str)
|
static int readInt(const char *str, const char *end = NULL, int baseOverride = 0)
|
||||||
{
|
{
|
||||||
int x = 0;
|
int x = 0;
|
||||||
|
|
||||||
int base = 10;
|
int base = 10;
|
||||||
|
|
||||||
if(*str == '0')
|
if(baseOverride)
|
||||||
|
base = baseOverride;
|
||||||
|
else if(*str == '0')
|
||||||
{
|
{
|
||||||
base = 8;
|
base = 8;
|
||||||
++str;
|
++str;
|
||||||
@ -34,7 +36,7 @@ static int readInt(const char *str)
|
|||||||
++str;
|
++str;
|
||||||
}
|
}
|
||||||
|
|
||||||
while(*str)
|
while(str != end && *str)
|
||||||
{
|
{
|
||||||
x *= base;
|
x *= base;
|
||||||
if(*str >= 'a' && *str <= 'z')
|
if(*str >= 'a' && *str <= 'z')
|
||||||
@ -67,6 +69,70 @@ static int readCharLit(const char *str)
|
|||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::string readStringLit(const char *str)
|
||||||
|
{
|
||||||
|
const char *p = str + 1;
|
||||||
|
const char *e = str + strlen(str) - 1;
|
||||||
|
|
||||||
|
std::ostringstream out;
|
||||||
|
|
||||||
|
while(p != e)
|
||||||
|
{
|
||||||
|
if(*p == '\\')
|
||||||
|
{
|
||||||
|
++p;
|
||||||
|
if(p != e)
|
||||||
|
{
|
||||||
|
switch(*p)
|
||||||
|
{
|
||||||
|
case 'n':
|
||||||
|
out << '\n';
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
out << '\r';
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
out << '\t';
|
||||||
|
break;
|
||||||
|
case '0':
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
if(p + 3 > e)
|
||||||
|
continue;
|
||||||
|
if(p[0] == '0' && (p[1] == 'x' || p[1] == 'X'))
|
||||||
|
{
|
||||||
|
if(p + 4 > e)
|
||||||
|
continue;
|
||||||
|
out << (char)readInt(p+2, p+4, 16);
|
||||||
|
p += 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
out << (char)readInt(p, p+3, 8);
|
||||||
|
p += 3;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '$':
|
||||||
|
{
|
||||||
|
if(p + 3 > e)
|
||||||
|
continue;
|
||||||
|
out << (char)readInt(p+1, p+3, 16);
|
||||||
|
p += 3;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
out << *p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return out.str();
|
||||||
|
}
|
||||||
|
|
||||||
RezSymbol RezLexer::nextToken()
|
RezSymbol RezLexer::nextToken()
|
||||||
{
|
{
|
||||||
for(auto tok = nextWave(); tok != T_EOI && tok != T_EOF; tok = nextWave())
|
for(auto tok = nextWave(); tok != T_EOI && tok != T_EOF; tok = nextWave())
|
||||||
@ -174,7 +240,7 @@ case T_ ## name: /*std::cout << #name << std::endl;*/ return RezParser::make_ ##
|
|||||||
case T_INTLIT: return RezParser::make_INTLIT(readInt(tok.get_value().c_str()), loc);
|
case T_INTLIT: return RezParser::make_INTLIT(readInt(tok.get_value().c_str()), loc);
|
||||||
|
|
||||||
case T_CHARLIT: return RezParser::make_CHARLIT(readCharLit(tok.get_value().c_str()), loc);
|
case T_CHARLIT: return RezParser::make_CHARLIT(readCharLit(tok.get_value().c_str()), loc);
|
||||||
case T_STRINGLIT: return RezParser::make_STRINGLIT(tok.get_value().c_str(), loc);
|
case T_STRINGLIT: return RezParser::make_STRINGLIT(readStringLit(tok.get_value().c_str()), loc);
|
||||||
|
|
||||||
NOVAL_TOK(LEFTBRACE);
|
NOVAL_TOK(LEFTBRACE);
|
||||||
NOVAL_TOK(RIGHTBRACE);
|
NOVAL_TOK(RIGHTBRACE);
|
||||||
|
Loading…
Reference in New Issue
Block a user