mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 10:58:12 +00:00
LibJS: Implement ConditionalExpression (ternary "?:" operator)
This commit is contained in:
parent
522d8c5d71
commit
0622181d1f
5 changed files with 83 additions and 1 deletions
|
@ -516,6 +516,8 @@ NonnullRefPtr<Expression> Parser::parse_secondary_expression(NonnullRefPtr<Expre
|
|||
case TokenType::DoublePipe:
|
||||
consume();
|
||||
return create_ast_node<LogicalExpression>(LogicalOp::Or, move(lhs), parse_expression(min_precedence, associativity));
|
||||
case TokenType::QuestionMark:
|
||||
return parse_conditional_expression(move(lhs));
|
||||
default:
|
||||
m_parser_state.m_has_errors = true;
|
||||
expected("secondary expression (missing switch case)");
|
||||
|
@ -660,6 +662,15 @@ NonnullRefPtr<BreakStatement> Parser::parse_break_statement()
|
|||
return create_ast_node<BreakStatement>();
|
||||
}
|
||||
|
||||
NonnullRefPtr<ConditionalExpression> Parser::parse_conditional_expression(NonnullRefPtr<Expression> test)
|
||||
{
|
||||
consume(TokenType::QuestionMark);
|
||||
auto consequent = parse_expression(0);
|
||||
consume(TokenType::Colon);
|
||||
auto alternate = parse_expression(0);
|
||||
return create_ast_node<ConditionalExpression>(move(test), move(consequent), move(alternate));
|
||||
}
|
||||
|
||||
NonnullRefPtr<TryStatement> Parser::parse_try_statement()
|
||||
{
|
||||
consume(TokenType::Try);
|
||||
|
@ -865,7 +876,8 @@ bool Parser::match_secondary_expression() const
|
|||
|| type == TokenType::BracketOpen
|
||||
|| type == TokenType::PlusPlus
|
||||
|| type == TokenType::MinusMinus
|
||||
|| type == TokenType::Instanceof;
|
||||
|| type == TokenType::Instanceof
|
||||
|| type == TokenType::QuestionMark;
|
||||
}
|
||||
|
||||
bool Parser::match_statement() const
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue