Expression fiddling
git-svn-id: http://picoc.googlecode.com/svn/trunk@151 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
parent
2f4d75b3ae
commit
8020a9ca57
54
parse.c
54
parse.c
|
@ -370,9 +370,9 @@ int ParseExpression(struct ParseState *Parser, struct Value **Result)
|
||||||
/* operator precedence definitions */
|
/* operator precedence definitions */
|
||||||
struct OpPrecedence
|
struct OpPrecedence
|
||||||
{
|
{
|
||||||
unsigned char PrefixPrecedence;
|
unsigned char PrefixPrecedence:4;
|
||||||
unsigned char PostfixPrecedence;
|
unsigned char PostfixPrecedence:4;
|
||||||
unsigned char BinaryPrecedence;
|
unsigned char InfixPrecedence:4;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct OpPrecedence OperatorPrecedence[] =
|
static struct OpPrecedence OperatorPrecedence[] =
|
||||||
|
@ -382,7 +382,7 @@ static struct OpPrecedence OperatorPrecedence[] =
|
||||||
/* TokenMultiplyAssign, */ { 0, 0, 2 }, /* TokenDivideAssign, */ { 0, 0, 2 }, /* TokenModulusAssign, */ { 0, 0, 2 },
|
/* TokenMultiplyAssign, */ { 0, 0, 2 }, /* TokenDivideAssign, */ { 0, 0, 2 }, /* TokenModulusAssign, */ { 0, 0, 2 },
|
||||||
/* TokenShiftLeftAssign, */ { 0, 0, 2 }, /* TokenShiftRightAssign, */ { 0, 0, 2 }, /* TokenArithmeticAndAssign, */ { 0, 0, 2 },
|
/* TokenShiftLeftAssign, */ { 0, 0, 2 }, /* TokenShiftRightAssign, */ { 0, 0, 2 }, /* TokenArithmeticAndAssign, */ { 0, 0, 2 },
|
||||||
/* TokenArithmeticOrAssign, */ { 0, 0, 2 }, /* TokenArithmeticExorAssign, */ { 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 },
|
/* TokenLogicalOr, */ { 0, 0, 4 },
|
||||||
/* TokenLogicalAnd, */ { 0, 0, 5 },
|
/* TokenLogicalAnd, */ { 0, 0, 5 },
|
||||||
/* TokenArithmeticOr, */ { 0, 0, 6 },
|
/* TokenArithmeticOr, */ { 0, 0, 6 },
|
||||||
|
@ -401,7 +401,53 @@ static struct OpPrecedence OperatorPrecedence[] =
|
||||||
/* parse an expression with operator precedence */
|
/* parse an expression with operator precedence */
|
||||||
int ParseExpression(struct ParseState *Parser, struct Value **Result)
|
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
|
#endif
|
||||||
|
|
||||||
|
|
4
picoc.h
4
picoc.h
|
@ -33,7 +33,7 @@ enum LexToken
|
||||||
TokenComma,
|
TokenComma,
|
||||||
TokenAssign, TokenAddAssign, TokenSubtractAssign, TokenMultiplyAssign, TokenDivideAssign, TokenModulusAssign,
|
TokenAssign, TokenAddAssign, TokenSubtractAssign, TokenMultiplyAssign, TokenDivideAssign, TokenModulusAssign,
|
||||||
TokenShiftLeftAssign, TokenShiftRightAssign, TokenArithmeticAndAssign, TokenArithmeticOrAssign, TokenArithmeticExorAssign,
|
TokenShiftLeftAssign, TokenShiftRightAssign, TokenArithmeticAndAssign, TokenArithmeticOrAssign, TokenArithmeticExorAssign,
|
||||||
TokenQuestionMark,
|
TokenQuestionMark, TokenColon,
|
||||||
TokenLogicalOr,
|
TokenLogicalOr,
|
||||||
TokenLogicalAnd,
|
TokenLogicalAnd,
|
||||||
TokenArithmeticOr,
|
TokenArithmeticOr,
|
||||||
|
@ -48,7 +48,7 @@ enum LexToken
|
||||||
TokenLeftSquareBracket, TokenRightSquareBracket, TokenDot, TokenArrow,
|
TokenLeftSquareBracket, TokenRightSquareBracket, TokenDot, TokenArrow,
|
||||||
TokenOpenBracket, TokenCloseBracket,
|
TokenOpenBracket, TokenCloseBracket,
|
||||||
TokenIdentifier, TokenIntegerConstant, TokenFPConstant, TokenStringConstant, TokenCharacterConstant,
|
TokenIdentifier, TokenIntegerConstant, TokenFPConstant, TokenStringConstant, TokenCharacterConstant,
|
||||||
TokenSemicolon, TokenColon, TokenEllipsis,
|
TokenSemicolon, TokenEllipsis,
|
||||||
TokenLeftBrace, TokenRightBrace,
|
TokenLeftBrace, TokenRightBrace,
|
||||||
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,
|
||||||
|
|
Loading…
Reference in a new issue