калькулятор полиномов начал работать
parent
93df059f44
commit
d09a25663a
|
@ -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; }
|
||||
int yywrap() {
|
||||
return 1;
|
||||
}
|
|
@ -1,12 +1,22 @@
|
|||
%{
|
||||
#include "C:\Users\user\Desktop\УЧЕБА\6_СЕМ\КОМПИЛЯТОРЫ\flex_bison_test\analyzers\polynomials\poly_calc\poly_calc.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
|
||||
void yyerror(const char *s);
|
||||
int yylex();
|
||||
|
||||
// Объявляем внешнюю переменную для файла
|
||||
extern FILE *yyin;
|
||||
%}
|
||||
|
||||
%token NUMBER
|
||||
%union {
|
||||
Polynomial poly;
|
||||
}
|
||||
|
||||
%token <poly> NUMBER VARIABLE
|
||||
%type <poly> 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); }
|
||||
| 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;
|
||||
}
|
2
main.py
2
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():
|
||||
|
|
Loading…
Reference in New Issue