/
xverizex
/
cc
Обзор
Документация
Войти
/
xverizex
/
cc
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
compiler/parse.c
137 строк
2 KB
Dmitry
Add some code
08 апр 2025, 17:35
08 апр 2025, 17:35
5f83d5a
Код
Авторство
О чём код?
#include <stdint.h> #include <stdio.h> #include <string.h> #include <stdlib.h> struct token { uint32_t type; char *name; }; static uint8_t *get_file (const char *filename) { FILE *fp = fopen (filename, "r"); fseek (fp, 0, SEEK_END); uint64_t filesize = ftell (fp); fseek (fp, 0, SEEK_SET); uint8_t *data = malloc (filesize + 1); fread (data, 1, filesize, fp); fclose (fp); data[filesize] = 0; return data; } static void parse_file (char *data_file); int main (int argc, char **argv) { if (argc < 2) { fprintf (stderr, "./app [file]\n"); exit (EXIT_FAILURE); } uint8_t *data_file = get_file (argv[1]); parse_file (data_file); } static void while_not_token (char **s) { char *ss = *s; while (*ss) { if ( (*ss == '%') || (*ss == ',') || (*ss == '.') || (*ss == ':') || (*ss == ';') || (*ss == '!') || (*ss == '+') || (*ss == ' ') || (*ss == '/') || (*ss == '\'') || (*ss == '\\') || (*ss == '-') || (*ss == '(') || (*ss == ')') || (*ss == '[') || (*ss == ']') || (*ss == '=') || (*ss == '@') || (*ss == '#') || (*ss == '$') || (*ss == '%') || (*ss == '^') || (*ss == '&') || (*ss == '\n') ) { *s = ss; return; } ss++; } *s = ss; } static void set_tok_name (struct token *tok, uint32_t indx, char *msg) { uint64_t len = strlen (msg); tok[indx].name = malloc (len + 1); memcpy (tok[indx].name, msg, len); tok[indx].name[len] = 0; } #define SKIP_SPACES while (*s == ' ') s++; static char *parse_define (struct token *tok, uint64_t *count_tok, char *s, char *e) { uint64_t indx = *count_tok; uint64_t len = s - e; if (len == 0) { set_tok_name (tok, indx, "%"); s++; while ((*s != '\n') && (*s != 0x0)) { e = s; indx++; while_not_token (&s); char temp = *s; *s = 0; if (e == s) { *s = temp; temp = s[1]; set_tok_name (tok, indx, e); s[1] = temp; } else { set_tok_name (tok, indx, e); } *s = temp; if (*s == ' ') SKIP_SPACES; if (*s == '\n') break; } } *count_tok = indx; return s; } static void parse_file (char *data_file) { struct token *tok = malloc (sizeof (struct token) * 1024); uint64_t count_tok = 0; char *s = data_file; char *e = data_file; while (*s) { if (*s == '%') { s = parse_define (tok, &count_tok, s, e); e = s; continue; } s++; } for (int i = 0; i < count_tok; i++) { printf ("%s\n", tok[i].name); } }