[LANG] Fixed parsing error for built-in functions exp/log/sqrtf
This commit is contained in:
@@ -83,7 +83,7 @@ public:
|
|||||||
Constant* ParseSizeof();
|
Constant* ParseSizeof();
|
||||||
Constant* ParseAlignof();
|
Constant* ParseAlignof();
|
||||||
UnaryOp* ParsePrefixIncDec(const Token* tok);
|
UnaryOp* ParsePrefixIncDec(const Token* tok);
|
||||||
UnaryOp* ParseUnaryIntrinsicOp(const Token* tok, int op);
|
UnaryOp* ParseUnaryIntrinsicOp(int op);
|
||||||
UnaryOp* ParseUnaryOp(const Token* tok, int op);
|
UnaryOp* ParseUnaryOp(const Token* tok, int op);
|
||||||
Expr* ParseDerefOp(const Token* tok);
|
Expr* ParseDerefOp(const Token* tok);
|
||||||
|
|
||||||
|
@@ -225,7 +225,6 @@ Encoding Parser::ParseLiteral(std::string& str, const Token* tok) {
|
|||||||
|
|
||||||
Constant* Parser::ParseConstant(const Token* tok) {
|
Constant* Parser::ParseConstant(const Token* tok) {
|
||||||
assert(tok->IsConstant());
|
assert(tok->IsConstant());
|
||||||
|
|
||||||
if (tok->tag_ == Token::I_CONSTANT) {
|
if (tok->tag_ == Token::I_CONSTANT) {
|
||||||
return ParseInteger(tok);
|
return ParseInteger(tok);
|
||||||
} else if (tok->tag_ == Token::C_CONSTANT) {
|
} else if (tok->tag_ == Token::C_CONSTANT) {
|
||||||
@@ -401,7 +400,16 @@ Expr* Parser::ParsePostfixExpr() {
|
|||||||
return ParsePostfixExprTail(anony);
|
return ParsePostfixExprTail(anony);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto primExpr = ParsePrimaryExpr();
|
Expr* primExpr;
|
||||||
|
//FIXME: merge into generic array functions
|
||||||
|
if(ts_.Try(Token::EXP))
|
||||||
|
primExpr = ParseUnaryIntrinsicOp(Token::EXP);
|
||||||
|
else if(ts_.Try(Token::SQRTF))
|
||||||
|
primExpr = ParseUnaryIntrinsicOp(Token::SQRTF);
|
||||||
|
else if(ts_.Try(Token::LOG))
|
||||||
|
primExpr = ParseUnaryIntrinsicOp(Token::LOG);
|
||||||
|
else
|
||||||
|
primExpr = ParsePrimaryExpr();
|
||||||
return ParsePostfixExprTail(primExpr);
|
return ParsePostfixExprTail(primExpr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -458,11 +466,9 @@ Expr* Parser::ParseSubScripting(Expr* lhs) {
|
|||||||
case ':':
|
case ':':
|
||||||
shape.push_back(lhsShape[i++]);
|
shape.push_back(lhsShape[i++]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Token::NEWAXIS:
|
case Token::NEWAXIS:
|
||||||
shape.push_back(1);
|
shape.push_back(1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Token::ADD:
|
case Token::ADD:
|
||||||
case Token::SUB:
|
case Token::SUB:
|
||||||
case Token::MAX:
|
case Token::MAX:
|
||||||
@@ -472,7 +478,6 @@ Expr* Parser::ParseSubScripting(Expr* lhs) {
|
|||||||
shape.push_back(lhsShape[i++]);
|
shape.push_back(lhsShape[i++]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case '^':{
|
case '^':{
|
||||||
Expr* expr = ParseConditionalExpr();
|
Expr* expr = ParseConditionalExpr();
|
||||||
EnsureInteger(expr);
|
EnsureInteger(expr);
|
||||||
@@ -556,7 +561,6 @@ FuncCall* Parser::ParseFuncCall(Expr* designator) {
|
|||||||
if (!ts_.Test(')'))
|
if (!ts_.Test(')'))
|
||||||
ts_.Expect(',');
|
ts_.Expect(',');
|
||||||
}
|
}
|
||||||
|
|
||||||
return FuncCall::New(designator, args);
|
return FuncCall::New(designator, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -568,9 +572,6 @@ Expr* Parser::ParseUnaryExpr() {
|
|||||||
case Token::SIZEOF: return ParseSizeof();
|
case Token::SIZEOF: return ParseSizeof();
|
||||||
case Token::INC: return ParsePrefixIncDec(tok);
|
case Token::INC: return ParsePrefixIncDec(tok);
|
||||||
case Token::DEC: return ParsePrefixIncDec(tok);
|
case Token::DEC: return ParsePrefixIncDec(tok);
|
||||||
case Token::EXP: return ParseUnaryIntrinsicOp(tok, Token::EXP); //FIXME: merge into generic array functions
|
|
||||||
case Token::SQRTF: return ParseUnaryIntrinsicOp(tok, Token::SQRTF);
|
|
||||||
case Token::LOG: return ParseUnaryIntrinsicOp(tok, Token::LOG); //FIXME: merge into generic array functions
|
|
||||||
case '&': return ParseUnaryOp(tok, Token::ADDR);
|
case '&': return ParseUnaryOp(tok, Token::ADDR);
|
||||||
case '*': return ParseDerefOp(tok);
|
case '*': return ParseDerefOp(tok);
|
||||||
case '+': return ParseUnaryOp(tok, Token::PLUS);
|
case '+': return ParseUnaryOp(tok, Token::PLUS);
|
||||||
@@ -634,11 +635,12 @@ UnaryOp* Parser::ParsePrefixIncDec(const Token* tok) {
|
|||||||
return UnaryOp::New(op, operand);
|
return UnaryOp::New(op, operand);
|
||||||
}
|
}
|
||||||
|
|
||||||
UnaryOp* Parser::ParseUnaryIntrinsicOp(const Token* tok, int op) {
|
UnaryOp* Parser::ParseUnaryIntrinsicOp(int op) {
|
||||||
ts_.Expect('(');
|
ts_.Expect('(');
|
||||||
auto operand = ParseExpr();
|
auto operand = ParseExpr();
|
||||||
ts_.Expect(')');
|
ts_.Expect(')');
|
||||||
return UnaryOp::New(op, operand);
|
auto ret = UnaryOp::New(op, operand);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
UnaryOp* Parser::ParseUnaryOp(const Token* tok, int op) {
|
UnaryOp* Parser::ParseUnaryOp(const Token* tok, int op) {
|
||||||
@@ -876,7 +878,6 @@ Expr* Parser::ParseConditionalExpr() {
|
|||||||
|
|
||||||
return ConditionalOp::New(tok, cond, exprTrue, exprFalse);
|
return ConditionalOp::New(tok, cond, exprTrue, exprFalse);
|
||||||
}
|
}
|
||||||
|
|
||||||
return cond;
|
return cond;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user