From d09a25663a560ca46cb0e47ac71ba7b6b4e7279e Mon Sep 17 00:00:00 2001 From: serr Date: Mon, 12 May 2025 20:44:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BA=D0=B0=D0=BB=D1=8C=D0=BA=D1=83=D0=BB?= =?UTF-8?q?=D1=8F=D1=82=D0=BE=D1=80=20=D0=BF=D0=BE=D0=BB=D0=B8=D0=BD=D0=BE?= =?UTF-8?q?=D0=BC=D0=BE=D0=B2=20=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- analyzers/polynomials/polynomials.l | 18 ++++++- analyzers/polynomials/polynomials.y | 84 +++++++++++++++++++++++++---- main.py | 2 +- 3 files changed, 90 insertions(+), 14 deletions(-) diff --git a/analyzers/polynomials/polynomials.l b/analyzers/polynomials/polynomials.l index d778afd..7a5f0f6 100644 --- a/analyzers/polynomials/polynomials.l +++ b/analyzers/polynomials/polynomials.l @@ -1,13 +1,27 @@ %{ +#include "C:\Users\user\Desktop\УЧЕБА\6_СЕМ\КОМПИЛЯТОРЫ\flex_bison_test\analyzers\polynomials\poly_calc\poly_calc.h" #include "polynomials.tab.h" + +extern FILE *yyin; %} %% -[0-9]+ { yylval = atoi(yytext); return NUMBER; } +[0-9]+ { + init_polynomial(&yylval.poly); + add_term(&yylval.poly, atoi(yytext), 0); + return NUMBER; + } +"x" { + init_polynomial(&yylval.poly); + add_term(&yylval.poly, 1, 1); + return VARIABLE; + } [-+*^()] { return yytext[0]; } [ \t] ; \n { return 0; } . { printf("unknown: %s\n", yytext); exit(0); } %% -int yywrap() { return 1; } \ No newline at end of file +int yywrap() { + return 1; +} \ No newline at end of file diff --git a/analyzers/polynomials/polynomials.y b/analyzers/polynomials/polynomials.y index 45a1a97..cb91e95 100644 --- a/analyzers/polynomials/polynomials.y +++ b/analyzers/polynomials/polynomials.y @@ -1,12 +1,22 @@ %{ +#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; %} -%token NUMBER +%union { + Polynomial poly; +} + +%token NUMBER VARIABLE +%type expr + %left '+' '-' %left '*' '/' %left UMINUS @@ -14,16 +24,52 @@ int yylex(); %% input: - | input expr { printf("= %d\n", $2); } + | input expr { + printf("Result: "); + sort_polynomial(&$2); + print_polynomial(&$2); + free_polynomial(&$2); + } ; -expr: NUMBER { $$ = $1; } - | '-' expr %prec UMINUS { $$ = -$2; } - | expr '+' expr { $$ = $1 + $3; } - | expr '-' expr { $$ = $1 - $3; } - | expr '*' expr { $$ = $1 * $3; } - | expr '/' expr { $$ = $1 / $3; } - | expr '^' expr { $$ = pow($1, $3); } +expr: NUMBER { $$ = $1; } + | VARIABLE { $$ = $1; } + | '-' expr %prec UMINUS { + $$ = copy_poly(&$2); + for (int i = 0; i < $$.size; i++) { + $$.terms[i].coefficient *= -1; + } + free_polynomial(&$2); + } + | expr '+' expr { + $$ = add_polynomials(&$1, &$3); + free_polynomial(&$1); + free_polynomial(&$3); + } + | expr '-' expr { + $$ = sub_polynomials(&$1, &$3); + free_polynomial(&$1); + free_polynomial(&$3); + } + | expr '*' expr { + $$ = mul_polynomials(&$1, &$3); + free_polynomial(&$1); + free_polynomial(&$3); + } + | expr '^' expr { + if ($3.size != 1 || $3.terms[0].exponent != 0) { + yyerror("Exponent must be constant"); + YYERROR; + } + int degree = $3.terms[0].coefficient; + if (degree < 0) { + yyerror("Negative exponents not supported"); + YYERROR; + } + $$ = deg_poly(&$1, degree); + free_polynomial(&$1); + free_polynomial(&$3); + } | '(' expr ')' { $$ = $2; } ; %% @@ -32,7 +78,23 @@ void yyerror(const char *s) { fprintf(stderr, "ERROR: %s\n", s); } -int main() { +int main(int argc, char *argv[]) { + if (argc < 2) { + fprintf(stderr, "Usage: %s input_file\n", argv[0]); + return 1; + } + + FILE *input_file = fopen(argv[1], "r"); + if (!input_file) { + perror("Error opening file"); + return 1; + } + + // Устанавливаем файл как вход для лексера + yyin = input_file; + yyparse(); + + fclose(input_file); return 0; } \ No newline at end of file diff --git a/main.py b/main.py index 7bba5b2..3ff55c3 100644 --- a/main.py +++ b/main.py @@ -7,7 +7,7 @@ ANALYZERS_DIR = r'C:\Users\user\Desktop\УЧЕБА\6_СЕМ\КОМПИЛЯТОР FLEX_EXE_PATH = r"C:\tools\win_flex_bison\win_flex.exe" BISON_EXE_PATH = r"C:\tools\win_flex_bison\win_bison.exe" DEPENDENCY_LIST = [ - # r"C:\Users\user\Desktop\УЧЕБА\6_СЕМ\КОМПИЛЯТОРЫ\flex_bison_test\analyzers\polynomials\stack\stack.c" + r"C:\Users\user\Desktop\УЧЕБА\6_СЕМ\КОМПИЛЯТОРЫ\flex_bison_test\analyzers\polynomials\poly_calc\poly_calc.c" ] def main():