- •Int yyerror(){
- •Int yywrap() {
- •Int yyerror(){
- •Int yywrap() {
- •Int yyerror()
- •Int yywrap()
- •Int yyerror()
- •Int yywrap()
- •Int yyerror()
- •Int yywrap()
- •Int yywrap() {
- •Int yyerror()
- •Int yywrap()
- •Int yyerror()
- •Int yywrap()
- •Int yyerror()
- •Int yywrap()
- •Int yyerror()
- •Int yywrap()
- •Int yyerror()
- •Int yywrap()
- •Int yyerror()
- •Int yywrap()
- •Int yywrap()
- •Int yywrap()
- •Int yyerror()
- •Int yywrap()
- •Int yyerror()
- •Int yywrap()
Int yyerror()
{puts("ERROR");}
Int yywrap()
{return 0;}
main() {yyparse();}
17)
Разработать транслятор для преобразования записи любой конечной десятичной дроби с необязательным знаком в обыкновенную дробь. Все десятичные дроби должны передаваться транслятору в экспоненциальном формате записи вещественных чисел через строки потока стандартного ввода. Результаты трансляции должны отображаться строками потока стандартного вывода, где числители и знаменатели обыкновенных дробей разделены символом '/'.
LEX:
DOT "."
%{
#include"y.tab.h"
%}
%%
^[+]/{DOT} {yylval=strdup(yytext); return SGN;}
^[-]([1-9][0-9]*)/{DOT} {yylval=strdup(yytext); return CEL;}
^[+]?(([1-9][0-9]*)|[0])/{DOT} {yylval=strdup(yytext); return CEL;}
^[-]/{DOT} {yylval=strdup(yytext); return SGNM;}
^[-][0]/{DOT} {yylval=strdup(yytext); return CELM;}
\.([0-9]*)/[eE] {yylval=strdup(yytext+1); return DRB;}
[eE][-+][0-9]{1,2}$ {yylval=strdup(yytext+1); return STP;}
([a-zA-z ]*[0-9]*)* {return ER;}
\n |
. ;
YACC:
%{
#include <stdio.h>
#include <string.h>
#define YYSTYPE char *
int a=0, b=0, c=0, stp=0;
int trans(int a, int b, int c, int stp);
int transM(int a, int b, int c, int stp);
%}
%start list
%token CEL DRB SGN CELM SGNM STP ER
%%
list:
|list drob
;
drob: CEL DRB STP {a=strlen($2); b=atoi($1); c=atoi($2); stp=atoi($3); trans(a,b,c,stp); return 0;}
|CELM DRB STP {a=strlen($2); b=0; c=atoi($2); stp=atoi($3); transM(a,b,c,stp); return 0;}
|SGN DRB STP {a=strlen($2); b=atoi($1); c=atoi($2); stp=atoi($3); trans(a,b,c,stp); return 0;}
|SGNM DRB STP {a=strlen($2); b=0; c=atoi($2); stp=atoi($3); transM(a,b,c,stp); return 0;}
|DRB STP {a=strlen($1); b=0; c=atoi($1); stp=atoi($2); trans(a,b,c,stp); return 0;}
;
%%
Int yyerror()
{puts("ERROR");}
Int yywrap()
{return 0;}
int trans(int a, int b, int c, int stp)
{
int i=0, k=1, f=0;
double drb=0.0, sp=1.0;
for(i=0;i<a;i++)
{k=k*10;}
if(b<0)
{b=b*-1;drb=b+(double)c/k;f=1;}
else{drb=b+(double)c/k;}
if(stp>0)
{for(i=0;i<stp;i++)
{sp=sp*10;}}
else
{stp=stp*-1;
for(i=0;i<stp;i++)
{sp=sp/10;}}
if(f)
{drb=drb*sp*-1;}
else
{drb=drb*sp;}
if(k/sp<1)
{printf ("Result = %.0f/%.0f\n",drb*sp/k, sp/k);}
else
{printf ("Result = %.0f/%.0f\n",drb*k/sp, k/sp);}
}
int transM(int a, int b, int c, int stp)
{
int i=0, k=1;
double drb=0.0, sp=1.0;
for(i=0;i<a;i++)
{k=k*10;}
drb=b+(double)c/k;
if(stp>0)
{for(i=0;i<stp;i++)
{sp=sp*10;}}
else
{stp=stp*-1;
for(i=0;i<stp;i++)
{sp=sp/10;}}
drb=drb*sp*-1;
if(k/sp<1)
{printf ("Result = %.0f/%.0f\n",drb*sp/k, sp/k);}
else
{printf ("Result = %.0f/%.0f\n",drb*k/sp, k/sp);}
}
main(){yyparse();}
18)
Разработать транслятор для преобразования записи любой периодической десятичной дроби в обыкновенную дробь. Записи периодических десятичных дробей должны передаваться транслятору строками стандартного ввода в формате вещественных чисел с фиксированной точкой, где период указан в круглых скобках. Результаты трансляции должны отображаться строками стандартного вывода, где числители и знаменатели обыкновенных дробей разделены символом '/'.
LEX:
%{
#include "y.tab.h"
int yylval;
%}
%%
[-](([1-9][0-9]*)|[0])/"." {yylval=-atoi(yytext); return NUMB1;}
^(([1-9][0-9]*)|[0])/"." {yylval=atoi(yytext); return NUMB;}
([0-9]+)/"(" {yylval=atoi(yytext); return PART;}
([1-9][0-9]*)/")" {yylval=atoi(yytext); return PERIOD;}
([a-zA-Z ]*[0-9]*)* {return ER;}
. |
\n
%%
YACC: %{
#include <stdio.h>
%}
%token NUMB PART PERIOD ER NUMB1
%start list
%%
list:
|list drob sep
;
drob: NUMB PART PERIOD { trans1($1,$2,$3); return 0;}
| NUMB1 PART PERIOD {trans3($1,$2,$3); return 0;}
| NUMB PERIOD {trans2($1,$2); return 0;}
| NUMB ER PERIOD {puts("ERROR"); return 0;}
| ER PERIOD {puts("ERROR"); return 0;}
| ER PART PERIOD {puts("ERROR"); return 0;}
| ER ER {puts("ERROR"); return 0;}
;
sep:
|' '
|'\n'
|'\t'
;
%%
int yyerror(const char *str)
{
{puts("ERROR");}
}
