1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-23 18:15:06 +00:00

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
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"); 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 void FunctionDeclaration::dump(int indent) const
{ {
bool first_time = true; bool first_time = true;
@ -617,4 +629,14 @@ Value BooleanLiteral::execute(Interpreter&) const
return Value(m_value); 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; 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 { class Identifier final : public Expression {
public: public:
explicit Identifier(String string) explicit Identifier(String string)

View file

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

View file

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

View file

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

View file

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