Completed lexer.

Removed dependence on strtol()

git-svn-id: http://picoc.googlecode.com/svn/trunk@7 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
zik.saleeba 2008-10-15 02:09:47 +00:00
parent d89cc62990
commit 5ddfcfd14a

35
lex.c
View file

@ -1,4 +1,3 @@
#include <stdlib.h>
#include <ctype.h> #include <ctype.h>
#include "picoc.h" #include "picoc.h"
@ -39,7 +38,6 @@ void LexInit(struct LexState *Lexer, const Str *Source, const Str *FileName, int
Lexer->FileName = FileName; Lexer->FileName = FileName;
} }
enum LexToken LexCheckReservedWord(const Str *Word) enum LexToken LexCheckReservedWord(const Str *Word)
{ {
int Count; int Count;
@ -53,14 +51,17 @@ enum LexToken LexCheckReservedWord(const Str *Word)
return TokenNone; return TokenNone;
} }
enum LexToken LexGetNumber(struct LexState *Lexer) enum LexToken LexGetNumber(struct LexState *Lexer)
{ {
Lexer->Value.Integer = strtol(Lexer->Pos, &Lexer->Pos, 10); int Result = 0;
while (Lexer->Pos != Lexer->End && isdigit(*Lexer->Pos))
Result = Result * 10 + (*Lexer->Pos - '0');
Lexer->Value.Integer = Result;
return TokenIntegerConstant; return TokenIntegerConstant;
} }
enum LexToken LexGetWord(struct LexState *Lexer) enum LexToken LexGetWord(struct LexState *Lexer)
{ {
const char *Pos = Lexer->Pos + 1; const char *Pos = Lexer->Pos + 1;
@ -80,14 +81,26 @@ enum LexToken LexGetWord(struct LexState *Lexer)
return TokenIdentifier; return TokenIdentifier;
} }
enum LexToken LexGetStringConstant(struct LexState *Lexer) enum LexToken LexGetStringConstant(struct LexState *Lexer)
{ {
// XXX int Escape = FALSE;
Lexer->Pos++;
Lexer->Value.String.Str = Lexer->Pos;
while (Lexer->Pos != Lexer->End && !Escape && *Lexer->Pos != '"')
{
if (Escape)
Escape = FALSE;
else if (*Lexer->Pos == '\\')
Escape = TRUE;
}
Lexer->Value.String.Len = Lexer->Pos - Lexer->Value.String.Str;
if (*Lexer->Pos != '"')
Lexer->Pos++;
return TokenStringConstant; return TokenStringConstant;
} }
enum LexToken LexGetCharacterConstant(struct LexState *Lexer) enum LexToken LexGetCharacterConstant(struct LexState *Lexer)
{ {
Lexer->Value.Integer = Lexer->Pos[1]; Lexer->Value.Integer = Lexer->Pos[1];
@ -98,14 +111,18 @@ enum LexToken LexGetCharacterConstant(struct LexState *Lexer)
return TokenCharacterConstant; return TokenCharacterConstant;
} }
enum LexToken LexGetToken(struct LexState *Lexer) enum LexToken LexGetToken(struct LexState *Lexer)
{ {
char ThisChar; char ThisChar;
char NextChar; char NextChar;
while (Lexer->Pos != Lexer->End && isspace(*Lexer->Pos)) while (Lexer->Pos != Lexer->End && isspace(*Lexer->Pos))
{
if (*Lexer->Pos == '\n')
Lexer->Line++;
Lexer->Pos++; Lexer->Pos++;
}
if (Lexer->Pos == Lexer->End) if (Lexer->Pos == Lexer->End)
return TokenEOF; return TokenEOF;