Added all remaining operators with a view to completing expression evaluation
git-svn-id: http://picoc.googlecode.com/svn/trunk@124 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
parent
127f03eb4e
commit
b6b75396dd
20
lex.c
20
lex.c
|
@ -12,6 +12,7 @@
|
||||||
#define NEXTIS(c,x,y) { if (NextChar == (c)) { Lexer->Pos++; GotToken = (x); } else GotToken = (y); }
|
#define NEXTIS(c,x,y) { if (NextChar == (c)) { Lexer->Pos++; GotToken = (x); } else GotToken = (y); }
|
||||||
#define NEXTIS3(c,x,d,y,z) { if (NextChar == (c)) { Lexer->Pos++; GotToken = (x); } else NEXTIS(d,y,z) }
|
#define NEXTIS3(c,x,d,y,z) { if (NextChar == (c)) { Lexer->Pos++; GotToken = (x); } else NEXTIS(d,y,z) }
|
||||||
#define NEXTIS4(c,x,d,y,e,z,a) { if (NextChar == (c)) { Lexer->Pos++; GotToken = (x); } else NEXTIS3(d,y,e,z,a) }
|
#define NEXTIS4(c,x,d,y,e,z,a) { if (NextChar == (c)) { Lexer->Pos++; GotToken = (x); } else NEXTIS3(d,y,e,z,a) }
|
||||||
|
#define NEXTIS3PLUS(c,x,d,y,e,z,a) { if (NextChar == (c)) { Lexer->Pos++; GotToken = (x); } else if (NextChar == (d)) { if (Lexer->Pos[1] == (e)) { Lexer->Pos += 2; GotToken = (z); } else { Lexer->Pos++; GotToken = (y); } } else GotToken = (a); }
|
||||||
#define NEXTISEXACTLY3(c,d,y,z) { if (NextChar == (c) && Lexer->Pos[1] == (d)) { Lexer->Pos += 2; GotToken = (y); } else GotToken = (z); }
|
#define NEXTISEXACTLY3(c,d,y,z) { if (NextChar == (c) && Lexer->Pos[1] == (d)) { Lexer->Pos += 2; GotToken = (y); } else GotToken = (z); }
|
||||||
|
|
||||||
static union AnyValue LexAnyValue;
|
static union AnyValue LexAnyValue;
|
||||||
|
@ -48,6 +49,7 @@ static struct ReservedWord ReservedWords[] =
|
||||||
{ "long", TokenLongType, NULL },
|
{ "long", TokenLongType, NULL },
|
||||||
{ "return", TokenReturn, NULL },
|
{ "return", TokenReturn, NULL },
|
||||||
{ "signed", TokenSignedType, NULL },
|
{ "signed", TokenSignedType, NULL },
|
||||||
|
{ "sizeof", TokenSizeof, NULL },
|
||||||
{ "short", TokenShortType, NULL },
|
{ "short", TokenShortType, NULL },
|
||||||
{ "struct", TokenStructType, NULL },
|
{ "struct", TokenStructType, NULL },
|
||||||
{ "switch", TokenSwitch, NULL },
|
{ "switch", TokenSwitch, NULL },
|
||||||
|
@ -308,22 +310,24 @@ enum LexToken LexScanGetToken(struct LexState *Lexer, struct Value **Value)
|
||||||
case '=': NEXTIS('=', TokenEquality, TokenAssign); break;
|
case '=': NEXTIS('=', TokenEquality, TokenAssign); break;
|
||||||
case '+': NEXTIS3('=', TokenAddAssign, '+', TokenIncrement, TokenPlus); break;
|
case '+': NEXTIS3('=', TokenAddAssign, '+', TokenIncrement, TokenPlus); break;
|
||||||
case '-': NEXTIS4('=', TokenSubtractAssign, '>', TokenArrow, '-', TokenDecrement, TokenMinus); break;
|
case '-': NEXTIS4('=', TokenSubtractAssign, '>', TokenArrow, '-', TokenDecrement, TokenMinus); break;
|
||||||
case '*': GotToken = TokenAsterisk; break;
|
case '*': NEXTIS('=', TokenMultiplyAssign, TokenAsterisk); break;
|
||||||
case '/': if (NextChar == '/' || NextChar == '*') LexSkipComment(Lexer, NextChar); else GotToken = TokenSlash; break;
|
case '/': if (NextChar == '/' || NextChar == '*') LexSkipComment(Lexer, NextChar); else NEXTIS('=', TokenDivideAssign, TokenSlash); break;
|
||||||
case '<': NEXTIS('=', TokenLessEqual, TokenLessThan); break;
|
case '%': NEXTIS('=', TokenModulusAssign, TokenModulus); break;
|
||||||
case '>': NEXTIS('=', TokenGreaterEqual, TokenGreaterThan); break;
|
case '<': NEXTIS3PLUS('=', TokenLessEqual, '<', TokenShiftLeft, '=', TokenShiftLeftAssign, TokenLessThan); break;
|
||||||
|
case '>': NEXTIS3PLUS('=', TokenGreaterEqual, '>', TokenShiftRight, '=', TokenShiftRightAssign, TokenGreaterThan); break;
|
||||||
case ';': GotToken = TokenSemicolon; break;
|
case ';': GotToken = TokenSemicolon; break;
|
||||||
case '&': NEXTIS('&', TokenLogicalAnd, TokenAmpersand); break;
|
case '&': NEXTIS3('=', TokenArithmeticAndAssign, '&', TokenLogicalAnd, TokenAmpersand); break;
|
||||||
case '|': NEXTIS('|', TokenLogicalOr, TokenArithmeticOr); break;
|
case '|': NEXTIS3('=', TokenArithmeticOrAssign, '|', TokenLogicalOr, TokenArithmeticOr); break;
|
||||||
case '{': GotToken = TokenLeftBrace; break;
|
case '{': GotToken = TokenLeftBrace; break;
|
||||||
case '}': GotToken = TokenRightBrace; break;
|
case '}': GotToken = TokenRightBrace; break;
|
||||||
case '[': GotToken = TokenLeftSquareBracket; break;
|
case '[': GotToken = TokenLeftSquareBracket; break;
|
||||||
case ']': GotToken = TokenRightSquareBracket; break;
|
case ']': GotToken = TokenRightSquareBracket; break;
|
||||||
case '!': GotToken = TokenUnaryNot; break;
|
case '!': NEXTIS('=', TokenNotEqual, TokenUnaryNot); break;
|
||||||
case '^': GotToken = TokenArithmeticExor; break;
|
case '^': NEXTIS('=', TokenArithmeticExorAssign, TokenArithmeticExor); break;
|
||||||
case '~': GotToken = TokenUnaryExor; break;
|
case '~': GotToken = TokenUnaryExor; break;
|
||||||
case ',': GotToken = TokenComma; break;
|
case ',': GotToken = TokenComma; break;
|
||||||
case '.': NEXTISEXACTLY3('.', '.', TokenEllipsis, TokenDot); break;
|
case '.': NEXTISEXACTLY3('.', '.', TokenEllipsis, TokenDot); break;
|
||||||
|
case '?': GotToken = TokenQuestionMark; break;
|
||||||
case ':': GotToken = TokenColon; break;
|
case ':': GotToken = TokenColon; break;
|
||||||
default: LexFail(Lexer, "illegal character '%c'", ThisChar); break;
|
default: LexFail(Lexer, "illegal character '%c'", ThisChar); break;
|
||||||
}
|
}
|
||||||
|
|
12
picoc.h
12
picoc.h
|
@ -33,15 +33,17 @@ enum LexToken
|
||||||
TokenNone, TokenEOF, TokenEndOfLine,
|
TokenNone, TokenEOF, TokenEndOfLine,
|
||||||
TokenIdentifier, TokenIntegerConstant, TokenFPConstant, TokenStringConstant, TokenCharacterConstant,
|
TokenIdentifier, TokenIntegerConstant, TokenFPConstant, TokenStringConstant, TokenCharacterConstant,
|
||||||
TokenOpenBracket, TokenCloseBracket,
|
TokenOpenBracket, TokenCloseBracket,
|
||||||
TokenAssign, TokenPlus, TokenMinus, TokenAsterisk, TokenSlash,
|
TokenAssign, TokenPlus, TokenMinus, TokenAsterisk, TokenSlash, TokenModulus,
|
||||||
TokenEquality, TokenLessThan, TokenGreaterThan, TokenLessEqual, TokenGreaterEqual,
|
TokenEquality, TokenNotEqual, TokenLessThan, TokenGreaterThan, TokenLessEqual, TokenGreaterEqual,
|
||||||
TokenSemicolon, TokenComma, TokenDot, TokenColon, TokenEllipsis,
|
TokenSemicolon, TokenComma, TokenDot, TokenQuestionMark, TokenColon, TokenEllipsis,
|
||||||
TokenArrow, TokenAmpersand,
|
TokenArrow, TokenAmpersand,
|
||||||
TokenLeftBrace, TokenRightBrace,
|
TokenLeftBrace, TokenRightBrace,
|
||||||
TokenLeftSquareBracket, TokenRightSquareBracket,
|
TokenLeftSquareBracket, TokenRightSquareBracket,
|
||||||
TokenLogicalAnd, TokenLogicalOr, TokenArithmeticOr, TokenArithmeticExor, TokenUnaryExor, TokenUnaryNot,
|
TokenLogicalAnd, TokenLogicalOr, TokenArithmeticOr, TokenArithmeticExor, TokenUnaryExor, TokenUnaryNot,
|
||||||
TokenAddAssign, TokenSubtractAssign,
|
TokenAddAssign, TokenSubtractAssign, TokenMultiplyAssign, TokenDivideAssign, TokenModulusAssign,
|
||||||
TokenIncrement, TokenDecrement,
|
TokenShiftLeft, TokenShiftRight,
|
||||||
|
TokenShiftLeftAssign, TokenShiftRightAssign, TokenArithmeticAndAssign, TokenArithmeticOrAssign, TokenArithmeticExorAssign,
|
||||||
|
TokenIncrement, TokenDecrement, TokenSizeof,
|
||||||
TokenIntType, TokenCharType, TokenFloatType, TokenDoubleType, TokenVoidType, TokenEnumType,
|
TokenIntType, TokenCharType, TokenFloatType, TokenDoubleType, TokenVoidType, TokenEnumType,
|
||||||
TokenLongType, TokenSignedType, TokenShortType, TokenStructType, TokenUnionType, TokenUnsignedType, TokenTypedef,
|
TokenLongType, TokenSignedType, TokenShortType, TokenStructType, TokenUnionType, TokenUnsignedType, TokenTypedef,
|
||||||
TokenContinue, TokenDo, TokenElse, TokenFor, TokenIf, TokenWhile, TokenBreak, TokenSwitch, TokenCase, TokenDefault, TokenReturn,
|
TokenContinue, TokenDo, TokenElse, TokenFor, TokenIf, TokenWhile, TokenBreak, TokenSwitch, TokenCase, TokenDefault, TokenReturn,
|
||||||
|
|
Loading…
Reference in a new issue