more icodeasm hacks

This commit is contained in:
rginda%netscape.com 2000-10-12 07:55:13 +00:00
parent 38e6240070
commit a7476e025b
4 changed files with 430 additions and 34 deletions

View File

@ -114,6 +114,173 @@ namespace ICodeASM {
return tl; return tl;
} }
iter
ICodeParser::ParseUInt32 (iter begin, iter end, uint32 *rval)
{
uint32 position = 0;
iter curpos;
scan_loop:
for (curpos = begin; curpos < end; ++curpos) {
switch (*curpos)
{
case '0'...'9':
position++;
break;
default:
break scan_loop;
}
}
curpos = begin;
for (; position >= 0; --position)
*rval += (*curpos++ - '0') * pow (10, position);
return curpos;
}
iter
ICodeParser::ParseDouble (iter begin, iter end, double *rval)
{
uint32 integer
iter curpos = ParseUInt32 (begin, end, *integer);
*rval = static_cast<double>(integer);
if (*curpos != '.')
return curpos;
++curpos;
uint32 position = 0;
scan_loop:
for (curpos = begin; curpos < end; ++curpos) {
switch (*curpos)
{
case '0'...'9':
*rval += (*curpos - '0') * (1 / pow (10, ++position));
break;
default:
break scan_loop;
}
}
return curpos;
}
iter
ICodeParser::ParseAlpha (iter begin, iter end, string *rval)
{
string str = new string();
scan_loop:
for (curpos = begin; curpos < end; ++curpos) {
switch (*curpos)
{
case 'a'...'z':
case 'A'...'Z':
case '0'...'9':
case '_':
str += *curpos;
break;
default:
break scan_loop;
}
}
rval = str;
return curpos;
}
iter
ICodeParser::ParseString (iter begin, iter end, string *rval)
{
char delim = *begin;
bool isTerminated = false;
string *str = new string();
if (delim != '\'' && delim != '"')
ASSERT ("|begin| does not point at a string");
scan_loop:
for (bool isEscaped = false, iter curpos = ++tl.begin; curpos < end;
++curpos) {
switch (*curpos) {
case '\\':
if (isEscaped) {
str += '\\';
isEscaped = false;
} else {
isEscaped = true;
}
break;
case 't':
if (isEscaped) {
str += '\t';
isEscaped = false;
} else {
str += 't';
}
break;
case 'n':
if (isEscaped) {
str += '\n';
isEscaped = false;
} else {
str += 'n';
}
break;
case 'r':
if (isEscaped) {
str += '\r';
isEscaped = false;
} else {
str += 'r';
}
break;
case '\n':
if (isEscaped) {
str += '\r';
isEscaped = false;
} else {
/* unescaped newline == unterminated string */
break scan_loop;
}
break;
case delim:
if (isEscaped) {
str += delim;
isEscaped = false;
} else {
++curpos;
isTerminated = true;
break scan_loop;
}
break;
default:
isEscaped = false;
str += *curpos;
}
}
if (!isTerminated)
{
delete str;
throw new ICodeParseException ("Unterminated string literal.");
}
rval = str;
return curpos;
}
iter iter
ICodeParser::ParseStatement (iter begin, iter end) ICodeParser::ParseStatement (iter begin, iter end)
{ {
@ -150,7 +317,7 @@ namespace ICodeASM {
} }
if (tl.type == ttLabel) { if (tl.type == ttLabel) {
string label_str(tl.begin, tl.end - 1); /* ignore the trailing : */ string label_str(tl.begin, tl.end - 1); /* ignore the trailing : */
mLabels[label_str] = mStatementNodes.end(); mLabels[label_str] = mStatementNodes.end();
return tl.end; return tl.end;
} else if (tl.type == ttInstruction) { } else if (tl.type == ttInstruction) {
@ -192,8 +359,37 @@ namespace ICodeASM {
CASE_TYPE(UInt32); CASE_TYPE(UInt32);
CASE_TYPE(Register); CASE_TYPE(Register);
CASE_TYPE(StringAtom); CASE_TYPE(StringAtom);
default:
break;
} }
} }
# undef CASE_TYPE
return curpos;
} }
iter
ICodeParser::ParseArgumentListOperand (iter begin, iter end,
AnyOperand *rval)
{
/* XXX this is hard, lets go shopping */
ASSERT ("Not Implemented.");
}
iter
ICodeParser::ParseBinaryOpOperand (iter begin, iter end,
AnyOperand *rval)
{
TokenLocation tl = SeekTokenStart (begin, end);
if (tl.estimate != teString)
throw new ICodeParseException ("Expected BinaryOp as a quoted string.");
string *str;
end = ParseString (tl.begin, end, str);
rval->asString = str;
return end;
}
} }
} }

View File

@ -85,9 +85,7 @@ namespace ICodeASM {
Register asRegister; Register asRegister;
bool asBool; bool asBool;
ArgumentList *asArgumentList; ArgumentList *asArgumentList;
struct { string *asString;
iter begin, end;
} asString;
}; };
struct StatementNode { struct StatementNode {
@ -105,22 +103,26 @@ namespace ICodeASM {
public: public:
void ParseSourceFromString (const string source); void ParseSourceFromString (const string source);
TokenLocation SeekTokenStart (iter begin, iter end); TokenLocation SeekTokenStart (iter begin, iter end);
iter ParseUInt32 (iter begin, iter end, uint32 *rval);
iter ParseDouble (iter begin, iter end, double *rval);
iter ParseAlpha (iter begin, iter end, string *rval);
iter ParseString (iter begin, iter end, string *rval);
iter ParseStatement (iter begin, iter end); iter ParseStatement (iter begin, iter end);
iter ParseInstruction (uint icodeID, iter start, iter end); iter ParseInstruction (uint icodeID, iter start, iter end);
iter ParseArgumentListOperand (iter start, iter end, AnyOperand *rval); iter ParseArgumentListOperand (iter begin, iter end, AnyOperand *o);
iter ParseBinaryOpOperand (iter start, iter end, AnyOperand *rval); iter ParseBinaryOpOperand (iter begin, iter end, AnyOperand *o);
iter ParseBoolOperand (iter start, iter end, AnyOperand *rval); iter ParseBoolOperand (iter begin, iter end, AnyOperand *o);
iter ParseDoubleOperand (iter start, iter end, AnyOperand *rval); iter ParseDoubleOperand (iter begin, iter end, AnyOperand *o);
iter ParseICodeModuleOperand (iter start, iter end, AnyOperand *rval); iter ParseICodeModuleOperand (iter begin, iter end, AnyOperand *o);
iter ParseJSClassOperand (iter start, iter end, AnyOperand *rval); iter ParseJSClassOperand (iter begin, iter end, AnyOperand *o);
iter ParseJSStringOperand (iter start, iter end, AnyOperand *rval); iter ParseJSStringOperand (iter begin, iter end, AnyOperand *o);
iter ParseJSFunctionOperand (iter start, iter end, AnyOperand *rval); iter ParseJSFunctionOperand (iter begin, iter end, AnyOperand *o);
iter ParseJSTypeOperand (iter start, iter end, AnyOperand *rval); iter ParseJSTypeOperand (iter begin, iter end, AnyOperand *o);
iter ParseLabelOperand (iter start, iter end, AnyOperand *rval); iter ParseLabelOperand (iter begin, iter end, AnyOperand *o);
iter ParseUInt32Operand (iter start, iter end, AnyOperand *rval); iter ParseUInt32Operand (iter begin, iter end, AnyOperand *o);
iter ParseRegisterOperand (iter start, iter end, AnyOperand *rval); iter ParseRegisterOperand (iter begin, iter end, AnyOperand *o);
iter ParseStringAtomOperand (iter start, iter end, AnyOperand *rval); iter ParseStringAtomOperand (iter begin, iter end, AnyOperand *o);
}; };
} }

View File

@ -114,6 +114,173 @@ namespace ICodeASM {
return tl; return tl;
} }
iter
ICodeParser::ParseUInt32 (iter begin, iter end, uint32 *rval)
{
uint32 position = 0;
iter curpos;
scan_loop:
for (curpos = begin; curpos < end; ++curpos) {
switch (*curpos)
{
case '0'...'9':
position++;
break;
default:
break scan_loop;
}
}
curpos = begin;
for (; position >= 0; --position)
*rval += (*curpos++ - '0') * pow (10, position);
return curpos;
}
iter
ICodeParser::ParseDouble (iter begin, iter end, double *rval)
{
uint32 integer
iter curpos = ParseUInt32 (begin, end, *integer);
*rval = static_cast<double>(integer);
if (*curpos != '.')
return curpos;
++curpos;
uint32 position = 0;
scan_loop:
for (curpos = begin; curpos < end; ++curpos) {
switch (*curpos)
{
case '0'...'9':
*rval += (*curpos - '0') * (1 / pow (10, ++position));
break;
default:
break scan_loop;
}
}
return curpos;
}
iter
ICodeParser::ParseAlpha (iter begin, iter end, string *rval)
{
string str = new string();
scan_loop:
for (curpos = begin; curpos < end; ++curpos) {
switch (*curpos)
{
case 'a'...'z':
case 'A'...'Z':
case '0'...'9':
case '_':
str += *curpos;
break;
default:
break scan_loop;
}
}
rval = str;
return curpos;
}
iter
ICodeParser::ParseString (iter begin, iter end, string *rval)
{
char delim = *begin;
bool isTerminated = false;
string *str = new string();
if (delim != '\'' && delim != '"')
ASSERT ("|begin| does not point at a string");
scan_loop:
for (bool isEscaped = false, iter curpos = ++tl.begin; curpos < end;
++curpos) {
switch (*curpos) {
case '\\':
if (isEscaped) {
str += '\\';
isEscaped = false;
} else {
isEscaped = true;
}
break;
case 't':
if (isEscaped) {
str += '\t';
isEscaped = false;
} else {
str += 't';
}
break;
case 'n':
if (isEscaped) {
str += '\n';
isEscaped = false;
} else {
str += 'n';
}
break;
case 'r':
if (isEscaped) {
str += '\r';
isEscaped = false;
} else {
str += 'r';
}
break;
case '\n':
if (isEscaped) {
str += '\r';
isEscaped = false;
} else {
/* unescaped newline == unterminated string */
break scan_loop;
}
break;
case delim:
if (isEscaped) {
str += delim;
isEscaped = false;
} else {
++curpos;
isTerminated = true;
break scan_loop;
}
break;
default:
isEscaped = false;
str += *curpos;
}
}
if (!isTerminated)
{
delete str;
throw new ICodeParseException ("Unterminated string literal.");
}
rval = str;
return curpos;
}
iter iter
ICodeParser::ParseStatement (iter begin, iter end) ICodeParser::ParseStatement (iter begin, iter end)
{ {
@ -150,7 +317,7 @@ namespace ICodeASM {
} }
if (tl.type == ttLabel) { if (tl.type == ttLabel) {
string label_str(tl.begin, tl.end - 1); /* ignore the trailing : */ string label_str(tl.begin, tl.end - 1); /* ignore the trailing : */
mLabels[label_str] = mStatementNodes.end(); mLabels[label_str] = mStatementNodes.end();
return tl.end; return tl.end;
} else if (tl.type == ttInstruction) { } else if (tl.type == ttInstruction) {
@ -192,8 +359,37 @@ namespace ICodeASM {
CASE_TYPE(UInt32); CASE_TYPE(UInt32);
CASE_TYPE(Register); CASE_TYPE(Register);
CASE_TYPE(StringAtom); CASE_TYPE(StringAtom);
default:
break;
} }
} }
# undef CASE_TYPE
return curpos;
} }
iter
ICodeParser::ParseArgumentListOperand (iter begin, iter end,
AnyOperand *rval)
{
/* XXX this is hard, lets go shopping */
ASSERT ("Not Implemented.");
}
iter
ICodeParser::ParseBinaryOpOperand (iter begin, iter end,
AnyOperand *rval)
{
TokenLocation tl = SeekTokenStart (begin, end);
if (tl.estimate != teString)
throw new ICodeParseException ("Expected BinaryOp as a quoted string.");
string *str;
end = ParseString (tl.begin, end, str);
rval->asString = str;
return end;
}
} }
} }

View File

@ -85,9 +85,7 @@ namespace ICodeASM {
Register asRegister; Register asRegister;
bool asBool; bool asBool;
ArgumentList *asArgumentList; ArgumentList *asArgumentList;
struct { string *asString;
iter begin, end;
} asString;
}; };
struct StatementNode { struct StatementNode {
@ -105,22 +103,26 @@ namespace ICodeASM {
public: public:
void ParseSourceFromString (const string source); void ParseSourceFromString (const string source);
TokenLocation SeekTokenStart (iter begin, iter end); TokenLocation SeekTokenStart (iter begin, iter end);
iter ParseUInt32 (iter begin, iter end, uint32 *rval);
iter ParseDouble (iter begin, iter end, double *rval);
iter ParseAlpha (iter begin, iter end, string *rval);
iter ParseString (iter begin, iter end, string *rval);
iter ParseStatement (iter begin, iter end); iter ParseStatement (iter begin, iter end);
iter ParseInstruction (uint icodeID, iter start, iter end); iter ParseInstruction (uint icodeID, iter start, iter end);
iter ParseArgumentListOperand (iter start, iter end, AnyOperand *rval); iter ParseArgumentListOperand (iter begin, iter end, AnyOperand *o);
iter ParseBinaryOpOperand (iter start, iter end, AnyOperand *rval); iter ParseBinaryOpOperand (iter begin, iter end, AnyOperand *o);
iter ParseBoolOperand (iter start, iter end, AnyOperand *rval); iter ParseBoolOperand (iter begin, iter end, AnyOperand *o);
iter ParseDoubleOperand (iter start, iter end, AnyOperand *rval); iter ParseDoubleOperand (iter begin, iter end, AnyOperand *o);
iter ParseICodeModuleOperand (iter start, iter end, AnyOperand *rval); iter ParseICodeModuleOperand (iter begin, iter end, AnyOperand *o);
iter ParseJSClassOperand (iter start, iter end, AnyOperand *rval); iter ParseJSClassOperand (iter begin, iter end, AnyOperand *o);
iter ParseJSStringOperand (iter start, iter end, AnyOperand *rval); iter ParseJSStringOperand (iter begin, iter end, AnyOperand *o);
iter ParseJSFunctionOperand (iter start, iter end, AnyOperand *rval); iter ParseJSFunctionOperand (iter begin, iter end, AnyOperand *o);
iter ParseJSTypeOperand (iter start, iter end, AnyOperand *rval); iter ParseJSTypeOperand (iter begin, iter end, AnyOperand *o);
iter ParseLabelOperand (iter start, iter end, AnyOperand *rval); iter ParseLabelOperand (iter begin, iter end, AnyOperand *o);
iter ParseUInt32Operand (iter start, iter end, AnyOperand *rval); iter ParseUInt32Operand (iter begin, iter end, AnyOperand *o);
iter ParseRegisterOperand (iter start, iter end, AnyOperand *rval); iter ParseRegisterOperand (iter begin, iter end, AnyOperand *o);
iter ParseStringAtomOperand (iter start, iter end, AnyOperand *rval); iter ParseStringAtomOperand (iter begin, iter end, AnyOperand *o);
}; };
} }