Вы находитесь на странице: 1из 1

Разработать транслятор для преобразования записи любой обыкновенной дроби с

необязательным знаком в конечную десятичную дробь. Записи обыкновенных дробей, в


которых числитель и знаменатель разделены символом '/', должны передаваться транслятору
строками потока стандартного ввода. Результаты трансляции должны отображаться строками
потока стандартного вывода в формате десятичных дробей с фиксированной точкой.
LEX:
LINE "/"
%{
#include "y.tab.h"
extern int yylval;
%}

%%
^[+-]?(([1-9][0-9]*)|(0))/{LINE} {yylval=atoi(yytext); return NUM;}
\/[+-]?[0]$ {yylval=atoi(yytext+1);return DEN1;}
\/[+-]?([1-9][0-9]*)$ {yylval=atoi(yytext+1); return DEN;}
([a-zA-z]*[0-9]*)* {return ER;}
\n |
. ;

YACC:
%{
#include <stdio.h>
double k=0;
%}
%start list
%token NUM DEN DEN1 ER
%%
list:
|list drob;
drob: NUM DEN { k =(double)$1/$2; printf("Result=%f \n",k); return 0;}
|NUM DEN1 {printf("ZERO FAKE"); return 0;}
|NUM ER {printf("Error"); return 0;}
;
%%
int yyerror() {
printf("Error");
}
int yywrap() {
return 0;}
main() {
yyparse();
}

Вам также может понравиться