mirror of
https://github.com/krgamestudios/Toy.git
synced 2026-04-15 14:54:07 +10:00
Declare variables with a type but no value allowed
This commit is contained in:
@@ -1,9 +1,8 @@
|
|||||||
DONE: rework type system
|
DONE: rework type system
|
||||||
|
DONE: var decl with a type, but no value
|
||||||
|
|
||||||
TODO: type casting
|
TODO: type casting
|
||||||
TODO: const without a type
|
|
||||||
TODO: increment & decrement operators
|
TODO: increment & decrement operators
|
||||||
TODO: var decl with a type, but no value
|
|
||||||
TODO: a = b = c = 1;
|
TODO: a = b = c = 1;
|
||||||
TODO: are compounds shallow or deep copies?
|
TODO: are compounds shallow or deep copies?
|
||||||
TODO: conditionals
|
TODO: conditionals
|
||||||
|
|||||||
@@ -110,24 +110,25 @@ static void consumeShort(unsigned short bytes, unsigned char* tb, int* count) {
|
|||||||
*count += 2;
|
*count += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Literal parseIdentifierToValue(Interpreter* interpreter, Literal literal) {
|
static bool parseIdentifierToValue(Interpreter* interpreter, Literal* literalPtr) {
|
||||||
//this converts identifiers to values
|
//this converts identifiers to values
|
||||||
if (IS_IDENTIFIER(literal)) {
|
if (IS_IDENTIFIER(*literalPtr)) {
|
||||||
if (!getScopeVariable(interpreter->scope, literal, &literal)) {
|
if (!getScopeVariable(interpreter->scope, *literalPtr, literalPtr)) {
|
||||||
printf("Undeclared variable \"");;
|
printf("Undeclared variable \"");;
|
||||||
printLiteral(literal);
|
printLiteral(*literalPtr);
|
||||||
printf("\"\n");
|
printf("\"\n");
|
||||||
return TO_NULL_LITERAL;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return literal;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//each available statement
|
//each available statement
|
||||||
static bool execAssert(Interpreter* interpreter) {
|
static bool execAssert(Interpreter* interpreter) {
|
||||||
Literal rhs = popLiteralArray(&interpreter->stack);
|
Literal rhs = popLiteralArray(&interpreter->stack);
|
||||||
Literal lhs = parseIdentifierToValue(interpreter, popLiteralArray(&interpreter->stack));
|
Literal lhs = popLiteralArray(&interpreter->stack);
|
||||||
|
parseIdentifierToValue(interpreter, &lhs);
|
||||||
|
|
||||||
if (!IS_STRING(rhs)) {
|
if (!IS_STRING(rhs)) {
|
||||||
printf("The assert keyword needs a string as the second argument, received: ");
|
printf("The assert keyword needs a string as the second argument, received: ");
|
||||||
@@ -146,7 +147,10 @@ static bool execAssert(Interpreter* interpreter) {
|
|||||||
|
|
||||||
static bool execPrint(Interpreter* interpreter) {
|
static bool execPrint(Interpreter* interpreter) {
|
||||||
//print what is on top of the stack, then pop it
|
//print what is on top of the stack, then pop it
|
||||||
Literal lit = parseIdentifierToValue(interpreter, popLiteralArray(&interpreter->stack));
|
Literal lit = popLiteralArray(&interpreter->stack);
|
||||||
|
if (!parseIdentifierToValue(interpreter, &lit)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
printLiteralCustom(lit, interpreter->printOutput);
|
printLiteralCustom(lit, interpreter->printOutput);
|
||||||
|
|
||||||
@@ -174,7 +178,8 @@ static bool execPushLiteral(Interpreter* interpreter, bool lng) {
|
|||||||
|
|
||||||
static bool execNegate(Interpreter* interpreter) {
|
static bool execNegate(Interpreter* interpreter) {
|
||||||
//negate the top literal on the stack
|
//negate the top literal on the stack
|
||||||
Literal lit = parseIdentifierToValue(interpreter, popLiteralArray(&interpreter->stack));
|
Literal lit = popLiteralArray(&interpreter->stack);
|
||||||
|
parseIdentifierToValue(interpreter, &lit);
|
||||||
|
|
||||||
if (IS_INTEGER(lit)) {
|
if (IS_INTEGER(lit)) {
|
||||||
lit = TO_INTEGER_LITERAL(-AS_INTEGER(lit));
|
lit = TO_INTEGER_LITERAL(-AS_INTEGER(lit));
|
||||||
@@ -194,8 +199,11 @@ static bool execNegate(Interpreter* interpreter) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool execArithmetic(Interpreter* interpreter, Opcode opcode) {
|
static bool execArithmetic(Interpreter* interpreter, Opcode opcode) {
|
||||||
Literal rhs = parseIdentifierToValue(interpreter, popLiteralArray(&interpreter->stack));
|
Literal rhs = popLiteralArray(&interpreter->stack);
|
||||||
Literal lhs = parseIdentifierToValue(interpreter, popLiteralArray(&interpreter->stack));
|
Literal lhs = popLiteralArray(&interpreter->stack);
|
||||||
|
|
||||||
|
parseIdentifierToValue(interpreter, &rhs);
|
||||||
|
parseIdentifierToValue(interpreter, &lhs);
|
||||||
|
|
||||||
//type coersion
|
//type coersion
|
||||||
if (IS_FLOAT(lhs) && IS_INTEGER(rhs)) {
|
if (IS_FLOAT(lhs) && IS_INTEGER(rhs)) {
|
||||||
@@ -310,7 +318,10 @@ static bool execVarDecl(Interpreter* interpreter, bool lng) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!setScopeVariable(interpreter->scope, identifier, parseIdentifierToValue(interpreter, popLiteralArray(&interpreter->stack)), false)) {
|
Literal val = popLiteralArray(&interpreter->stack);
|
||||||
|
parseIdentifierToValue(interpreter, &val);
|
||||||
|
|
||||||
|
if (!IS_NULL(val) && !setScopeVariable(interpreter->scope, identifier, val, false)) {
|
||||||
printf("Incorrect type assigned to variable \"");
|
printf("Incorrect type assigned to variable \"");
|
||||||
printLiteral(identifier);
|
printLiteral(identifier);
|
||||||
printf("\"\n");
|
printf("\"\n");
|
||||||
@@ -321,9 +332,11 @@ static bool execVarDecl(Interpreter* interpreter, bool lng) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool execVarAssign(Interpreter* interpreter) {
|
static bool execVarAssign(Interpreter* interpreter) {
|
||||||
Literal rhs = parseIdentifierToValue(interpreter, popLiteralArray(&interpreter->stack));
|
Literal rhs = popLiteralArray(&interpreter->stack);
|
||||||
Literal lhs = popLiteralArray(&interpreter->stack);
|
Literal lhs = popLiteralArray(&interpreter->stack);
|
||||||
|
|
||||||
|
parseIdentifierToValue(interpreter, &rhs);
|
||||||
|
|
||||||
if (!IS_IDENTIFIER(lhs)) {
|
if (!IS_IDENTIFIER(lhs)) {
|
||||||
printf("Can't assign to a non-variable \"");
|
printf("Can't assign to a non-variable \"");
|
||||||
printLiteral(lhs);
|
printLiteral(lhs);
|
||||||
|
|||||||
@@ -839,7 +839,7 @@ static Literal readTypeToLiteral(Parser* parser) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
//TODO: function
|
//TODO: function?
|
||||||
|
|
||||||
case TOKEN_ANY:
|
case TOKEN_ANY:
|
||||||
AS_TYPE(literal).typeOf = LITERAL_ANY;
|
AS_TYPE(literal).typeOf = LITERAL_ANY;
|
||||||
@@ -872,7 +872,7 @@ static void varDecl(Parser* parser, Node** nodeHandle) {
|
|||||||
typeLiteral = readTypeToLiteral(parser);
|
typeLiteral = readTypeToLiteral(parser);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//default any
|
//default to non-const any
|
||||||
typeLiteral = TO_TYPE_LITERAL(LITERAL_ANY, false);
|
typeLiteral = TO_TYPE_LITERAL(LITERAL_ANY, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user