Untitled
unknown
plain_text
a year ago
2.5 kB
5
Indexable
// tokenizer.c #include "token.h" #include <stdlib.h> #include <string.h> #include <stdio.h> // Функция для проверки, является ли символ цифрой int is_digit(char c) { return c >= '0' && c <= '9'; } // Функция для проверки, является ли символ пробелом int is_space(char c) { return c == ' ' || c == '\t' || c == '\n' || c == '\r'; } // Функция разбора строки на токены Token* tokenize(const char* expr, int* tokenCount) { Token* tokens = malloc(strlen(expr) * sizeof(Token)); // Выделение памяти под токены int count = 0; // Счетчик токенов for (int i = 0; expr[i] != '\0'; i++) { if (is_space(expr[i])) { continue; // Пропускаем пробельные символы } if (is_digit(expr[i]) || expr[i] == '.') { // Чтение числа (включая десятичные точки) char* end; double value = strtod(&expr[i], &end); // Преобразование строки в число int length = end - &expr[i]; // Вычисление длины числа в символах i += length - 1; // Перемещение индекса за последнюю цифру числа tokens[count].type = TOKEN_NUMBER; tokens[count].value = value; count++; } else { // Определение типа для операторов и скобок TokenType type; switch (expr[i]) { case '+': case '-': case '*': case '/': type = TOKEN_OPERATOR; break; case '(': type = TOKEN_LPAREN; break; case ')': type = TOKEN_RPAREN; break; default: // Обработка неизвестного символа printf("Unknown character: %c\n", expr[i]); free(tokens); *tokenCount = 0; return NULL; } tokens[count].type = type; tokens[count].op = expr[i]; count++; } } *tokenCount = count; // Возвращение количества токенов return tokens; }
Editor is loading...
Leave a Comment