Expression fiddling

git-svn-id: http://picoc.googlecode.com/svn/trunk@151 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
zik.saleeba 2009-03-04 10:09:56 +00:00
parent 2f4d75b3ae
commit 8020a9ca57
2 changed files with 52 additions and 6 deletions

54
parse.c
View file

@ -370,9 +370,9 @@ int ParseExpression(struct ParseState *Parser, struct Value **Result)
/* operator precedence definitions */
struct OpPrecedence
{
unsigned char PrefixPrecedence;
unsigned char PostfixPrecedence;
unsigned char BinaryPrecedence;
unsigned char PrefixPrecedence:4;
unsigned char PostfixPrecedence:4;
unsigned char InfixPrecedence:4;
};
static struct OpPrecedence OperatorPrecedence[] =
@ -382,7 +382,7 @@ static struct OpPrecedence OperatorPrecedence[] =
/* TokenMultiplyAssign, */ { 0, 0, 2 }, /* TokenDivideAssign, */ { 0, 0, 2 }, /* TokenModulusAssign, */ { 0, 0, 2 },
/* TokenShiftLeftAssign, */ { 0, 0, 2 }, /* TokenShiftRightAssign, */ { 0, 0, 2 }, /* TokenArithmeticAndAssign, */ { 0, 0, 2 },
/* TokenArithmeticOrAssign, */ { 0, 0, 2 }, /* TokenArithmeticExorAssign, */ { 0, 0, 2 },
/* TokenQuestionMark, */ { 0, 0, 3 },
/* TokenQuestionMark, */ { 0, 0, 3 }, /* TokenColon, */ { 0, 0, 0 },
/* TokenLogicalOr, */ { 0, 0, 4 },
/* TokenLogicalAnd, */ { 0, 0, 5 },
/* TokenArithmeticOr, */ { 0, 0, 6 },
@ -401,7 +401,53 @@ static struct OpPrecedence OperatorPrecedence[] =
/* parse an expression with operator precedence */
int ParseExpression(struct ParseState *Parser, struct Value **Result)
{
struct Value *LexValue;
bool PrefixState = false;
bool Done = false;
int BracketPrecedence = 0;
int Precedence = 0;
do
{
enum LexToken Token = LexGetToken(Parser, &LexValue, TRUE);
if ((int)Token <= (int)TokenCloseBracket)
{ /* it's an operator with precedence */
if (PrefixState)
{ /* expect a prefix operator */
if (OperatorPrecedence[(int)Token].PrefixPrecedence == 0)
ProgramFail(Parser, "operator not expected here");
if (Parser->Mode == RunModeRun)
{
}
}
else
{ /* expect an infix or postfix operator */
if (OperatorPrecedence[(int)Token].PostfixPrecedence != 0)
{
}
else if (OperatorPrecedence[(int)Token].InfixPrecedence != 0)
{
PrefixState = true;
}
else
ProgramFail(Parser, "operator not expected here");
}
}
else if ((int)Token <= (int)TokenCharacterConstant)
{ /* it's a value of some sort */
if (!PrefixState)
ProgramFail(Parser, "value not expected here");
PrefixState = false;
}
else
{ /* it isn't a token from an expression */
Done = true;
}
} while (!Done);
}
#endif

View file

@ -33,7 +33,7 @@ enum LexToken
TokenComma,
TokenAssign, TokenAddAssign, TokenSubtractAssign, TokenMultiplyAssign, TokenDivideAssign, TokenModulusAssign,
TokenShiftLeftAssign, TokenShiftRightAssign, TokenArithmeticAndAssign, TokenArithmeticOrAssign, TokenArithmeticExorAssign,
TokenQuestionMark,
TokenQuestionMark, TokenColon,
TokenLogicalOr,
TokenLogicalAnd,
TokenArithmeticOr,
@ -48,7 +48,7 @@ enum LexToken
TokenLeftSquareBracket, TokenRightSquareBracket, TokenDot, TokenArrow,
TokenOpenBracket, TokenCloseBracket,
TokenIdentifier, TokenIntegerConstant, TokenFPConstant, TokenStringConstant, TokenCharacterConstant,
TokenSemicolon, TokenColon, TokenEllipsis,
TokenSemicolon, TokenEllipsis,
TokenLeftBrace, TokenRightBrace,
TokenIntType, TokenCharType, TokenFloatType, TokenDoubleType, TokenVoidType, TokenEnumType,
TokenLongType, TokenSignedType, TokenShortType, TokenStructType, TokenUnionType, TokenUnsignedType, TokenTypedef,