From 6da915f09a050727e3e01c53e23b04e8d8d86f52 Mon Sep 17 00:00:00 2001 From: serr Date: Mon, 12 May 2025 22:47:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B7=D0=B0=D0=BA=D0=BE=D0=BD=D1=87=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=81=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- analyzers/polynomials/poly_calc/poly_calc.h | 5 +++ analyzers/polynomials/polynomials.l | 12 ++--- analyzers/polynomials/polynomials.y | 50 ++++++++++++++++++--- poly.txt | 11 +++-- 4 files changed, 59 insertions(+), 19 deletions(-) diff --git a/analyzers/polynomials/poly_calc/poly_calc.h b/analyzers/polynomials/poly_calc/poly_calc.h index 0aad909..30db4f9 100644 --- a/analyzers/polynomials/poly_calc/poly_calc.h +++ b/analyzers/polynomials/poly_calc/poly_calc.h @@ -14,6 +14,11 @@ typedef struct { int capacity; // вместимость массива } Polynomial; +typedef struct { + char name; + Polynomial poly; +} Variable; + // Инициализация полинома void init_polynomial(Polynomial *p); // Добавление слагаемого в полином diff --git a/analyzers/polynomials/polynomials.l b/analyzers/polynomials/polynomials.l index 5cdb416..184e197 100644 --- a/analyzers/polynomials/polynomials.l +++ b/analyzers/polynomials/polynomials.l @@ -3,8 +3,6 @@ #include "polynomials.tab.h" extern FILE *yyin; - -// Глобальная переменная для хранения разрешенной переменной char allowed_variable = 0; %} @@ -19,11 +17,9 @@ char allowed_variable = 0; } [a-z] { - // Если переменная еще не задана, запоминаем первую встреченную if (allowed_variable == 0) { allowed_variable = yytext[0]; } - // Проверяем, что текущая переменная совпадает с разрешенной else if (yytext[0] != allowed_variable) { fprintf(stderr, "Error: Only variable '%c' is allowed in this expression\n", allowed_variable); exit(1); @@ -31,17 +27,17 @@ char allowed_variable = 0; init_polynomial(&yylval.poly); add_term(&yylval.poly, 1, 1); - return VARIABLE; // переменная от которой полином + return VARIABLE; } [A-Z] { yylval.var_name = yytext[0]; - return VAR_POLY; // переменная которой присвоен полином + return VAR_POLY; } [-+*^()] { return yytext[0]; } -[ \t] ; -\n { allowed_variable = 0; } +[ \t\n] ; +\n { } . { printf("unknown: %s\n", yytext); exit(0); } %% diff --git a/analyzers/polynomials/polynomials.y b/analyzers/polynomials/polynomials.y index 05b3706..b541589 100644 --- a/analyzers/polynomials/polynomials.y +++ b/analyzers/polynomials/polynomials.y @@ -2,13 +2,37 @@ #include "C:\Users\user\Desktop\УЧЕБА\6_СЕМ\КОМПИЛЯТОРЫ\flex_bison_test\analyzers\polynomials\poly_calc\poly_calc.h" #include #include +#include void yyerror(const char *s); int yylex(); -// Объявляем внешнюю переменную для файла extern FILE *yyin; extern char allowed_variable; + +Variable variables[26]; +int variables_count = 0; + +Polynomial* find_variable(char name) { + for (int i = 0; i < variables_count; i++) { + if (variables[i].name == name) { + return &variables[i].poly; + } + } + return NULL; +} + +void add_variable(char name, Polynomial poly) { + Polynomial* existing = find_variable(name); + if (existing) { + free_polynomial(existing); + *existing = poly; + } else { + variables[variables_count].name = name; + variables[variables_count].poly = poly; + variables_count++; + } +} %} %union { @@ -42,14 +66,24 @@ line: expr SEMICOLON { free_polynomial(&$2); } | VAR_POLY EQUAL expr SEMICOLON { - printf("PEREMENNOY '%c' PRISVOENO EXPR: ", $1); - print_polynomial(&$3, allowed_variable); - free_polynomial(&$3); + //printf("Variable '%c' assigned: ", $1); + sort_polynomial(&$3); + //print_polynomial(&$3, allowed_variable); + add_variable($1, $3); } ; expr: NUMBER { $$ = $1; } | VARIABLE { $$ = $1; } + | VAR_POLY { + Polynomial* var_poly = find_variable($1); + if (var_poly) { + $$ = copy_poly(var_poly); + } else { + yyerror("Undefined variable"); + YYERROR; + } + } | '-' expr %prec UMINUS { $$ = copy_poly(&$2); for (int i = 0; i < $$.size; i++) { @@ -106,11 +140,13 @@ int main(int argc, char *argv[]) { return 1; } - // Устанавливаем файл как вход для лексера yyin = input_file; - yyparse(); - fclose(input_file); + + // Освобождаем память переменных + for (int i = 0; i < variables_count; i++) { + free_polynomial(&variables[i].poly); + } return 0; } \ No newline at end of file diff --git a/poly.txt b/poly.txt index 9da2049..629e68e 100644 --- a/poly.txt +++ b/poly.txt @@ -1,4 +1,7 @@ -2+2; -Z = 2+2; -print ((3*z^2 - 2*z + 1) * (z^3 - 4*z) + (5*z^4 - z^2)^2) - (z + 1)^4; -print (x+2)^2 +1; \ No newline at end of file +A = (x+2)^2; +A = A + A + 2; +print A; + +B = 1; +A = x + B; +print A; \ No newline at end of file