S I:= E | if E then S else E | while E do S | B | read (I) | write (E)
1) I:= E
: I E .
E ( ); I , , ( checkid()), :
void eqtype (void)
{ if (strcmp (spop (), spop ())) ERROR();}
, :
I < checkid() >:= E < eqtype() >
2)
if E then S else S | while E do S
: .
E ( ); , :
void eqbool (void)
{if (strcmp (spop(), "bool")) ERROR();}
:
if E < eqbool() > then S else S | while E < eqbool() > do S
- , .
D ( ):
#include <string.h>
#define MAXSIZE_TID 1000
#define MAXSIZE_TD 50
char * TD[MAXSIZE_TD];
struct record
{char *name;
int declare;
char *type;
/*... */
};
struct record TID [MAXSIZE_TID];
/* ERROR(), getlex(), id(), eq(char *),
struct lex curr_lex -
- */
void ERROR(void);
struct lex {int class; int value;};
struct lex curr_lex;
struct lex getlex (void);
int id (void);
int eq (char *s);
void ipush (int i);
int ipop (void);
void decid (int i, char *t)
{if (TID [i].declare) ERROR();
else {TID [i].declare = 1; strcpy (TID [i].type, t);}
}
void dec (char *t)
{int i;
while ((i = ipop())!= -1) decid (i,t);}
void D (void)
{ipush (-1);
if (!id()) ERROR();
else {ipush (curr_lex.value);
curr_lex = getlex ();
while (eq (","))
{curr_lex = getlex ();
if (!id ()) ERROR ();
else {ipush (curr_lex.value);
curr_lex = getlex();}
}
if (!eq (":")) ERROR();
else {curr_lex = getlex ();
if (eq ("int")) {curr_lex = getlex ();
dec ("int");}
else if (eq ("bool"))
{curr_lex = getlex();
dec ("bool");}
else ERROR();
}
}
}
.
49. ( , ) , .
|
|
a) S E^ b) S P:= E | if E then S | if E then S else S
E () | (E {, E}) | A P I | I (E)
A a | b E T {+T}
T F {*F}
F P | (E)
I a | b
c) S type I = T {; I = T} ^ d) S P = E | while E do S
T int | record I: T {; I: T} end P I | I (E {, E})
I a | b | c E E + T | T
T T * F | F
F P | (E)
I a | b | c
50. , .
a) S E^ b) S E^
E E+T | E-T | T E E+T | E-T | T
T T*P | P T T*F | T/F | F
P (E) | I F I | I^N | (E)
I a | b | c I a | b | c | d
N 2 | 3 | 4
c) F function I(I) S; I:=E end *d) S SaAb | Sb | bABa
S ; I:=E S | e A acAb | cA | e
E E*I | E+I | I B bB | e
*e) S Ac | dBea *f) S fASd | e
A Aa | Ab | daBc A Aa | Ab | dB | f
B cB | e B bcB | e
51. - , . ?
a) #include <stdio.h>
int c; FILE *fp;
void A();
void ERROR();
void S (void)
{if (c == 'a')
{c = fgetc(fp); S();
if (c == 'b') c = fgetc(fp);
else ERROR();
else A();
}
void A (void)
{if (c == 'b') c = fgetc(fp);
else ERROR();
while (c == 'b')
c = fgetc(fp);
}
void main()
{fp = fopen("data", "r");
c = fgetc(fp);
S();
printf("O.K.!");
}
*b) #include <stdio.h>
int c; FILE *fp;
void A();
void ERROR();
void S (void)
{ A(); if (c!= '^') ERROR();
}
void A (void)
{ B(); while (c == 'a') {c = fgetc(fp); B();}; B();
}
void B (void)
{ if (c == 'b') c = fgetc(fp);
}
void main()
{fp = fopen("data", "r");
c = fgetc(fp);
S();
printf("O.K.!");
}
52. , (. . 36-38), , .
53. ? (a,(b,a),(a,(b)),b)^.
S < k = 0 > E ^
E A | (< k=k+1; if (k == 3) ERROR(); > E {,E}) < k = k-1 >
A a | b
54. , {0, 1, 2, ^}:
S A^
A 0A | 1A | 2A | e
, , 002.
55. , {a, b, c, ^}:
S A^
A aA | bA | cA | e
, , :
à ;
à , b.
56. , {0, 1}:
S 0S | 1S | e
, , 101.
57. -
L = {am bn ck | m+k = n m-k = n}.
58. -
L = {1n 0m 1p | n+p > m, m >= 0}.
|
|
59. :
S < A = 0; B = 0 > L {L} < if (A > 5) ERROR() > ^
L a < A = A+1 > | b < B = B+1; if (B > 2) ERROR() > |
c < if (B == 1) ERROR() >
?
60. :
S E^
E () | (E {, E}) | A
A a | b
, :
1. ;
2. .
61. , :
a) L , ,
S for I = E step E to E do S
, :
1. I ;
2. .
.
*b)
P program D; begin S {; S } end
D ... | label L{,L} |...
S L {, L }: S` | S`
S` ...| goto L |...
L I
I -
, :
1. , , ;
2. ;
3. goto, , .
.
62.
P program D begin S {; S} end
D var D' {; D'}
D' I {, I}: record I: R {; I: R} end | I {, I}: R
R int | bool
S I:= E | I.I:= E
E T {+T}
T F {*F}
F I | (E) | I.I | N | L,
I - , N - , L - .
, :
1. , , ;
2. .
: ) ( );
b) .