Updated the Makefile, set debug option for the compiler, and fixed all the warnings generated by gcc with O2 optimization option for release builds.
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
CC = gcc
|
CC = gcc
|
||||||
CFLAGS=-Wall -DDEBUG
|
CFLAGS=-g -Wall -DDEBUG
|
||||||
SRCDIR=src
|
SRCDIR=src
|
||||||
OBJDIR=obj
|
OBJDIR=obj
|
||||||
SRCS=$(wildcard $(SRCDIR)/*.c)
|
SRCS=$(wildcard $(SRCDIR)/*.c)
|
||||||
@@ -31,7 +31,7 @@ $(OBJDIR):
|
|||||||
.PHONY: test
|
.PHONY: test
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -r $(BINDIR)/* $(OBJDIR)/*
|
rm -rf $(BINDIR)/* $(OBJDIR)/*
|
||||||
|
|
||||||
test:
|
test:
|
||||||
$(BIN) test.lox
|
$(BIN) test.lox
|
||||||
+19
-7
@@ -14,7 +14,7 @@ Object* VisitBinaryExpression(Expr*);
|
|||||||
int IsTruthy(Object*);
|
int IsTruthy(Object*);
|
||||||
int IsEqual(Object*, Object*);
|
int IsEqual(Object*, Object*);
|
||||||
int ConcatStringObject(Object*, const Object*);
|
int ConcatStringObject(Object*, const Object*);
|
||||||
void CheckNumberOperand(TokenType, int, ...);
|
void CheckNumberOperands(TokenType, int, ...);
|
||||||
void PrintObject(Object*);
|
void PrintObject(Object*);
|
||||||
|
|
||||||
void PrintObject(Object* o) {
|
void PrintObject(Object* o) {
|
||||||
@@ -70,54 +70,61 @@ Object* VisitBinaryExpression(Expr* expression) {
|
|||||||
|
|
||||||
switch(expression->expression.Binary.op->type) {
|
switch(expression->expression.Binary.op->type) {
|
||||||
case Greater:
|
case Greater:
|
||||||
|
CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right);
|
||||||
computed_value = left->value.number > right->value.number;
|
computed_value = left->value.number > right->value.number;
|
||||||
FreeObject(left);
|
FreeObject(left);
|
||||||
FreeObject(right);
|
FreeObject(right);
|
||||||
return CreateObject(&computed_value, TRUE);
|
return CreateObject(&computed_value, TRUE);
|
||||||
//return left > right;
|
//return left > right;
|
||||||
case Greater_Equal:
|
case Greater_Equal:
|
||||||
|
CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right);
|
||||||
computed_value = left->value.number >= right->value.number;
|
computed_value = left->value.number >= right->value.number;
|
||||||
FreeObject(left);
|
FreeObject(left);
|
||||||
FreeObject(right);
|
FreeObject(right);
|
||||||
return CreateObject(&computed_value, TRUE);
|
return CreateObject(&computed_value, TRUE);
|
||||||
//return left >= right;
|
//return left >= right;
|
||||||
case Less:
|
case Less:
|
||||||
|
CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right);
|
||||||
computed_value = left->value.number < right->value.number;
|
computed_value = left->value.number < right->value.number;
|
||||||
FreeObject(left);
|
FreeObject(left);
|
||||||
FreeObject(right);
|
FreeObject(right);
|
||||||
return CreateObject(&computed_value, TRUE);
|
return CreateObject(&computed_value, TRUE);
|
||||||
//return left < right;
|
//return left < right;
|
||||||
case Less_Equal:
|
case Less_Equal:
|
||||||
|
CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right);
|
||||||
computed_value = left->value.number <= right->value.number;
|
computed_value = left->value.number <= right->value.number;
|
||||||
FreeObject(left);
|
FreeObject(left);
|
||||||
FreeObject(right);
|
FreeObject(right);
|
||||||
return CreateObject(&computed_value, TRUE);
|
return CreateObject(&computed_value, TRUE);
|
||||||
//return left <= right;
|
//return left <= right;
|
||||||
case Bang_Equal:
|
case Bang_Equal:
|
||||||
|
CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right);
|
||||||
computed_value = !IsEqual(left, right);
|
computed_value = !IsEqual(left, right);
|
||||||
FreeObject(left);
|
FreeObject(left);
|
||||||
FreeObject(right);
|
FreeObject(right);
|
||||||
return CreateObject(&computed_value, TRUE);
|
return CreateObject(&computed_value, TRUE);
|
||||||
//return !IsEqual(left, right);
|
//return !IsEqual(left, right);
|
||||||
case Equal_Equal:
|
case Equal_Equal:
|
||||||
|
CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right);
|
||||||
computed_value = IsEqual(left, right);
|
computed_value = IsEqual(left, right);
|
||||||
FreeObject(left);
|
FreeObject(left);
|
||||||
FreeObject(right);
|
FreeObject(right);
|
||||||
return CreateObject(&computed_value, TRUE);
|
return CreateObject(&computed_value, TRUE);
|
||||||
//return IsEqual(left, right);
|
//return IsEqual(left, right);
|
||||||
case Minus:
|
case Minus:
|
||||||
|
CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right);
|
||||||
left->value.number -= right->value.number;
|
left->value.number -= right->value.number;
|
||||||
FreeObject(right);
|
FreeObject(right);
|
||||||
return left;
|
return left;
|
||||||
//return left - right;
|
//return left - right;
|
||||||
case Slash:
|
case Slash:
|
||||||
|
CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right);
|
||||||
left->value.number /= right->value.number;
|
left->value.number /= right->value.number;
|
||||||
FreeObject(right);
|
FreeObject(right);
|
||||||
return left;
|
return left;
|
||||||
//return *((double*)left) / *((double*)right);
|
//return *((double*)left) / *((double*)right);
|
||||||
case Star:
|
case Star:
|
||||||
printf("%f * %f = %f\n", left->value.number, right->value.number, left->value.number * right->value.number);
|
CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right);
|
||||||
left->value.number *= right->value.number;
|
left->value.number *= right->value.number;
|
||||||
FreeObject(right);
|
FreeObject(right);
|
||||||
return left;
|
return left;
|
||||||
@@ -158,7 +165,7 @@ Object* VisitUnaryExpression(Expr* expression) {
|
|||||||
|
|
||||||
switch (expression->expression.Unary.op->type) {
|
switch (expression->expression.Unary.op->type) {
|
||||||
case Minus:
|
case Minus:
|
||||||
CheckNumberOperand(expression->expression.Unary.op->type, right);//This needs to "throw" if the function fails.
|
CheckNumberOperands(expression->expression.Unary.op->type, 1, right);//This needs to "throw" if the function fails.
|
||||||
computed_value = -right->value.number;
|
computed_value = -right->value.number;
|
||||||
FreeObject(right);
|
FreeObject(right);
|
||||||
c = CreateObject(&computed_value, Number);
|
c = CreateObject(&computed_value, Number);
|
||||||
@@ -222,11 +229,16 @@ Object* CreateObject(const void* value, TokenType type) {
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (value) {
|
if (value) {
|
||||||
int length = strlen(value);
|
unsigned int length = strlen(value);
|
||||||
object->instance = INS_STRING;
|
object->instance = INS_STRING;
|
||||||
object->value.string = calloc(length + 1, sizeof(char));
|
object->value.string = calloc(length + 1, sizeof(char));
|
||||||
|
|
||||||
|
if (!object->value.string) {
|
||||||
|
fprintf(stderr, "Faild to calloc %u bytes for a new string Object. %s.\n", length + 1, strerror(errno));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
strncpy(object->value.string, value, length);
|
memcpy(object->value.string, value, length);
|
||||||
} else object->instance = INS_NULL; //TODO: this is most likely an error, but we'll ignore that for now.
|
} else object->instance = INS_NULL; //TODO: this is most likely an error, but we'll ignore that for now.
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -284,7 +296,7 @@ int IsEqual(Object* a, Object* b) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckNumberOperand(TokenType operator, int operandCount, ...) {
|
void CheckNumberOperands(TokenType operator, int operandCount, ...) {
|
||||||
va_list list;
|
va_list list;
|
||||||
va_start(list, operandCount);
|
va_start(list, operandCount);
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -33,7 +33,7 @@ Token* CreateToken(const char* lexeme, void* literal, int line, TokenType type)
|
|||||||
const char* mapping_result = GetLexemeMapping(type);
|
const char* mapping_result = GetLexemeMapping(type);
|
||||||
|
|
||||||
if (!mapping_result) {
|
if (!mapping_result) {
|
||||||
fprintf(stderr, "Failed to get the mapping for %s\n", lexeme);
|
fprintf(stderr, "Failed to get the mapping for TokenType value %d.\n", type);
|
||||||
free(token);
|
free(token);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user