diff --git a/src/compiler.cpp b/src/compiler.cpp index f222e1f..53973f5 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -211,6 +211,7 @@ Result Compiler::compile_expr(Context& context, Value& expr) { case Tag::String: return compile_constant(context, expr); case Tag::Nil: + return compile_constant(context, expr); case Tag::Float: case Tag::Syntax: case Tag::Array: diff --git a/src/reader.cpp b/src/reader.cpp index 410ae60..814b644 100644 --- a/src/reader.cpp +++ b/src/reader.cpp @@ -51,6 +51,9 @@ Result Reader::read_one() { } else if (match("true") || match("false")) { auto res = read_bool(); if (res.has_value()) return res; + } else if (match("nil")) { + auto res = read_nil(); + if (res.has_value()) return res; } else if (is_string_start()) { return read_string(); } else if (match('(')) { @@ -157,6 +160,16 @@ Result Reader::read_bool() { return ERROR(ReadError); } +Result Reader::read_nil() { + if (match("nil")) { + forward(3); + if (!is_separator(get()) && !is_eof()) return ERROR(ReadError); + return Value(TRY(Nil::create())); + } + + return ERROR(ReadError); +} + Result Reader::read_string() { if (!match('"')) return ERROR(ReadError); size_t start = position_.offset + 1; diff --git a/src/reader.hpp b/src/reader.hpp index da0954c..01d7d2f 100644 --- a/src/reader.hpp +++ b/src/reader.hpp @@ -33,6 +33,7 @@ class Reader { Result read_number(); Result read_symbol(); Result read_bool(); + Result read_nil(); char32_t get(size_t offset = 0); bool match(const char* str);