#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"
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);
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);