Declare variables with a type but no value allowed

This commit is contained in:
2022-08-19 17:52:24 +01:00
parent 574a864dd0
commit 16291bd1af
3 changed files with 29 additions and 17 deletions

View File

@@ -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

View File

@@ -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);

View File

@@ -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);
} }