Reader: Add support for more Tokens
This commit is contained in:
+1
-1
@@ -105,8 +105,8 @@ bool Lexer::consumeSpliceUnquoteOrUnquote()
|
|||||||
{
|
{
|
||||||
size_t column = m_column;
|
size_t column = m_column;
|
||||||
|
|
||||||
|
if (peek(1) == '@') {
|
||||||
ignore(); // ~
|
ignore(); // ~
|
||||||
if (peek() == '@') {
|
|
||||||
m_tokens.push_back({ Token::Type::Special, m_line, column, "~@" });
|
m_tokens.push_back({ Token::Type::Special, m_line, column, "~@" });
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
+79
-1
@@ -73,6 +73,9 @@ ASTNode* Reader::readImpl()
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (peek().type) {
|
switch (peek().type) {
|
||||||
|
case Token::Type::Special: // ~@
|
||||||
|
return readSpliceUnquote();
|
||||||
|
break;
|
||||||
case Token::Type::ParenOpen: // (
|
case Token::Type::ParenOpen: // (
|
||||||
return readList();
|
return readList();
|
||||||
break;
|
break;
|
||||||
@@ -81,6 +84,15 @@ ASTNode* Reader::readImpl()
|
|||||||
m_error_character = ')';
|
m_error_character = ')';
|
||||||
return nullptr;
|
return nullptr;
|
||||||
break;
|
break;
|
||||||
|
case Token::Type::Quote: // '
|
||||||
|
return readQuote();
|
||||||
|
break;
|
||||||
|
case Token::Type::Backtick: // `
|
||||||
|
return readQuasiQuote();
|
||||||
|
break;
|
||||||
|
case Token::Type::Tilde: // ~
|
||||||
|
return readUnquote();
|
||||||
|
break;
|
||||||
case Token::Type::String:
|
case Token::Type::String:
|
||||||
return readString();
|
return readString();
|
||||||
break;
|
break;
|
||||||
@@ -88,10 +100,28 @@ ASTNode* Reader::readImpl()
|
|||||||
return readValue();
|
return readValue();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
// Unimplemented token
|
// Unimplemented token
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
};
|
}
|
||||||
|
|
||||||
|
ASTNode* Reader::readSpliceUnquote()
|
||||||
|
{
|
||||||
|
ignore(); // ~@
|
||||||
|
|
||||||
|
if (isEOF()) {
|
||||||
|
Error::the().addError("expected form, got EOF");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
List* list = new List();
|
||||||
|
list->addNode(new Symbol("splice-unquote"));
|
||||||
|
list->addNode(readImpl());
|
||||||
|
|
||||||
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTNode* Reader::readList()
|
ASTNode* Reader::readList()
|
||||||
@@ -111,6 +141,54 @@ ASTNode* Reader::readList()
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ASTNode* Reader::readQuote()
|
||||||
|
{
|
||||||
|
ignore(); // '
|
||||||
|
|
||||||
|
if (isEOF()) {
|
||||||
|
Error::the().addError("expected form, got EOF");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
List* list = new List();
|
||||||
|
list->addNode(new Symbol("quote"));
|
||||||
|
list->addNode(readImpl());
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASTNode* Reader::readQuasiQuote()
|
||||||
|
{
|
||||||
|
ignore(); // `
|
||||||
|
|
||||||
|
if (isEOF()) {
|
||||||
|
Error::the().addError("expected form, got EOF");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
List* list = new List();
|
||||||
|
list->addNode(new Symbol("quasiquote"));
|
||||||
|
list->addNode(readImpl());
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASTNode* Reader::readUnquote()
|
||||||
|
{
|
||||||
|
ignore(); // ~
|
||||||
|
|
||||||
|
if (isEOF()) {
|
||||||
|
Error::the().addError("expected form, got EOF");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
List* list = new List();
|
||||||
|
list->addNode(new Symbol("unquote"));
|
||||||
|
list->addNode(readImpl());
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
ASTNode* Reader::readString()
|
ASTNode* Reader::readString()
|
||||||
{
|
{
|
||||||
std::string symbol = consume().symbol;
|
std::string symbol = consume().symbol;
|
||||||
|
|||||||
@@ -34,7 +34,11 @@ private:
|
|||||||
void ignore();
|
void ignore();
|
||||||
|
|
||||||
ASTNode* readImpl();
|
ASTNode* readImpl();
|
||||||
|
ASTNode* readSpliceUnquote();
|
||||||
ASTNode* readList();
|
ASTNode* readList();
|
||||||
|
ASTNode* readQuote();
|
||||||
|
ASTNode* readQuasiQuote();
|
||||||
|
ASTNode* readUnquote();
|
||||||
ASTNode* readString();
|
ASTNode* readString();
|
||||||
ASTNode* readValue();
|
ASTNode* readValue();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user