From bf51341750307429901a0cd468b887d5f9ef442e Mon Sep 17 00:00:00 2001 From: serr Date: Tue, 29 Apr 2025 20:10:59 +0300 Subject: [PATCH] read expr from file --- analyzers/polynomials/polynomials.y | 20 ++- analyzers/polynomials/test.txt | 1 + analyzers/polynomials/test/poly.c | 217 ---------------------------- 3 files changed, 19 insertions(+), 219 deletions(-) create mode 100644 analyzers/polynomials/test.txt delete mode 100644 analyzers/polynomials/test/poly.c diff --git a/analyzers/polynomials/polynomials.y b/analyzers/polynomials/polynomials.y index 975d74d..d35b6dd 100644 --- a/analyzers/polynomials/polynomials.y +++ b/analyzers/polynomials/polynomials.y @@ -4,6 +4,8 @@ void yyerror(const char *s); int yylex(void); + +extern FILE* yyin; %} %union { int num; char var; } @@ -41,8 +43,22 @@ void yyerror(const char *s) { fprintf(stderr, "Error: %s\n", s); } -int main() { - printf("Enter a polynomial expression:\n"); +int main(int argc, char** argv) { + if (argc != 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + FILE* input_file = fopen(argv[1], "r"); + if (!input_file) { + perror("Failed to open input file"); + return 1; + } + + yyin = input_file; + + printf("Parsing expression from file: %s\n", argv[1]); yyparse(); + fclose(input_file); + return 0; } \ No newline at end of file diff --git a/analyzers/polynomials/test.txt b/analyzers/polynomials/test.txt new file mode 100644 index 0000000..02b3b8e --- /dev/null +++ b/analyzers/polynomials/test.txt @@ -0,0 +1 @@ +2+2*2 \ No newline at end of file diff --git a/analyzers/polynomials/test/poly.c b/analyzers/polynomials/test/poly.c deleted file mode 100644 index 24c9c22..0000000 --- a/analyzers/polynomials/test/poly.c +++ /dev/null @@ -1,217 +0,0 @@ -#include -#include -#include -#include - -// Структура для представления узла выражения -typedef struct Node { - char type; - union { - int num; - char var; - struct { - struct Node *left; - struct Node *right; - } expr; - }; -} Node; - -Node* new_num_node(int num); -Node* new_var_node(char var); -Node* new_expr_node(char type, Node *left, Node *right); -void free_node(Node *node); -void print_node(Node *node); -Node* simplify(Node *node); -Node* parse_expression(char **expr); -Node* parse_term(char **expr); -Node* parse_factor(char **expr); -Node* parse_primary(char **expr); - -// Функция для создания нового узла числа -Node* new_num_node(int num) { - Node *node = (Node*)malloc(sizeof(Node)); - node->type = 'N'; - node->num = num; - return node; -} - -// Функция для создания нового узла переменной -Node* new_var_node(char var) { - Node *node = (Node*)malloc(sizeof(Node)); - node->type = 'V'; - node->var = var; - return node; -} - -// Функция для создания нового узла выражения -Node* new_expr_node(char type, Node *left, Node *right) { - Node *node = (Node*)malloc(sizeof(Node)); - node->type = type; - node->expr.left = left; - node->expr.right = right; - return node; -} - -// Функция для освобождения памяти узла -void free_node(Node *node) { - if (!node) return; - if (node->type == '+' || node->type == '-' || node->type == '*' || node->type == '/' || node->type == '^') { - free_node(node->expr.left); - free_node(node->expr.right); - } - free(node); -} - -// Функция для печати узла (отладочная) -void print_node(Node *node) { - if (!node) return; - switch (node->type) { - case 'N': - printf("%d", node->num); - break; - case 'V': - printf("%c", node->var); - break; - case '+': - case '-': - case '*': - case '/': - case '^': - printf("("); - print_node(node->expr.left); - printf(" %c ", node->type); - print_node(node->expr.right); - printf(")"); - break; - } -} - -// Функция для упрощения выражения -Node* simplify(Node *node) { - if (!node) return NULL; - - if (node->type == '*') { - Node *left = simplify(node->expr.left); - Node *right = simplify(node->expr.right); - - if (left->type == 'N' && right->type == 'N') { - return new_num_node(left->num * right->num); - } else if (left->type == 'N' && left->num == 0) { - return new_num_node(0); - } else if (right->type == 'N' && right->num == 0) { - return new_num_node(0); - } else if (left->type == 'N' && left->num == 1) { - return right; - } else if (right->type == 'N' && right->num == 1) { - return left; - } else if (left->type == 'V' && right->type == 'V' && left->var == right->var) { - return new_expr_node('^', left, new_num_node(2)); - } - - return new_expr_node('*', left, right); - } else if (node->type == '+') { - Node *left = simplify(node->expr.left); - Node *right = simplify(node->expr.right); - - if (left->type == 'N' && right->type == 'N') { - return new_num_node(left->num + right->num); - } else if (left->type == 'N' && left->num == 0) { - return right; - } else if (right->type == 'N' && right->num == 0) { - return left; - } - - return new_expr_node('+', left, right); - } else if (node->type == '-') { - Node *left = simplify(node->expr.left); - Node *right = simplify(node->expr.right); - - if (left->type == 'N' && right->type == 'N') { - return new_num_node(left->num - right->num); - } else if (right->type == 'N' && right->num == 0) { - return left; - } - - return new_expr_node('-', left, right); - } - - return node; -} - -// Функция для парсинга выражения -Node* parse_expression(char **expr) { - Node *left = parse_term(expr); - while (**expr == '+' || **expr == '-') { - char op = *((*expr)++); - Node *right = parse_term(expr); - left = new_expr_node(op, left, right); - } - return left; -} - -// Функция для парсинга терма -Node* parse_term(char **expr) { - Node *left = parse_factor(expr); - while (**expr == '*' || **expr == '/') { - char op = *((*expr)++); - Node *right = parse_factor(expr); - left = new_expr_node(op, left, right); - } - return left; -} - -// Функция для парсинга фактора -Node* parse_factor(char **expr) { - Node *left = parse_primary(expr); - if (**expr == '^') { - *expr += 1; - Node *right = parse_factor(expr); - left = new_expr_node('^', left, right); - } - return left; -} - -// Функция для парсинга первичного выражения -Node* parse_primary(char **expr) { - if (isdigit(**expr)) { - int num = 0; - while (isdigit(**expr)) { - num = num * 10 + *((*expr)++) - '0'; - } - return new_num_node(num); - } else if (isalpha(**expr)) { - char var = *((*expr)++); - return new_var_node(var); - } else if (**expr == '(') { - *expr += 1; - Node *node = parse_expression(expr); - if (**expr == ')') { - *expr += 1; - } - return node; - } - return NULL; -} - -int main() { - char expr[256]; - printf("Enter an expression: "); - fgets(expr, sizeof(expr), stdin); - - char *ptr = expr; - Node *root = parse_expression(&ptr); - - printf("Original expression: "); - print_node(root); - printf("\n"); - - Node *simplified = simplify(root); - - printf("Simplified expression: "); - print_node(simplified); - printf("\n"); - - free_node(root); - free_node(simplified); - return 0; -}