diff --git a/analyzers/polynomials/polynomials.l b/analyzers/polynomials/polynomials.l index 20695aa..f9f2985 100644 --- a/analyzers/polynomials/polynomials.l +++ b/analyzers/polynomials/polynomials.l @@ -9,13 +9,16 @@ char allowed_variable = 0; %} %% +"print" { return PRINT; } +";" { return SEMICOLON; } +"=" { return EQUAL; } [0-9]+ { init_polynomial(&yylval.poly); add_term(&yylval.poly, atoi(yytext), 0); return NUMBER; } -[a-zA-Z] { +[a-z] { // Если переменная еще не задана, запоминаем первую встреченную if (allowed_variable == 0) { allowed_variable = yytext[0]; @@ -31,9 +34,13 @@ char allowed_variable = 0; return VARIABLE; } +[A-Z] { + return VAR_POLY; + } + [-+*^()] { return yytext[0]; } [ \t] ; -\n { return 0; } +\n { allowed_variable = 0; } . { printf("unknown: %s\n", yytext); exit(0); } %% diff --git a/analyzers/polynomials/polynomials.y b/analyzers/polynomials/polynomials.y index b22bb99..61504ab 100644 --- a/analyzers/polynomials/polynomials.y +++ b/analyzers/polynomials/polynomials.y @@ -15,6 +15,7 @@ extern char allowed_variable; Polynomial poly; } +%token SEMICOLON PRINT VAR_POLY EQUAL %token NUMBER VARIABLE %type expr @@ -25,12 +26,24 @@ extern char allowed_variable; %% input: - | input expr { + | 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 PRISVOENO EXPR: "); + print_polynomial(&$3, allowed_variable); + free_polynomial(&$3); + } ; expr: NUMBER { $$ = $1; } diff --git a/poly.txt b/poly.txt index 0753209..9da2049 100644 --- a/poly.txt +++ b/poly.txt @@ -1 +1,4 @@ -((3*x^2 - 2*x + 1) * (x^3 - 4*x) + (5*x^4 - x^2)^2) - (x + 1)^4 \ No newline at end of file +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