LibJS: Implement null and undefined literals

This commit is contained in:
0xtechnobabble 2020-03-15 23:32:34 +02:00 committed by Andreas Kling
parent 7aad10d984
commit cfd710eb31
Notes: sideshowbarker 2024-07-19 08:16:59 +09:00
6 changed files with 61 additions and 0 deletions

View file

@ -349,6 +349,18 @@ void BooleanLiteral::dump(int indent) const
printf("BooleanLiteral %s\n", m_value ? "true" : "false");
}
void UndefinedLiteral::dump(int indent) const
{
print_indent(indent);
printf("undefined\n");
}
void NullLiteral::dump(int indent) const
{
print_indent(indent);
printf("null\n");
}
void FunctionDeclaration::dump(int indent) const
{
bool first_time = true;
@ -617,4 +629,14 @@ Value BooleanLiteral::execute(Interpreter&) const
return Value(m_value);
}
Value UndefinedLiteral::execute(Interpreter&) const
{
return js_undefined();
}
Value NullLiteral::execute(Interpreter&) const
{
return js_null();
}
}

View file

@ -380,6 +380,34 @@ private:
String m_value;
};
class NullLiteral final : public Literal {
public:
explicit NullLiteral()
{
}
virtual Value execute(Interpreter&) const override;
virtual void dump(int indent) const override;
private:
virtual const char* class_name() const override { return "NullLiteral"; }
String m_value;
};
class UndefinedLiteral final : public Literal {
public:
explicit UndefinedLiteral()
{
}
virtual Value execute(Interpreter&) const override;
virtual void dump(int indent) const override;
private:
virtual const char* class_name() const override { return "UndefinedLiteral"; }
};
class Identifier final : public Expression {
public:
explicit Identifier(String string)

View file

@ -60,6 +60,7 @@ Lexer::Lexer(StringView source)
s_keywords.set("let", TokenType::Let);
s_keywords.set("new", TokenType::New);
s_keywords.set("null", TokenType::NullLiteral);
s_keywords.set("undefined", TokenType::UndefinedLiteral);
s_keywords.set("return", TokenType::Return);
s_keywords.set("true", TokenType::BoolLiteral);
s_keywords.set("try", TokenType::Try);

View file

@ -223,6 +223,12 @@ NonnullOwnPtr<Expression> Parser::parse_primary_expression()
return make<BooleanLiteral>(consume().bool_value());
case TokenType::StringLiteral:
return make<StringLiteral>(consume().string_value());
case TokenType::NullLiteral:
consume();
return make<NullLiteral>();
case TokenType::UndefinedLiteral:
consume();
return make<UndefinedLiteral>();
case TokenType::CurlyOpen:
return parse_object_expression();
default:
@ -498,6 +504,7 @@ bool Parser::match_expression() const
return type == TokenType::BoolLiteral
|| type == TokenType::NumericLiteral
|| type == TokenType::StringLiteral
|| type == TokenType::UndefinedLiteral
|| type == TokenType::NullLiteral
|| type == TokenType::Identifier
|| type == TokenType::New

View file

@ -183,6 +183,8 @@ const char* Token::name(TokenType type)
return "Try";
case TokenType::Typeof:
return "Typeof";
case TokenType::UndefinedLiteral:
return "UndefinedLiteral";
case TokenType::UnsignedShiftRight:
return "UnsignedShiftRight";
case TokenType::UnsignedShiftRightEquals:

View file

@ -107,6 +107,7 @@ enum class TokenType {
Tilde,
Try,
Typeof,
UndefinedLiteral,
UnsignedShiftRight,
UnsignedShiftRightEquals,
UnterminatedStringLiteral,