Compare commits

..
2 Commits
Author SHA1 Message Date
Riyyi 453ca1f796 Lexer+Reader: Don't tokenize comments 2023-05-06 15:42:09 +02:00
Riyyi 534d80c35d Reader: Prevent infinite loop during List and Vector creation 2023-05-06 14:04:58 +02:00
6 changed files with 12 additions and 33 deletions
+1 -3
View File
@@ -3,12 +3,10 @@
#+LANGUAGE: en
#+OPTIONS: toc:nil
This is my implementation of the [[https://github.com/kanaka/mal][Make A Lisp]] project, done in C++20.
This is an implementation of the [[https://github.com/kanaka/mal][Make A Lisp]] project, done in C++20.
** Usage
Change the ~#if 0~ macro at the top of the ~stepX.cpp~ to ~#if 1~.
*** Run the REPL
#+BEGIN_SRC shell-script
-1
View File
@@ -168,7 +168,6 @@ ADD_FUNCTION(
return makePtr<Constant>((result) ? Constant::True : Constant::False);
});
// FIXME: (count {1}) infinite loop
ADD_FUNCTION(
"count",
{
-12
View File
@@ -256,9 +256,6 @@ bool Lexer::consumeValue()
bool Lexer::consumeComment()
{
size_t column = m_column;
std::string comment;
ignore(); // ;
static std::unordered_set<char> exit = {
@@ -275,18 +272,9 @@ bool Lexer::consumeComment()
break;
}
comment += character;
ignore();
}
// Trim comment
comment.erase(comment.begin(),
std::find_if(comment.begin(), comment.end(), [](char c) { return !std::isspace(c); }));
comment.erase(std::find_if(comment.rbegin(), comment.rend(), [](char c) { return !std::isspace(c); }).base(),
comment.end());
m_tokens.push_back({ Token::Type::Comment, m_line, column, comment });
return true;
}
-1
View File
@@ -34,7 +34,6 @@ struct Token {
String, // "foobar"
Keyword, // :keyword
Value, // number, "nil", "true", "false", symbol
Comment, // ;
Error,
};
+10 -13
View File
@@ -45,14 +45,7 @@ void Reader::read()
// Check for multiple expressions
if (!isEOF()) {
Token::Type type = peek().type;
switch (type) {
case Token::Type::Comment:
break;
default:
Error::the().add("more than one sexp in input");
break;
};
}
}
@@ -108,10 +101,6 @@ ValuePtr Reader::readImpl()
case Token::Type::Keyword: // :keyword
return readKeyword();
break;
case Token::Type::Comment: // ;
ignore();
return nullptr;
break;
case Token::Type::Value: // true, false, nil
return readValue();
break;
@@ -146,7 +135,11 @@ ValuePtr Reader::readList()
auto list = makePtr<List>();
while (!isEOF() && peek().type != Token::Type::ParenClose) {
list->add(readImpl());
auto node = readImpl();
if (node == nullptr) {
return nullptr;
}
list->add(node);
}
if (!consumeSpecific(Token { .type = Token::Type::ParenClose })) { // )
@@ -163,7 +156,11 @@ ValuePtr Reader::readVector()
auto vector = makePtr<Vector>();
while (!isEOF() && peek().type != Token::Type::BracketClose) {
vector->add(readImpl());
auto node = readImpl();
if (node == nullptr) {
return nullptr;
}
vector->add(node);
}
if (!consumeSpecific(Token { .type = Token::Type::BracketClose })) { // ]
-2
View File
@@ -24,7 +24,6 @@
#include "readline.h"
#include "settings.h"
#if 1
namespace blaze {
static blaze::Readline s_readline;
@@ -178,4 +177,3 @@ auto main(int argc, char* argv[]) -> int
return 0;
}
#endif