Fix petscii characters changed includes and pragmas
This commit is contained in:
parent
11af372509
commit
0e59af5122
|
@ -12,6 +12,9 @@ Parser::Parser(Errors* errors, Scanner* scanner, CompilationUnits* compilationUn
|
||||||
mCodeSection = compilationUnits->mSectionCode;
|
mCodeSection = compilationUnits->mSectionCode;
|
||||||
mDataSection = compilationUnits->mSectionData;
|
mDataSection = compilationUnits->mSectionData;
|
||||||
mBSSection = compilationUnits->mSectionBSS;
|
mBSSection = compilationUnits->mSectionBSS;
|
||||||
|
|
||||||
|
for (int i = 0; i < 256; i++)
|
||||||
|
mCharMap[i] = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
Parser::~Parser(void)
|
Parser::~Parser(void)
|
||||||
|
@ -638,7 +641,14 @@ Expression* Parser::ParseInitExpression(Declaration* dtype)
|
||||||
|
|
||||||
if (strlen(mScanner->mTokenString) < dtype->mSize)
|
if (strlen(mScanner->mTokenString) < dtype->mSize)
|
||||||
{
|
{
|
||||||
strcpy_s((char *)d, dec->mSize, mScanner->mTokenString);
|
int i = 0;
|
||||||
|
while (i < dec->mSize && mScanner->mTokenString[i])
|
||||||
|
{
|
||||||
|
d[i] = mCharMap[mScanner->mTokenString[i]];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (i < dec->mSize)
|
||||||
|
d[i] = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
mErrors->Error(mScanner->mLocation, EERR_CONSTANT_INITIALIZER, "String constant is too large for char array");
|
mErrors->Error(mScanner->mLocation, EERR_CONSTANT_INITIALIZER, "String constant is too large for char array");
|
||||||
|
@ -920,6 +930,16 @@ Expression* Parser::ParseSimpleExpression(void)
|
||||||
case TK_STATIC:
|
case TK_STATIC:
|
||||||
exp = ParseDeclarationExpression();
|
exp = ParseDeclarationExpression();
|
||||||
break;
|
break;
|
||||||
|
case TK_CHARACTER:
|
||||||
|
dec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER);
|
||||||
|
dec->mInteger = mCharMap[mScanner->mTokenInteger];
|
||||||
|
dec->mBase = TheUnsignedIntTypeDeclaration;
|
||||||
|
exp = new Expression(mScanner->mLocation, EX_CONSTANT);
|
||||||
|
exp->mDecValue = dec;
|
||||||
|
exp->mDecType = dec->mBase;
|
||||||
|
|
||||||
|
mScanner->NextToken();
|
||||||
|
break;
|
||||||
case TK_INTEGER:
|
case TK_INTEGER:
|
||||||
dec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER);
|
dec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER);
|
||||||
dec->mInteger = mScanner->mTokenInteger;
|
dec->mInteger = mScanner->mTokenInteger;
|
||||||
|
@ -988,7 +1008,14 @@ Expression* Parser::ParseSimpleExpression(void)
|
||||||
dec->mBase->mFlags |= DTF_DEFINED;
|
dec->mBase->mFlags |= DTF_DEFINED;
|
||||||
uint8* d = new uint8[dec->mSize];
|
uint8* d = new uint8[dec->mSize];
|
||||||
dec->mData = d;
|
dec->mData = d;
|
||||||
memcpy(d, mScanner->mTokenString, dec->mSize);
|
|
||||||
|
int i = 0;
|
||||||
|
while (mScanner->mTokenString[i])
|
||||||
|
{
|
||||||
|
d[i] = mCharMap[mScanner->mTokenString[i]];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
d[i] = 0;
|
||||||
|
|
||||||
exp = new Expression(mScanner->mLocation, EX_CONSTANT);
|
exp = new Expression(mScanner->mLocation, EX_CONSTANT);
|
||||||
exp->mDecValue = dec;
|
exp->mDecValue = dec;
|
||||||
|
@ -1002,7 +1029,13 @@ Expression* Parser::ParseSimpleExpression(void)
|
||||||
int s = strlen(mScanner->mTokenString);
|
int s = strlen(mScanner->mTokenString);
|
||||||
uint8* d = new uint8[dec->mSize + s];
|
uint8* d = new uint8[dec->mSize + s];
|
||||||
memcpy(d, dec->mData, dec->mSize - 1);
|
memcpy(d, dec->mData, dec->mSize - 1);
|
||||||
memcpy(d + dec->mSize - 1, mScanner->mTokenString, s + 1);
|
int i = 0;
|
||||||
|
while (mScanner->mTokenString[i])
|
||||||
|
{
|
||||||
|
d[i + dec->mSize] = mCharMap[mScanner->mTokenString[i]];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
d[i + dec->mSize] = 0;
|
||||||
dec->mSize += s;
|
dec->mSize += s;
|
||||||
delete[] dec->mData;
|
delete[] dec->mData;
|
||||||
dec->mData = d;
|
dec->mData = d;
|
||||||
|
@ -1896,6 +1929,16 @@ Expression* Parser::ParseAssemblerBaseOperand(void)
|
||||||
exp->mDecValue = dec;
|
exp->mDecValue = dec;
|
||||||
exp->mDecType = dec->mBase;
|
exp->mDecType = dec->mBase;
|
||||||
|
|
||||||
|
mScanner->NextToken();
|
||||||
|
break;
|
||||||
|
case TK_CHARACTER:
|
||||||
|
dec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER);
|
||||||
|
dec->mInteger = mCharMap[mScanner->mTokenInteger];
|
||||||
|
dec->mBase = TheUnsignedIntTypeDeclaration;
|
||||||
|
exp = new Expression(mScanner->mLocation, EX_CONSTANT);
|
||||||
|
exp->mDecValue = dec;
|
||||||
|
exp->mDecType = dec->mBase;
|
||||||
|
|
||||||
mScanner->NextToken();
|
mScanner->NextToken();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2631,7 +2674,7 @@ void Parser::ParsePragma(void)
|
||||||
|
|
||||||
for (int i = 0; i < ccount; i++)
|
for (int i = 0; i < ccount; i++)
|
||||||
{
|
{
|
||||||
mScanner->mCharMap[cindex] = ccode;
|
mCharMap[cindex] = ccode;
|
||||||
cindex = (cindex + 1) & 255;
|
cindex = (cindex + 1) & 255;
|
||||||
ccode = (ccode + 1) & 255;
|
ccode = (ccode + 1) & 255;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,9 @@ protected:
|
||||||
bool ConsumeToken(Token token);
|
bool ConsumeToken(Token token);
|
||||||
bool ConsumeTokenIf(Token token);
|
bool ConsumeTokenIf(Token token);
|
||||||
|
|
||||||
|
char mCharMap[256];
|
||||||
|
|
||||||
|
|
||||||
void ParsePragma(void);
|
void ParsePragma(void);
|
||||||
|
|
||||||
Declaration* ParseBaseTypeDeclaration(uint32 flags);
|
Declaration* ParseBaseTypeDeclaration(uint32 flags);
|
||||||
|
|
|
@ -50,6 +50,7 @@ const char* TokenNames[] = {
|
||||||
"__asm",
|
"__asm",
|
||||||
|
|
||||||
"number",
|
"number",
|
||||||
|
"char",
|
||||||
"string literal",
|
"string literal",
|
||||||
"identifier",
|
"identifier",
|
||||||
"'true'",
|
"'true'",
|
||||||
|
@ -270,9 +271,6 @@ Scanner::Scanner(Errors* errors, Preprocessor* preprocessor)
|
||||||
mDefines = new MacroDict();
|
mDefines = new MacroDict();
|
||||||
mDefineArguments = nullptr;
|
mDefineArguments = nullptr;
|
||||||
|
|
||||||
for (int i = 0; i < 256; i++)
|
|
||||||
mCharMap[i] = i;
|
|
||||||
|
|
||||||
NextChar();
|
NextChar();
|
||||||
NextToken();
|
NextToken();
|
||||||
|
|
||||||
|
@ -1233,7 +1231,7 @@ void Scanner::StringToken(char terminator)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mTokenString[n++] = mCharMap[mTokenChar];
|
mTokenString[n++] = mTokenChar;
|
||||||
}
|
}
|
||||||
|
|
||||||
mTokenString[n] = 0;
|
mTokenString[n] = 0;
|
||||||
|
@ -1301,13 +1299,13 @@ void Scanner::CharToken(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mTokenChar = mCharMap[mTokenChar];
|
mTokenChar = mTokenChar;
|
||||||
|
|
||||||
mTokenInteger = mTokenChar;
|
mTokenInteger = mTokenChar;
|
||||||
|
|
||||||
if (mLine[mOffset] && mLine[mOffset] == '\'')
|
if (mLine[mOffset] && mLine[mOffset] == '\'')
|
||||||
{
|
{
|
||||||
mToken = TK_INTEGERU;
|
mToken = TK_CHARACTER;
|
||||||
mOffset++;
|
mOffset++;
|
||||||
NextChar();
|
NextChar();
|
||||||
}
|
}
|
||||||
|
@ -1540,6 +1538,7 @@ int64 Scanner::PrepParseSimple(void)
|
||||||
|
|
||||||
switch (mToken)
|
switch (mToken)
|
||||||
{
|
{
|
||||||
|
case TK_CHARACTER:
|
||||||
case TK_INTEGER:
|
case TK_INTEGER:
|
||||||
case TK_INTEGERU:
|
case TK_INTEGERU:
|
||||||
case TK_INTEGERL:
|
case TK_INTEGERL:
|
||||||
|
|
|
@ -49,6 +49,7 @@ enum Token
|
||||||
TK_ASM,
|
TK_ASM,
|
||||||
|
|
||||||
TK_NUMBER,
|
TK_NUMBER,
|
||||||
|
TK_CHARACTER,
|
||||||
TK_STRING,
|
TK_STRING,
|
||||||
TK_IDENT,
|
TK_IDENT,
|
||||||
TK_TRUE,
|
TK_TRUE,
|
||||||
|
@ -189,8 +190,6 @@ public:
|
||||||
int mOffset;
|
int mOffset;
|
||||||
const char * mLine;
|
const char * mLine;
|
||||||
|
|
||||||
char mCharMap[256];
|
|
||||||
|
|
||||||
const Ident * mTokenIdent;
|
const Ident * mTokenIdent;
|
||||||
char mTokenString[1024], mTokenChar;
|
char mTokenString[1024], mTokenChar;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue