Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
melkie_progi.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
53.45 Кб
Скачать

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");}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]