116 lines
2.8 KiB
Plaintext
116 lines
2.8 KiB
Plaintext
%{
|
||
#include "C:\Users\user\Desktop\УЧЕБА\6_СЕМ\КОМПИЛЯТОРЫ\flex_bison_test\analyzers\polynomials\poly_calc\poly_calc.h"
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
|
||
void yyerror(const char *s);
|
||
int yylex();
|
||
|
||
// Объявляем внешнюю переменную для файла
|
||
extern FILE *yyin;
|
||
extern char allowed_variable;
|
||
%}
|
||
|
||
%union {
|
||
Polynomial poly;
|
||
char var_name;
|
||
}
|
||
|
||
%token SEMICOLON PRINT EQUAL
|
||
%token <var_name> VAR_POLY
|
||
%token <poly> NUMBER VARIABLE
|
||
%type <poly> expr
|
||
|
||
%left '+' '-'
|
||
%left '*' '/'
|
||
%left UMINUS
|
||
%right '^'
|
||
|
||
%%
|
||
input:
|
||
| input line
|
||
;
|
||
|
||
line: expr SEMICOLON {
|
||
sort_polynomial(&$1);
|
||
free_polynomial(&$1);
|
||
}
|
||
| PRINT expr SEMICOLON {
|
||
printf("Result: ");
|
||
sort_polynomial(&$2);
|
||
print_polynomial(&$2, allowed_variable);
|
||
free_polynomial(&$2);
|
||
}
|
||
| VAR_POLY EQUAL expr SEMICOLON {
|
||
printf("PEREMENNOY '%c' PRISVOENO EXPR: ", $1);
|
||
print_polynomial(&$3, allowed_variable);
|
||
free_polynomial(&$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; }
|
||
;
|
||
%%
|
||
|
||
void yyerror(const char *s) {
|
||
fprintf(stderr, "ERROR: %s\n", s);
|
||
}
|
||
|
||
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;
|
||
} |