LinuxForum.Fans
Тема

Доработка калькулятора в bison/yacc.

Автор: ivan_tiran 1 сообщений 741 просмотров
17.12.2014 21:35 #405650

Доброго времени суток. Взял в качестве темы курсового проекта доработку калькулятора, написанного в bison.
Там простенькие действия вроде сложения и умножения. В качестве добавочного действия в калькуляторе я взял обычный симплекс-метод (при приведении ограничений к равенствам в матрице коэффициентов должен появиться единичный минор).
калькулятор в bison

Показать
text
%{
#define    YYSTYPE    double
%}

%token DATA %left '+' '-' %left '*' '/' %%

spisok : /* Їгбв® */ | spisok '\n' | spisok wyrag '\n' {printf("\t%g\n",$2);} ; wyrag : DATA { $$=$1; } | wyrag '+' wyrag { $$=$1+$3; } | wyrag '-' wyrag { $$=$1-$3; } | wyrag '*' wyrag { $$=$1*$3; } | wyrag '/' wyrag { $$=$1/$3; } | '(' wyrag ')' { $$=$2; } ; %%

#include <stdio.h> #include <ctype.h>

main() { yyparse(); }

yyerror(s) char *s; { fprintf(stderr,"%s\n",s); }

yylex() { int c; do{ c=getchar(); }while(c==' ' || c=='\t'); if(c==EOF) return 0; if(c=='.' || isdigit(c)){ ungetc(c,stdin); scanf("%lf",&yylval); return DATA; } return c; }

К этому калькулятору я написал функцию лексического анализа, так как старая принимает только целые положительные числа.

text
inline char *proverka_double(char *shstr);

Функция вернёт строку в случае числа и NULL иначе.
Прототип основной функции решения симплекс-метода.

text
inline char *sipmlexx(double **p,int m,int n);

Сама матрица и количество ограничений и переменных.

Тестирование в мэине.

Показать
text
#include "simplex.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

#define mp 4 #define np 5

int main() { int i,j; int m=3,n=3; char *e; double **p;

double h[mp][np]= {{4,5,4,0,return_znak("->max")},//целевая функция {2,3,6,240,return_znak("<=")}, {4,2,4,200,return_znak("<=")}, {4,6,8,160,return_znak("<=")}};

p = (double**)malloc(mp * sizeof(double*)); for(i=0;i<mp;i++) p[i]=(double *)malloc(np * sizeof(double));

for(i=0;i<mp;i++) for(j=0;j<np;j++) p[i][j]=h[i][j];

show_dan(p,m,n);//вывод исходных данных printf("\n"); e=sipmlexx(p,m,n); vivod_out(e);//вывод итоговых данных free(p); free(e);

return 0; }

Первая строка в матрице соответствует целевой функции.
Последний столбец - стремлению целевой функции и знакам ограничений в уравнениях.
Предпоследний - свободные члены в ограничениях и коэффициент без x в целевой функции.
Вот как это выглядит в терминале:

Показать
[console]F = 4.000000x[1] + 5.000000x[2] + 4.000000x[3] -> max
2.000000x[1] + 3.000000x[2] + 6.000000x[3] <= 240.000000
4.000000x[1] + 2.000000x[2] + 4.000000x[3] <= 200.000000
4.000000x[1] + 6.000000x[2] + 8.000000x[3] <= 160.000000

x[1] = 40.000000
x[2] = 0.000000
x[3] = 0.000000
x[4] = 160.000000
x[5] = 40.000000
x[6] = 0.000000
F = 160.000000[/console]
.

Проблема в том, что не знаю, как уложить всё это дело в исходном калькуляторе bisona. Как-то всё замудрёно здесь. Как поменять функцию лексического анализа на свою и считать матрицу с данными?
Для одного/двух чисел там всё просто.
Кто-нибудь может помочь с bisonом?

Войдите или зарегистрируйтесь, чтобы ответить.