Untitled
unknown
plain_text
2 years ago
2.5 kB
7
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