Untitled

 avatar
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