example scripts update; new BUILD_MODE=CHECKMEM; patched some memory leaks

This commit is contained in:
cozis
2022-12-09 14:26:31 +01:00
parent 5284251e19
commit 1671d178e4
5 changed files with 94 additions and 97 deletions
+43 -49
View File
@@ -3,18 +3,17 @@ scan = import("scan.noja");
newScanner = scan.newScanner;
Scanner = scan.Scanner;
isDigit = scan.isDigit;
ord = string.ord;
fun parseString(scan: Scanner) {
assert(scan->current() == '"');
scan->consume(); # Consume the opening "
char = scan->consume(); # Consume the opening "
temp = "";
char = scan->current();
while char != '"' and char != none: {
temp = string.cat(temp, char);
scan->consume();
char = scan->current();
char = scan->consume();
}
if char == none: {
@@ -36,16 +35,17 @@ fun parseObject(scan: Scanner) {
scan->consume();
obj = {};
scan->consumeSpaces();
if scan->current() != '}': do {
char = scan->consumeSpaces();
if char != '}': do {
key, err = parseValue(scan);
if err != none:
return none, err;
if type(key) != String:
return none, "Object key isn't a string";
scan->consumeSpaces();
if scan->current() != ':':
char = scan->consumeSpaces();
if char != ':':
return none, "Missing ':' separator after key";
scan->consume();
@@ -57,11 +57,11 @@ fun parseObject(scan: Scanner) {
return none, "Duplicate key in object";
obj[key] = val;
scan->consumeSpaces();
if scan->current() == '}':
char = scan->consumeSpaces();
if char == '}':
done = true;
else {
if scan->current() != ',':
if char != ',':
return none, "Invalid character where either ',' or '}' were expected";
scan->consume(); # Consume the ","
done = false;
@@ -79,16 +79,16 @@ fun parseArray(scan: Scanner) {
array = [];
scan->consumeSpaces();
if scan->current() != ']': do {
char = scan->consumeSpaces();
if char != ']': do {
val, err = parseValue(scan);
if err != none:
return none, err;
array[count(array)] = val;
scan->consumeSpaces();
if scan->current() == ']':
char = scan->consumeSpaces();
if char == ']':
done = true;
else {
if scan->current() != ',':
@@ -105,21 +105,21 @@ fun parseArray(scan: Scanner) {
fun parseFalse(scan: Scanner) {
assert(scan->current() == 'f');
scan->consume();
char = scan->consume();
if scan->current() != 'a':
if char != 'a':
return none, "Invalid character after 'f'";
scan->consume();
char = scan->consume();
if scan->current() != 'l':
if char != 'l':
return none, "Invalid character after 'fa'";
scan->consume();
char = scan->consume();
if scan->current() != 's':
if char != 's':
return none, "Invalid character after 'fal'";
scan->consume();
char = scan->consume();
if scan->current() != 'e':
if char != 'e':
return none, "Invalid character after 'fals'";
scan->consume();
@@ -129,17 +129,17 @@ fun parseFalse(scan: Scanner) {
fun parseTrue(scan: Scanner) {
assert(scan->current() == 't');
scan->consume();
char = scan->consume();
if scan->current() != 'r':
if char != 'r':
return none, "Invalid character after 't'";
scan->consume();
char = scan->consume();
if scan->current() != 'u':
if char != 'u':
return none, "Invalid character after 'tr'";
scan->consume();
char = scan->consume();
if scan->current() != 'e':
if char != 'e':
return none, "Invalid character after 'tru'";
scan->consume();
@@ -149,17 +149,17 @@ fun parseTrue(scan: Scanner) {
fun parseNull(scan: Scanner) {
assert(scan->current() == 'n');
scan->consume();
char = scan->consume();
if scan->current() != 'u':
if char != 'u':
return none, "Invalid character after 'n'";
scan->consume();
char = scan->consume();
if scan->current() != 'l':
if char != 'l':
return none, "Invalid character after 'nu'";
scan->consume();
char = scan->consume();
if scan->current() != 'l':
if char != 'l':
return none, "Invalid character after 'nul'";
scan->consume();
@@ -167,9 +167,8 @@ fun parseNull(scan: Scanner) {
}
fun integerFromDigit(char: String) {
assert(count(char) == 1);
return string.ord(char)
- string.ord('0');
assert(isDigit(char));
return ord(char) - ord('0');
}
fun parseNumber(scan: Scanner) {
@@ -180,9 +179,8 @@ fun parseNumber(scan: Scanner) {
if char == '+' or char == '-': {
sign = {'+': 1, '-': -1}[char];
scan->consume();
char = scan->current();
char = scan->consume();
if not isDigit(char):
return none, "Invalid character after +/-";
}
@@ -194,23 +192,20 @@ fun parseNumber(scan: Scanner) {
n = integerFromDigit(char);
temp = temp * 10 + n;
scan->consume();
char = scan->current();
char = scan->consume();
} while isDigit(char);
if char == '.' and isDigit(scan->hint(1)): {
scan->consume(); # Consume the dot
char = scan->current();
char = scan->consume(); # Consume the dot
q = 1.0;
do {
q = q / 10;
n = integerFromDigit(char);
temp = temp + q * n;
scan->consume();
char = scan->current();
char = scan->consume();
} while isDigit(char);
}
@@ -240,8 +235,7 @@ fun parseValue(scan: Scanner) {
'9': parseNumber
};
scan->consumeSpaces();
char = scan->current();
char = scan->consumeSpaces();
if char == none: {
val = none;
err = "Source ended where a value was expected";