закончил с переменными
parent
6a7b3d2a99
commit
6da915f09a
|
@ -14,6 +14,11 @@ typedef struct {
|
|||
int capacity; // вместимость массива
|
||||
} Polynomial;
|
||||
|
||||
typedef struct {
|
||||
char name;
|
||||
Polynomial poly;
|
||||
} Variable;
|
||||
|
||||
// Инициализация полинома
|
||||
void init_polynomial(Polynomial *p);
|
||||
// Добавление слагаемого в полином
|
||||
|
|
|
@ -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); }
|
||||
%%
|
||||
|
||||
|
|
|
@ -2,13 +2,37 @@
|
|||
#include "C:\Users\user\Desktop\УЧЕБА\6_СЕМ\КОМПИЛЯТОРЫ\flex_bison_test\analyzers\polynomials\poly_calc\poly_calc.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
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;
|
||||
}
|
Loading…
Reference in New Issue