3 #include "system/stacktrace.h"
7 #include "./tokenizer.h"
9 static struct Token token(const char *begin, const char *end)
11 struct Token token = {
19 static bool is_symbol_char(char x)
21 static const char forbidden_symbol_chars[] = {
22 '(', ')', '"', '\'', ';', '.', '`', ','
24 static const size_t n = sizeof(forbidden_symbol_chars) / sizeof(char);
26 for (size_t i = 0; i < n; ++i) {
27 if (x == forbidden_symbol_chars[i] || isspace(x)) {
35 static const char *skip_whitespace(const char *str)
39 while(*str != 0 && isspace(*str)) {
46 static const char *next_quote(const char *str)
50 while(*str != 0 && *str != '"') {
57 static const char *skip_until_newline(const char *str)
61 while(*str != 0 && *str != '\n') {
68 static const char *next_non_symbol(const char *str)
72 while(*str != 0 && is_symbol_char(*str)) {
79 struct Token next_token(const char *str)
83 str = skip_whitespace(str);
85 return token(str, str);
88 while (*str != 0 && *str == ';') {
89 str = skip_until_newline(str + 1);
90 str = skip_whitespace(str);
100 return token(str, str + 1);
103 const char *str_end = next_quote(str + 1);
104 return token(str, *str_end == 0 ? str_end : str_end + 1);
108 return token(str, next_non_symbol(str + 1));