diff --git a/lex.c b/lex.c index fd724c3..fabe3d9 100644 --- a/lex.c +++ b/lex.c @@ -1,17 +1,23 @@ +#include + #include "picoc.h" + +#define isCidstart(c) (isalpha(c) || (c)=='_') + #define LEXINC Lexer->Pos++ #define NEXTIS(c,x,y) { if (NextChar == (c)) { LEXINC; return (x); } else return (y); } #define NEXTIS3(c,x,d,y,z) { if (NextChar == (c)) { LEXINC; return (x); } else NEXTIS(d,y,z) } #define NEXTIS4(c,x,d,y,e,z,a) { if (NextChar == (c)) { LEXINC; return (x); } else NEXTIS3(d,y,e,z,a) } + struct ReservedWord { const char *Word; enum LexToken Token; }; -static char *ReservedWords[] = +static struct ReservedWord ReservedWords[] = { { "char", TokenCharType }, { "do", TokenDo }, @@ -23,11 +29,12 @@ static char *ReservedWords[] = { "void", TokenVoidType } }; -void LexInit(struct LexState *Lexer, const Str *Source, int Line) +void LexInit(struct LexState *Lexer, const Str *Source, const Str *FileName, int Line) { Lexer->Pos = Source->Str; Lexer->End = Source->Str + Source->Len; Lexer->Line = Line; + Lexer->FileName = FileName; } @@ -37,8 +44,8 @@ enum LexToken LexCheckReservedWord(const Str *Word) for (Count = 0; Count < sizeof(ReservedWords) / sizeof(struct ReservedWord); Count++) { - if (StrEqualC(Word, ReservedWord[Count].Word)) - return ReservedWord[Count].Token; + if (StrEqualC(Word, ReservedWords[Count].Word)) + return ReservedWords[Count].Token; } return TokenNone; @@ -47,13 +54,29 @@ enum LexToken LexCheckReservedWord(const Str *Word) enum LexToken LexGetNumber(struct LexState *Lexer) { - XXX + // XXX + return TokenIntegerConstant; } enum LexToken LexGetWord(struct LexState *Lexer) { - XXX + // XXX + return TokenIdentifier; +} + + +enum LexToken LexGetStringConstant(struct LexState *Lexer) +{ + // XXX + return TokenStringConstant; +} + + +enum LexToken LexGetCharacterConstant(struct LexState *Lexer) +{ + // XXX + return TokenCharacterConstant; } @@ -83,14 +106,14 @@ enum LexToken LexGetToken(struct LexState *Lexer) case '\'': return LexGetCharacterConstant(Lexer); case '(': return TokenOpenBracket; case ')': return TokenCloseBracket; - case '=': NEXTIS('=', TokenEquality, TokenAssignment); + case '=': NEXTIS('=', TokenEquality, TokenAssign); case '+': NEXTIS3('=', TokenAddAssign, '+', TokenIncrement, TokenPlus); case '-': NEXTIS4('=', TokenSubtractAssign, '>', TokenArrow, '-', TokenDecrement, TokenMinus); case '*': return TokenAsterisk; case '/': return TokenSlash; - case '<': NEXTIS('=', TokenLessEqual, TokenLess); - case '>': NEXTIS('=', TokenGreaterEqual, TokenGreater); - case ';': return TokenSemiColon; + case '<': NEXTIS('=', TokenLessEqual, TokenLessThan); + case '>': NEXTIS('=', TokenGreaterEqual, TokenGreaterThan); + case ';': return TokenSemicolon; case '&': NEXTIS('&', TokenLogicalAnd, TokenAmpersand); case '|': NEXTIS('|', TokenLogicalOr, TokenArithmeticOr); case '{': return TokenLeftBrace; diff --git a/picoc.c b/picoc.c index 61eedde..69ffbaa 100644 --- a/picoc.c +++ b/picoc.c @@ -22,7 +22,7 @@ void ProgramError(const Str *FileName, int Line, const char *Message, ...) { va_list Args; - StrPrintf("%S:%d: ", FileName, Line) + StrPrintf("%S:%d: ", FileName, Line); va_start(Args, Message); vprintf(Message, Args); printf("\n"); diff --git a/picoc.h b/picoc.h index a2c6011..8b91ae3 100644 --- a/picoc.h +++ b/picoc.h @@ -111,6 +111,7 @@ struct LexState int Line; const char *Pos; const char *End; + const Str *FileName; }; @@ -119,7 +120,7 @@ void StrToC(char *Dest, int DestSize, const Str *Source); void StrFromC(Str *Dest, const char *Source); int StrEqual(const Str *Str1, const Str *Str2); int StrEqualC(const Str *Str1, const char *Str2); -void StrPrintf(const str *Format, ...); +void StrPrintf(const char *Format, ...); /* picoc.c */ void Fail(const char *Message, ...); @@ -132,8 +133,8 @@ void TableSet(struct Table *Tbl, const Str *Key, void *Value); void *TableLookup(struct Table *Tbl, const Str *Key); /* lex.c */ -void LexInit(const Str *Source); -enum LexToken LexGetToken(void); +void LexInit(struct LexState *Lexer, const Str *Source, const Str *FileName, int Line); +enum LexToken LexGetToken(struct LexState *Lexer); /* parse.c */ void ParseInit(void); diff --git a/str.c b/str.c index e108fd2..c8b8bcb 100644 --- a/str.c +++ b/str.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -35,21 +36,35 @@ int StrEqualC(const Str *Str1, const char *Str2) } -void StrPrintf(const str *Format, ...) +void StrPrintf(const char *Format, ...) { - char FormatBuf[MAX_FORMAT]; const char *FPos; - char *BPos; va_list Args; + Str *str; va_start(Args, Format); - for (FPos = Format, BPos = &FormatBuf[0]; *FPos != '\0'; FPos++, BPos++) + for (FPos = Format; *FPos != '\0'; FPos++) { if (*FPos == '%') { - XXX + FPos++; + switch (*FPos) + { + case 'S': + str = va_arg(Args, Str *); + fwrite(str->Str, 1, str->Len, stdout); + break; + + case 's': fputs(va_arg(Args, char *), stdout); break; + case 'd': printf("%d", va_arg(Args, int)); break; + case 'c': fputc(va_arg(Args, int), stdout); break; + case '%': fputc('%', stdout); break; + case '\0': FPos--; break; + } } - *BPos = *FPos; + else + putchar(*FPos); } + va_end(Args); }