Bug fixes
This commit is contained in:
parent
b38f6bff25
commit
31b334ec65
2
Makefile
2
Makefile
@ -4,7 +4,7 @@
|
||||
CC = g++
|
||||
|
||||
# Compiler flags
|
||||
CFLAGS = -Wall -Wextra -std=c++17 -Wno-unused-variable -Wno-unused-parameter
|
||||
CFLAGS = -Wall -Wextra -std=c++17 -Wno-unused-variable -Wno-unused-parameter -Wno-switch
|
||||
|
||||
# Source directory
|
||||
SRC_DIR = ./source
|
||||
|
||||
@ -23,6 +23,23 @@ enum TokenType{
|
||||
END_OF_FILE
|
||||
};
|
||||
|
||||
inline std::string enum_mapping[] = {"OPEN_PAREN", "CLOSE_PAREN", "OPEN_BRACE", "CLOSE_BRACE",
|
||||
"COMMA", "DOT", "MINUS", "PLUS", "SEMICOLON", "SLASH", "STAR",
|
||||
|
||||
"BINARY_OP",
|
||||
|
||||
"BANG", "BANG_EQUAL",
|
||||
"EQUAL", "DOUBLE_EQUAL",
|
||||
"GREATER", "GREATER_EQUAL",
|
||||
"LESS", "LESS_EQUAL",
|
||||
|
||||
"IDENTIFIER", "STRING", "NUMBER",
|
||||
|
||||
"AND", "OR", "TRUE", "FALSE", "IF", "ELSE", "FUNCTION", "FOR",
|
||||
"WHILE", "VAR", "CLASS", "SUPER", "THIS", "NONE", "RETURN",
|
||||
|
||||
"END_OF_FILE"};
|
||||
|
||||
const std::map<std::string, TokenType> KEYWORDS {
|
||||
{"and", AND},
|
||||
{"or", OR},
|
||||
|
||||
@ -24,6 +24,8 @@ sptr(Object) Interpreter::visitLiteralExpr(sptr(LiteralExpr) expr) {
|
||||
}
|
||||
return msptr(Number)(num);
|
||||
}
|
||||
if(expr->value == "true") return msptr(Boolean)(true);
|
||||
if(expr->value == "false") return msptr(Boolean)(false);
|
||||
return msptr(String)(expr->value);
|
||||
}
|
||||
|
||||
@ -55,6 +57,9 @@ sptr(Object) Interpreter::visitUnaryExpr(sptr(UnaryExpr) expression)
|
||||
return msptr(Boolean)(!isTruthy(right));
|
||||
}
|
||||
|
||||
//unreachable
|
||||
throw std::runtime_error("Invalid unary expression");
|
||||
|
||||
}
|
||||
|
||||
sptr(Object) Interpreter::visitBinaryExpr(sptr(BinaryExpr) expression)
|
||||
@ -145,7 +150,7 @@ bool Interpreter::isTruthy(sptr(Object) object) {
|
||||
|
||||
if(auto boolean = std::dynamic_pointer_cast<Boolean>(object))
|
||||
{
|
||||
boolean->value;
|
||||
return boolean->value;
|
||||
}
|
||||
|
||||
if(auto obj = std::dynamic_pointer_cast<None>(object))
|
||||
@ -193,6 +198,8 @@ bool Interpreter::isEqual(sptr(Object) a, sptr(Object) b) {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
throw std::runtime_error("Invalid isEqual compariosn");
|
||||
}
|
||||
|
||||
void Interpreter::interpret(std::shared_ptr<Expr> expr) {
|
||||
@ -239,6 +246,8 @@ std::string Interpreter::stringify(std::shared_ptr<Object> object) {
|
||||
{
|
||||
return Bool->value == 1 ? "true" : "false";
|
||||
}
|
||||
|
||||
throw std::runtime_error("Could not convert object to string");
|
||||
}
|
||||
|
||||
bool Interpreter::isWholeNumer(double num) {
|
||||
|
||||
@ -287,6 +287,8 @@ char Lexer::peekNext()
|
||||
{
|
||||
return src[1];
|
||||
}
|
||||
|
||||
return '\0';
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -83,7 +83,7 @@ sptr(Expr) Parser::unary()
|
||||
|
||||
sptr(Expr) Parser::primary()
|
||||
{
|
||||
if(match({FALSE})) return msptr(LiteralExpr)("true", false, false);
|
||||
if(match({FALSE})) return msptr(LiteralExpr)("false", false, false);
|
||||
if(match({TRUE})) return msptr(LiteralExpr)("true", false, false);
|
||||
if(match({NONE})) return msptr(LiteralExpr)("none", false, false);
|
||||
|
||||
|
||||
@ -58,7 +58,7 @@ void Bob::run(string source)
|
||||
//cout << dynamic_pointer_cast<String>(printer.print(expr))->value << endl;
|
||||
|
||||
for(Token t : tokens){
|
||||
//cout << "{type: " << t.type << ", value: " << t.lexeme << "}" << endl;
|
||||
//cout << "{type: " << enum_mapping[t.type] << ", value: " << t.lexeme << "}" << endl;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user