
- •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;}
int trans(int a, int b)
{
int c=0;
double sn=0.0;
c=a/b;
sn=(double)a/b;;
if(sn<0)
{
if(a!=0 && a%b==0)
{printf("Result = %d\n", c+1);}
else
{printf("Result = %d\n", c);}
}
else
{printf("Result = %d\n", c+1);}
}
main()
{yyparse();}
9)
Разработать транслятор для преобразования алгебраического формата записи комплексных чисел в эквивалентную тригонометрическую форму. Входные записи любых комплексных чисел, где мнимая и действительная части заданы обыкновенными дробями, в которых числитель и знаменатель разделяет символ '/', должны передаваться транслятору строками стандартного ввода. Результаты трансляции должны отображать строки стандартного вывода, где модули и аргументы комплексных чисел, заданы десятичными дробями.
LEX:
%{
#include<stdio.h>
#include"y.tab.h"
%}
%Start NOM IM
%%
^[-]?([0]|[1-9][0-9]*)/\/ {yylval=atoi(yytext);BEGIN NOM;return RENM;}
<IM>[+-]([0]|[1-9][0-9]*)/\/ {yylval=atoi(yytext);BEGIN NOM;return IMNM;}
<NOM>[0] {return ZERO;}
\/ {return '/';}
<NOM>[1-9][0-9]*/(j\n) {yylval=atoi(yytext);return IMDNM;}
<NOM>[1-9][0-9]*/[+-] {BEGIN IM; yylval=atoi(yytext);return REDNM;}
\n |
. {return 0;}
YACC:
%{
#include <stdio.h>
#include <math.h>
#include <ctype.h>
void trans(double ,double ,
double *, double *);
double arg, fi, im1,re1;
%}
%token RENM IMNM REDNM IMDNM ZERO
%%
complex: real image
{trans(re1,im1,&arg,&fi);
printf("%.3f*(cos(%.3f)+j*sin(%.3f))\n",
arg,fi,fi);}
real: RENM '/' REDNM {
re1=(double)$1/$3;}
| RENM '/' ZERO {
puts("ZERO FAKE");return 0;}
image: IMNM '/'IMDNM {
im1=(double)$1/$3;}
| IMNM '/' ZERO {
puts("ZERO FAKE");return 0;}
%%
int yyerror(char*s)
{puts(s);}
void trans(double re,double im,
double *farg,double *ffi)
{
if(!re)
{*farg=im;*ffi=3.14;return;}
if(!im)
{*farg=re;*ffi=0;return;}
*farg=pow(re*re+im*im,0.5);
*ffi=atan(im/re);
}
main()
{yyparse();}
10)
Разработать транслятор для преобразования алгебраического формата записи комплексных чисел в эквивалентную тригонометрическую форму. Входные записи любых комплексных чисел должны передаваться транслятору строками потока стандартного ввода, а результаты трансляции должны отображать строки потока стандартного вывода. При этом любые численные значения во входных и выходных записях комплексных чисел должны быть заданы обыкновенными дробями, где числитель и знаменатель разделены символом '/'.
LEX:
%{
#include<stdio.h>
#include"y.tab.h"
#define YYSTYPE
extern YYSTYPE yylval;
%}
%Start NOM IM
%%
^[-]?([0]|[1-9][0-9]*)/\/ {yylval=atoi(yytext);BEGIN NOM;return RENM;}
<IM>[+-]([0]|[1-9][0-9]*)/\/ {yylval=atoi(yytext);BEGIN NOM;return IMNM;}
<NOM>[0] {return ZERO;}
\/ {return '/';}
<NOM>[1-9][0-9]*/(j\n) {yylval=atoi(yytext);return IMDNM;}
<NOM>[1-9][0-9]*/[+-] {BEGIN IM; yylval=atoi(yytext);return REDNM;}
\n |
. {return 0;}
YACC:
%{
#include <stdio.h>
#include <math.h>
#include<ctype.h>
#define ST 1000
void drob(double,int*,int*);
void trans(double ,double ,double *, double *);
double arg, fi, im1,re1;
int fn,fd,an,ad;
%}
%token RENM IMNM REDNM IMDNM ZERO
%%
complex: real image
{trans(re1,im1,&arg,&fi);
drob(arg,&an,&ad);
drob(fi,&fn,&fd);
printf("%d/%d*(cos(%d/%d)+j*sin(%d/%d))\n",
an,ad,fn,fd,fn,fd);}
real: RENM '/' REDNM {re1=(double)$1/$3;}
| RENM '/' ZERO {puts("ZERO FAKE");return 0;}
image: IMNM '/'IMDNM {im1=(double)$1/$3;}
| IMNM '/' ZERO {puts("ZERO FAKE");return 0;}
%%
int yyerror(char*s)
{puts(s);}