W
ykªad
13.
Analiza
skªadnio
w
a
Odwrotna
nota ja
p
olsk
a
(ONP)
to
sp
osób
zapisu
wyra»e«,
w
którym
na
jpierw
p
o
da
jem
y
argumen
t
y
,
a
p
otem
op
era j.
Je»eli
wiadomo
ile
argumen
tó
w
ma
j¡
op
era je
(a
w
przy-
padku
op
era ji
arytmet
y zn
y
h
tak
jest
ma
j¡
one
p
o
dw
a
argumen
t
y),
to
w
ONP
nie
s¡
p
otrzebne
na
wiasy
.
Na
przykªad,
wyra»enie
2∗(3+5)
zapisane
w
ONP
ma
p
osta¢
2 3 5 + ∗
.
Nota
b
ene,
wyra»enie
zapisane
w
ONP
to
goto
wy
program
dla
maszyn
y
stoso
w
ej,
patrz
wi zenia.
Napisz
sp
e yk
a j
(dla
Lex'a
i
Bison'a)
analizatora,
który
w
zyta
wyra»enie
arytme-
t
y zne
w
standardo
w
ej
(inkso
w
ej)
nota ji
i
wypisze
je
w
ONP
.
Analizator
leksyk
aln
y
jest
taki
sam,
jak
w
przypadku
k
alkulatora
dla
wyra»e«
arytme-
t
y zn
y
h:
%{
#in lude
<string.h>
#in lude
<stdlib.h>
//
Defini je
»etonów
po hodz¡ e
z
Bisona
#in lude
"onp.tab.h"
%}
INT
[0-9℄+
%%
{
\
INT}
{
yylval=atoi(yytext);
return
NUM;
}
[
\
t℄
{
/*
Ni
*/
}
[
\
n℄|.
{
return
yytext[0℄;
}
%%
Analizator
skªadnio
wy
ob
ho
dzi
drzew
o
wypro
w
adzenie
w
p
orz¡dku
p
ostkso
wym.
W
y-
star zy
wi ,
»e
w
w
zªa
h
o
dp
o
wiada
j¡ y
h
pro
duk
jom
generuj¡ ym
op
era je
arytme-
t
y zne
b
dzie
wypisyw
aª
i
h
sym
b
ole
tªuma zenie
na
ONP
argumen
tó
w
t
y
h
op
era ji
zostaªo
wypisane
w
trak
ie
przet
w
arzania
o
dp
o
wiada
j¡ y
h
im
p
o
ddrzew.
18
%{
#in lude
<stdio.h>
#in lude
<strings.h>
%}
%token
NUM
%%
input:
/*
ni
*/
|
input
line
;
line:
'
\
n'
|
exp
'
\
n'
{
printf
("
\
n");
}
;
exp
:
exp
'+'
skl
{
printf("+
");
}
|
exp
'-'
skl
{
printf("-
");
}
|
skl
;
skl
:
skl
'*'
zy
{
printf("*
");
}
|
skl
'/'
zy
{
printf("/
");
}
|
zy
;
zy
:
NUM
{
printf("%d
",
$1);
}
|
'('
exp
')'
;
%%
main()
{
yyparse();
}
yyerror(s)
har
*s;
{
fprintf(stderr,
"%s
\
n",
s);
}
19