[LANG] Fixed parsing error for built-in functions exp/log/sqrtf

This commit is contained in:
Philippe Tillet
2021-01-29 20:39:57 -05:00
parent 269ebc12e5
commit 9f9d7b8840
2 changed files with 14 additions and 13 deletions

View File

@@ -83,7 +83,7 @@ public:
Constant* ParseSizeof();
Constant* ParseAlignof();
UnaryOp* ParsePrefixIncDec(const Token* tok);
UnaryOp* ParseUnaryIntrinsicOp(const Token* tok, int op);
UnaryOp* ParseUnaryIntrinsicOp(int op);
UnaryOp* ParseUnaryOp(const Token* tok, int op);
Expr* ParseDerefOp(const Token* tok);

View File

@@ -225,7 +225,6 @@ Encoding Parser::ParseLiteral(std::string& str, const Token* tok) {
Constant* Parser::ParseConstant(const Token* tok) {
assert(tok->IsConstant());
if (tok->tag_ == Token::I_CONSTANT) {
return ParseInteger(tok);
} else if (tok->tag_ == Token::C_CONSTANT) {
@@ -401,7 +400,16 @@ Expr* Parser::ParsePostfixExpr() {
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);
}
@@ -458,11 +466,9 @@ Expr* Parser::ParseSubScripting(Expr* lhs) {
case ':':
shape.push_back(lhsShape[i++]);
break;
case Token::NEWAXIS:
shape.push_back(1);
break;
case Token::ADD:
case Token::SUB:
case Token::MAX:
@@ -472,7 +478,6 @@ Expr* Parser::ParseSubScripting(Expr* lhs) {
shape.push_back(lhsShape[i++]);
break;
}
case '^':{
Expr* expr = ParseConditionalExpr();
EnsureInteger(expr);
@@ -556,7 +561,6 @@ FuncCall* Parser::ParseFuncCall(Expr* designator) {
if (!ts_.Test(')'))
ts_.Expect(',');
}
return FuncCall::New(designator, args);
}
@@ -568,9 +572,6 @@ Expr* Parser::ParseUnaryExpr() {
case Token::SIZEOF: return ParseSizeof();
case Token::INC: 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 ParseDerefOp(tok);
case '+': return ParseUnaryOp(tok, Token::PLUS);
@@ -634,11 +635,12 @@ UnaryOp* Parser::ParsePrefixIncDec(const Token* tok) {
return UnaryOp::New(op, operand);
}
UnaryOp* Parser::ParseUnaryIntrinsicOp(const Token* tok, int op) {
UnaryOp* Parser::ParseUnaryIntrinsicOp(int op) {
ts_.Expect('(');
auto operand = ParseExpr();
ts_.Expect(')');
return UnaryOp::New(op, operand);
auto ret = UnaryOp::New(op, operand);
return ret;
}
UnaryOp* Parser::ParseUnaryOp(const Token* tok, int op) {
@@ -876,7 +878,6 @@ Expr* Parser::ParseConditionalExpr() {
return ConditionalOp::New(tok, cond, exprTrue, exprFalse);
}
return cond;
}