]> git.lizzy.rs Git - nothing.git/blobdiff - src/script/parser.c
(#408) use stdbool in camera unit
[nothing.git] / src / script / parser.c
index 5e3ba1ae2c862233066b1085f88ce88cee0b5644..0ca6cd89b0cb04d9e9c2ece47af16c0fb44b849d 100644 (file)
@@ -5,7 +5,9 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <inttypes.h>
 
+#include "script/builtins.h"
 #include "script/parser.h"
 #include "system/lt.h"
 #include "system/lt/lt_adapters.h"
@@ -116,7 +118,7 @@ static struct ParseResult parse_string(Gc *gc, struct Token current_token)
 static struct ParseResult parse_number(Gc *gc, struct Token current_token)
 {
     char *endptr = 0;
-    const float x = strtof(current_token.begin, &endptr);
+    const long int x = strtoimax(current_token.begin, &endptr, 10);
 
     if (current_token.begin == endptr || current_token.end != endptr) {
         return parse_failure("Expected number", current_token.begin);
@@ -148,11 +150,25 @@ static struct ParseResult parse_expr(Gc *gc, struct Token current_token)
     case '(': return parse_list(gc, current_token);
     /* TODO(#292): parser does not support escaped string characters */
     case '"': return parse_string(gc, current_token);
+    case '\'': {
+        struct ParseResult result = parse_expr(gc, next_token(current_token.end));
+
+        if (result.is_error) {
+            return result;
+        }
+
+        result.expr = list(gc, 2, SYMBOL(gc, "quote"), result.expr);
+
+        return result;
+    } break;
     default: {}
     }
 
-    if (isdigit(*current_token.begin)) {
-        return parse_number(gc, current_token);
+    if (*current_token.begin == '-' || isdigit(*current_token.begin)) {
+        struct ParseResult result = parse_number(gc, current_token);
+        if (!result.is_error) {
+            return result;
+        }
     }
 
     return parse_symbol(gc, current_token);