You are on page 1of 121

:

: .

. ,

, 4

:
: .


, p q ,
/
( p, q V * ).
q p
G, p
q p q . , p x w z q x yz
w y G, p q .
q p n
G, n 1 , p q
p q .
q p , ,
n 0 , p q
p * q .

. ,

, 4

:
: .

L G, :

L w | w T *; S w
G

2 ( )
O :

X q X N q N T

. ,

, 4

:
: .

V
, ,
, :
,
, , .
-, .
.

. ,

, 4

:
: .

PQ
QR
RP
PP

. ,

, 4

:
: .

, =(,,S

={NUMBER,+,-,*,/,(,)}
N={E}
S=E

:
E

E+E
(1)
| E-E
(2)
| E*E
(3)
| E/E
(4)
| (E)
(5)
(6)
. , | NUMBER
, 4

:
: .

(3+7)/(8-6).
(4)
E
:
E

(5):
. ,
, 4

:
: .



(1)
(2).
. ,

, 4

:
: .


V
E


(6).
. ,

, 4

:
: .


V
E

N U M BER

N U M BER

NU M BER

. ,

N U M BER

, 4

10

:
: .


VI

.

,
.



q
,
, ,

. ,
*

p q
lm

,
,
*

p

q

rm
.
,
, 4
11
.

:
: .


VII

LL(k)

,
k
.
LL .
LR(k)
,

k .
LR .
LR(1)

LL.

. ,

, 4

12

:
: .

BNF EBNF I
EBNF N. Wirth


|
( )
[ ]
{ }
=
.
(* *)

,
< >, BNF.
, .. +.
.

.
.
.
::=
.
.
.

. ,

, 4

13

:
: .

BNF EBNF II
:
S = .
= + | - |
.
= * | / |
.
= ( ) | .
= { }.
= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9.

. ,

, 4

14

:
: .

S = .
= | ( ) |
.
= + | - | * | /.
: (27-5)*8

. ,

, 4

15

:
: .


II

(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)



*
( ) *
( ) *
( ) *
( - ) *
( - ) *

[ = ]
[ = ]
[ = *]
[ = ( )]
[ = ]
[ = ]
[ = -]
[ = ]


(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)


()
( )
( )
( - )
( - )
( - ) *
( - ) *

. ,

[ = ]
[ = ( )]
[ = ]
[ = ]
[ = -]
[ = ]
[ = *]
[ = ]

, 4

16

:
: .


II

. ,

, 4

17

:
: .


IV
:

27

. ,

, 4

18

:
: .

,

.


S = .
= | ( ) |
.
= + | - | * | /.
: 27-5*8

. ,

, 4

19

:
: .


(1)
(2)
(3)
(4)
(5)
(6)
(7)




-
-
- *
- *

. ,

[ = ]
[ = ]
[ = ]
[ = -]
[ = ]
[ = *]
[ = ]

, 4

20

:
: .


(1)
(2)
(3)
(4)
(5)
(6)
(7)



-
-
-
- *
- *

. ,

[ = ]
[ = ]
[ = -]
[ = ]
[ = ]
[ = *]
[ = ]

, 4

21

:
: .



.

.
S = .
= _ | .
_ = + | -.
= _ | .
_ = * | /.
= ( ) | .

. ,

, 4

22

:
: .



: 27-58;
(27-5)-8
27-(5-8).




.

. ,

, 4

23

:
: .

V
:

S = .
= _ | .
_ = + | -.
= _ | .
_ = * | /.
= ( ) | .

27-5*8

. ,

, 4

24

:
: .

V
:

27-5-8

. ,

, 4

25

:
: .

VI
ELSE
S = .
= if then
| if then else
| .

if EK1 then if EK2 then 1 else 2

. ,

, 4

26

:
: .

if

EK1

th e n

if

if

th e n

EK2

e ls e

ENT1

. ,

ENT2

EK1

th e n

if

e ls e

th e n

EK2

ENT2

ENT1

, 4

27

:
: .



ELSE
S = .
= _ | _.
_=if then _ else
_
| .
_= if then
| if then _ else
_.

. ,

, 4

28

:
: .

#define astEmptyProgram 399


#define astProgram
400
#define astEmptyDeclSeq 401
#define astDeclSeq
402
#define astDecl
403
. . . . . . . . . . . . . .
/* ----------------------------------------------------------- */
/* ----- THE STRUCTURE FOR THE ABSTRACT SYNTAX TREE NODES ---- */
/* ----------------------------------------------------------- */
typedef struct AstNode_tag {
int NodeType;
struct symbol_tag *SymbolNode;
struct AstNode_tag *pAstNode[4];
} AstNode;

. ,

, 4

29

:
: .

(
) ,
, .

. ,

, 4

30

:
: .



1.

2.

3.


.
,
,
.
2,
, , ,

(
)

,


.

. ,



.

. ,

, 4

31

:
: .

S = k X n | k Y.
X = l | m.
Y = mmn | nnm.
kmmm

()

()

()

. ,

()

()

()

, 4

32

:
: .



, .



. ,

, 4

33

:
: .



,
,
, .
:

,

,

,
,

. ,

, 4

34

:
: .

S = .
= + | - | .
= * | / | .
= ( ) | .

:
_
(:
(();
;
());
:
();
:
;
.

. ,

//__: .
(__):
(_=__)


_;

;

.

, 4

35

:
: .


I

,
.

,
.

:
S = .
= _.
_ = + _ | - _ | .
= _.
_ = * _ | /
_ | .
.
,
, 4
36
= ( ) | .

:
: .


V
,
,
_ _ _ () _ _ . . . .


_ _ _ _ _ . . . .

,
,
o ,
, ( FIRST).
, -,

, ,
( FOLLOW).

. ,

, 4

37

:
: .


V
:
A ,
&
FIRST
G, FIRST()

.
, x FIRST() * x ,

LL(1)
A A
FIRST() FIRST() =

!

. ,

, 4

38

:
: .


V
LL(1)


LL(1)


.
LL(1)
.

.

. ,

, 4

39

:
: .


VI

(. )
int PLUS=1, MINUS=2, ...
int lookahead = getNextToken();
// _
void advance() { lookahead = getNextToken(); }
void match(int token) { if (lookahead == token) advance(); else error(); }
void Term() { Factor(); TermPrime(); }
void S() { Expr(); }
void Expr() { Term(); ExprPrime(); }
void ExprPrime() {
switch(lookahead) {
case PLUS : match(PLUS); Term();
ExprPrime(); break;
case MINUS : match(MINUS); Term();
ExprPrime(); break;
default: return;
}
}

. ,

void TermPrime() {
switch(lookahead) {
case TIMES: match(TIMES); Factor();
TermPrime(); break;
case DIV: match(DIV); Factor();
TermPrime(); break;
default: return;}
}
void Factor() {
switch(lookahead) {
case LPAR : match(LPAR); Expr();
match(RPAR); break;
case NUMBER:
match(NUMBER);
break;
,
4

40
default: error();}

:
: .


VII

(.
)

:


Term(); ExprPrime();

/*

. ,

Expr() {

Expr;
ExprPrime ;
Term ;
ExprPrime Term
Expr;
Expr ;
*/
}

, 4

41

:
: .


I

S
L
E

=
|
|
=
|
=

if E then S else S
begin S L
print E.
end
; S L.
num = num

void L() {
void S() {
switch(lookahead) {
switch(lookahead) {
case END: match(END); break;
case IF: match(IF); E(); match(THEN); S();
case SEMI: match(SEMI); S();
match(ELSE); S(); break;
L(); break;
case BEGIN: matvh(BEGIN); S(); L(); break;
default: error();
case PRINT: match(PRINT); E(); break;
}
default: error();
}
}
}
void E() { match(NUM); match(EQ); match(NUM); }

. ,

, 4

42

:
: .



main: S();

S1: (S, IF) : Sif E then S else S
()
S1: match(IF);
S1: E();
: if 2=2 then print 5=5
E1: (E, NUM): Enum = num
print 1=1 E : match(NUM); match(EQ); match(NUM);
1
E1: return E1 S1
S1: match(THEN);
S1: S();
S2: (S, PRINT): Sprint E
S2: match(PRINT);
S2: E();
E2: (E, NUM): Enum = num
E2: match(NUM); match(EQ); match(NUM);
E2: return E2 S2
S2: return S2 S1
S1: match(ELSE);
S1: S();
S3: (S, PRINT): Sprint E
S3: match(PRINT);
S3: E();
E3: (E, NUM): Enum = num
E3: match(NUM); match(EQ); match(NUM);
E3: return E2 S3

. ,

, 4

else

43

:
: .

X p1 | p2 | ...
,

pi
:
_
p1
FIRST(
):
p1

p2 ):
FIRST(
p2

....
pi
FIRST(
) FOLLOW(X):
pi

;
.

. ,

, 4

44

:
: .



FIRST
FIRST()


FIRST(X) X,
FIRST(X)

X , FIRST(X) {X}

X FIRST(X)

X X Y1Y2 ... Yk ,
FIRST(X) FIRST(Y1)

X X Y1Y2 ... Yk ,
a FIRST(X) a FIRST(Yi)

FIRST(Yj) 1 j i

X X Y1Y2 ... Yk ,

FIRST(X) FIRST(Y ) 1 i
.
,
, 4
45
k
i

:
: .



FIRST

FIRST X1X2 ... Xn


(
FIRST X1, 2 , ... , Xn)
:

FIRST(X1X2 ... Xn) :

FIRST(X1)
FIRST(Xi) ,
FIRST(Xj) 1 j i
, FIRST(Xi) 1 i n

. ,

, 4

46

:
: .


V
FIRST
S
=
=
_ =
|
|

=
_
|
|
=
|

_
{*}

{/}
_

.
_.
+ _
- _
.
_.
=
* _
/ _
.
( )
.

FIRST
{(, }
{(, }
{ , +, - }

FIRST
{(, }
{}
{+}

/
FIRST
+ _ {+}
- _
{-}
* _

{(, }

{-}

/ _

{ , *, / }

*
/

{*}
{/}

. ,

, 4

47

:
: .


V
FOLLOW MH
A FOLLOW(A)
A

FOLLOW(A) A

FOLLOW(A)

$ FOLLOW(S) ($ , S
)

A B , FOLLOW(B)
FIRST()
A B, FOLLOW(B)
FOLLOW(A)
A B , FIRST()
FOLLOW(B) FOLLOW(A)

. ,

, 4

48

:
: .


V
FOLLOW (
)
FOLLOW() {$, " )"}

FOLLOW(_) FOLLOW()
FOLLOW() FIRST(_) { } FOLLOW() {"" , "" ,$, " )"}

FOLLOW(_) FOLLOW() {"" , "" ,$, " )"}

. ,

, 4

49

:
: .


, LL(1),
..:
_ = ; _ |
.
= .

. ,

, 4

50

:
: .

LL(1) I



M [X , ]

X
Y
"k"


(
)

. ,

, 4

51

:
: .

LL(1) II

A ,
:

a FIRST(), A
M[A, a]
FIRST(), A
M[A, b] b FOLLOW(A)
A M[A, $] $
FOLLOW(A)

M
.

. ,

, 4

52

:
: .

LL(1) II
( )
S
=
=
_ =
|
|

=
_
|
|
=
|
M

.
_.
+ _
- _
.
_.
=
* _
/ _
.
( )
.
-

(
_

+ _ - _

) $

. ,

*
_

/
_
( )

, 4

53

:
: .

LL(1) IV
( - )
LL(1) 275*8

$
$ _
$ _ _.
$ _ _.
$ _ _.
$ _
$ _ -
$ _
$ _ _.
$ _ _.
$ _ _.
$ _ _. *
$ _ _.
$ _ _.
$ _ _.
$ _
$

. ,

.
27-5*8$
27-5*8$
27-5*8$
27-5*8$
-5*8$
-5*8$
-5*8$
5*8$
5*8$
5*8$
*8$
*8$
8$
8$
$
$
$

= _.
= _.
= .
_. = .
_ = - _.
= _.
= .
_. = * _.
= .
_. = .
_. = .

, 4

54

:
: .

LL(1) V
LL(1)
push($);
// $
push(S);
// S
lookahead = get_next_token(); //
repeat
X = top_of_stack();
if (X X = = $) then
if (X = = lookahead) then
pop(X);
lookahead = get_next_token();
else error();
else
// X
if ( M[X, lookahead] = = X Y1 Y2 ... Yk) then
pop(X);
push(Yk); push(Yk-1); ... push(Y1);
else error();
until (X = $)

. ,

, 4

55

:
: .

. :
= _ | .
X Yp2 | ......

. :
Y Xp1 | ......

X Xp1 |
Xp2 | ... | X
p n | q1 | q2 | .
... | qm:

X q1 X ' | q2 X ' | ... | q

m X '.
X ' p1 X ' | p2 X ' | ... | pn X ' | .

. ,

, 4

56

:
: .

S = .
= + | - | .
= * | / |
.
= ( ) | .

S = .
= _.
_ = + _ | - _ | .
= _.
_ = * _ | /
_ | .
= ( ) | .

. ,

, 4

57

:
: .





: G -
:
:
X 1 , X 2 ,..., X n ,

.

(i:=1 n)
(j:=1 i-1)
X i X j q

X i p1q | p2 q | ... | pk q , X j p1 | p2 | ... | pk



Xi

. ,

, 4

58

:
: .

. ,

, 4

59

:
: .


,

.

_ = ; _ |
.
= .

_if = if then
| if then else
.

. ,

, 4

60

:
: .

X " y" p1 |" y" p2 .



X " y" X '.

X ' p1 | p 2 .
: G
: LL(1)
:
( X)
p
X
( p )
X p1 | p 2 | ... | p n .
p1 , p 2 ,..., p k p,

X pq1 | pq 2 | ... | pq k | p k 1 | ... | p n . q1 , q 2 ,..., q k


, p k 1 , p 2 ,..., p n p.

X pX '| p k 1 | ... | p n .
X ' q1 | ... | q k .

. ,

, 4

61

:
: .


,

, .


.
,
.


( ),
.

. ,

, 4

62

:
: .



.

,
,
.

X p1 p2 ... pn
,

n
,
.

. ,

, 4

63

:
: .



S = .
= + | .
27+5

$
$
$
$ +
$ +

27+5$
+5$
+5$
5$
$

$
$S

$
$

= .

= +
.
S = .

:
(1) S

:
[ = + ]

(2)

[ = ]

(3)

rm

rm
rm

. ,

, 4

64

:
: .

()

()

()

()

()

. ,

, 4

65

:
: .




,
,
(.
).
,


+ :
.
- 1
- 2

+.
.
+ :
- 3
- 4 +
- 5 +
+ .

. ,

, 4

66

:
: .


-
-
- LR ( )
LR (.
).
LR, ,

. :

(
else).
.

. ,

, 4

67

:
: .

LR I

LR
, LL(1).
:

,

.

,
.

LR

.

. ,

, 4

68

:
: .

LR I


,
.


.
,
,
.
LR
.

. ,

, 4

69

:
: .

LR I

,

, (
).
,

, n
,
.
n .
,
,
.


.

. ,

, 4

70

:
: .

LR IV
LR(1)

0
1
2
3
4

( = )

( = )

( = + ) ( = + )

LR(1)

0
1
2
3
4

. ,

+
3

, 4

71

:
: .

LR V
(1 )

(0 )

()

()

()
(1 )

(1 )

(3 )
+

(4 )

(1 )

(0 )

()

(0 )

(3 )
+

(0 )

(0 )

(2 )

(1 )

(0 )

()

()

27+5 LR(1)

. ,

, 4

72

:
: .

LR VI

(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)

= + .
= - .
= .
= * .
= / .
= .
= ( ).
= .


0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

(3) (3)

(6) (6) (6) (6)

(3) (3)
(6) (6)

(8) (8) (8) (8)

. ,

(8) (8)

(1)
(2)
(4)
(5)
(7)

(1)

(2)

(4) (4) (4)


(5) (5) (5)
(7) (7) (7)

(1)
(2)
(4)
(5)
(7)

(1)
(2)
(4)
(5)
(7)

, 4

73

:
: .

LR VI

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

+
5
6

- * / ( )
4
1
2
7
8 9

5
5
5
5

4
4
4
4

. ,

10

11
12

3
3
13
14

15
8
8

9
9

, 4

74

:
: .

LR VI
LR(1) (275)*8

$0
$0 (4
$0 (4 5
$0 (4 3
$0 (4 2
$0 (4 10
$0 (4 10 -7
$0 (4 10 -7 5
$0(4 10 -7 3
$0 (4 10 -7 12
$0 (4 10
$0 (4 10 )15
$0 3
$0 2
$0 2 *8
$0 2 *8 5
$0 2 *8 13
$0 2
$0 1

. ,

(27-5)*8$
27-5)*8$
-5)*8$
-5)*8$
-5)*8$
-5)*8$
5)*8$
)*8$
)*8$
)*8$
)*8$
*8$
*8$
*8$
8$
$
$
$
$

(8)
(6)
(3)

(8)
(6)
(2)

(7)
(6)

(8)
(4)
(3)

, 4

75

:
: .

LR
:
S

:
[ = ]

[ = * ]

[ = ]

[ = ]

[ = ( )]

( ) *

[ = - ]

( - ) *

[ = ]

( - ) *

[ = ]

( - ) *

[ = ]

( - ) *

[ = ]

( - ) *

[ = ]

rm

rm
rm
rm
rm
rm
rm
rm
rm
rm
rm

( - ) *
rm

. ,

, 4

76

:
: .

LR





L R

9
Y
4

(
)

. ,

, 4

77

:
: .

LR I

push($);
// $
push(s0);
// s0
lookahead = get_next_token();
repeat forever
s = top_of_stack();
// ACTION
if ( ACTION[s,lookahead] = = ) then
pop 2*|| ;
// &
s = top_of_stack();
push();
push(GOTO[s,]);
// GOTO
else if ( ACTION[s,lookahead] = = si ) then
push(lookahead);
push(si);
lookahead = get_next_token();
else if ( ACTION[s,lookahead] = = and lookahead = = $ )
then return ( );
else error();
,
, 4
78

:
: .

LR I
LR(k) ,

S 0 1 2 n-1 n
:
1.
i ,
2.
i
, k
i .

. ,

, 4

79

:
: .

LR V

LR(?)

GOTO[ ,
]

. ,

, 4

80

:
: .

LR V
& ;

(yacc)

&

. ,

, 4

81

:
: .

LR V
& (
yacc);

&


LR(?)

LR(?)

byacc

. ,

, 4

82

:
: .

LR V

( yacc);

LR(k)



goto( s, )
closure( s ), (. )

&

. ,

, 4

83

:
: .

LR -
V
LR(k) [A , B],
A
B k
( $)

:
[ , a]
[ , a]
[ , a]
[ , a]


LR(0) [ ] (
)
LR(1) [ , a ] ( )
LR(2) [ , a b ] ( ) ...

. ,

, 4

84

:
: .

LR(1) I
, a, 4 LR(1)
[ , a], [ , a], [ , a], & [ , a]

LR(1) .
;

.. [ , a],
[ , a], a
{ [ , a],[ , b] }
= a
FIRST()

LR(1)

. ,

, 4

85

:
: .

LR(1) II


, I0 , I1 , ... , In
a. S
S S

b. , I0

[S S, $]

closure( I0 )

c. Ik , goto(Ik , )

goto(Ik , )

goto( )

. ,

, 4

86

:
: .

LR(1) II
closure(I)
closure(I) I
I

[ , a] [
, x]
x FIRST(a)

Closure(
I )
while ( I )
for [ , a] I
for P
for b FIRST(a)
if [ , b] I
then [ , b] I

. ,

, 4

87

:
: .

LR(1) IV
goto(I,x)

I
x

goto( { [ , a] }, )
[ , a]

closure( [ , a] )
Goto( I, x )
new =
for [ x , a] I
new = new [ x , a]
return closure(new)

. ,

, 4

88

:
: .

LR(1) V

I0 = closure( [S S , $] )


I0 = closure( [S S , $] )
C = { I0 }
while ( C )
for Ii C x ( TNT )
Inew = goto(Ii , x)
if Inew C then
C = C Inew
Ii Inew x

. ,

, 4

89

:
: .

LR(1) V
LR(1)
Closure( I )
while ( I )
for [ , a] I
for P
for b FIRST(a)
if [ , b] I
then [ , b] I

Goto( I, x )
new =
for [ x , a] I
new = new [ x , a]
return closure(new)

I0 = closure( [S S , $] )
C = { I0 }

while ( C )
for Ii C x ( TNT )
Inew = goto(Ii , x)
if Inew C then
C = C Inew
,
, 4
I I x

90

:
: .

LR(1)
S


*


id

*
id

. ,

, 4

FIRST
{ id }
{ id}
{ id }
{ id}
{-}
{*}
{ id}

91

:
: .

LR(1)
I1= {[S , \0]}

I0 = {[S ,\0], [ - , \0], [ , \0],


[ * , {\0,-}], [ , {\0,-}], [ id ,{\0,-,*}]}

id

I2 = { [ - , \0],
[ , \0] }

I4 = { [ id , {\0,-,*}] }
id

I3 = {[ * , {\0,-}],
[ , {\0,-}]}
*

I6 ={[ * , {\0,-}], [ * , {\0,-}],


[ , {\0,-}], [ id , {\0, -, *}]}

id

I5 = {[ - , \0], [ - , \0], [ , \0],


[ * , {\0,-}], [ , {\0,-}], [ id, {\0,-,*}] }

I8 = { [ * , {\0,-}] }

. ,

I = { [ - , \0] }
,
4
92
7

:
: .

LR(1)

for Ix C
for Ix
if [ a,b] a T
goto(Ix,a) = Ik ,
then ACTION[x,a] k
else if [SS ,$]
then ACTION[x ,$]
else if [ ,a]
then ACTION[x,a]
for n NT
if goto(Ix ,n) == Ik
then GOTO[x,n] k

. ,

, 4

93

:
: .

LR(1) V
id

0 4
1
2
5
3
5
4
6
5 4
6 4
7
8
4

1
2
3

3
6 5
6 6
7

2
8

3
3

2
4

. ,

, 4

94

:
: .


s [ a , b] [ , a] ;

ACTION[s,a]

(shift reduce conflict)

,
(.. else)

LR
s [ , a] [ , a] ;

ACTION[s,a]

(reduce reduce conflict)


LR(1)

. ,

, 4

95

:
: .

LR: LR(0)
LR(0):
Closure( I )
while ( I )
for [ ] I
for P
if [ ] I
then [ ] I

LR(0):
I0 = closure( [S S ] )
C = { I0 }
while ( C )
for Ii C x ( TNT )
Inew = goto(Ii , x)
if Inew C then
C = C Inew
Ii Inew
x
. ,

LR(0):
Goto( I, x )
new =
for [ x ] I
new = new [ x ]
return closure(new)

LR(1)

LR(0)


LR(0)


LR(1)

, 4

96

:
: .

LR:
SLR(1)
SLR(1)
FOLLOW
SLR(1)
LR(1)
for Ix C
for Ix
if [ a] a T goto(Ix,a) =
Ik ,
then ACTION[x,a] k
else if [SS ]
then ACTION[x ,\0]
else if [ ]
then for a FOLLOW()
then ACTION[x,a]
for each n NT
if goto(Ix ,n) = Ik

. ,

, 4

97

:
: .

LR:
LALR(1)

: LR(1)

LR(0) LR(1) (
)
LR(1) ,
ACTION
GOTO

LALR(1)

1.
2.

LR(1)

LR(0).

.


LR(1)

. ,

, 4

98

:
: .

LR:
LALR(1)

LALR(1) G
SLR(1)

LR(1) G
- ,
LALR(1)

LALR(1)
-
LR(1)

LALR(1) SLR(1)

LALR(1) yacc byacc

. ,

, 4

99

:
: .

LR(k) LR(1)

(LR(k))

LL(k)

LL(1)

. ,

, 4

100

:
: .

LR(k)
LR(1)




LL(k)

LALR(1)
SLR(1)
LL(1)
LR(0)

. ,

LL(1)
SLR(1)

, 4

101

:
: .

.
.

.

.

. ,

, 4

102

:
: .




.
,

.
.
FOLLOW.
LL(1) ,
X,

FIRST(X)
, FOLLOW(X).

. ,

, 4

103

:
: .

LL(1)
I

,
, .
:

(pop),
,
,
(scan)
.

. ,

, 4

104

:
: .

LL(1)
II
pop , $
FOLLOW(X).
scan ,
$
.
FIRST
( X ) FOLLOW
(X )
push ,
,
.

,
, FIRST
.

. ,

, 4

105

:
: .

LL(1)
III
(
)
S
=
=
_ =
|
|

=
_
|
|
=
|

.
_.
+ _
- _
.
_.
=
* _
/ _
.
( )
.

. ,

, 4

106

:
: .

LL(1)
IV
:
M

(
_

) $

+ _ - _

*
_

/
_

( )

_
scan

_
scan

+
scan

-
scan

*
scan

/
scan

+ _ - _ scan
pop
pop
scan

scan
scan

pop

pop

. ,

(
_

) $
pop pop

scan

_
* / scan
_
_
pop
pop
( )

, 4

pop pop

pop pop

107

:
: .

LL(1)
V
LL(1) (27*)

/
$
(27-*)$
$ _
(27-*)$ = _.
$ _ _.
(27-*)$ = _.
$ _ _. ) (
(27-*)$ = ( ).
$ _ _. )
27-*)$
$ _ _. ) _
27-*)$ = _.
$ _ _. ) _ _.
27-*)$ = _.
$ _ _. ) _ _.
27-*)$ = .
$ _ _. ) _ _.
-*)$
$ _ _. ) _
-*)$ _. = .
$ _ _. ) _ -
-*)$ _ = - _.
$ _ _. ) _
*)$
$ _ _. ) _
)$ scan
$ _ _. ) _
)$ pop
$ _ _. )
)$ _. = .
$ _ _.
$
$ _
$ _. = .
$
$ _. = .

. ,

, 4

108

:
: .

LR I
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)

= + .
= - .
= .
= * .
= / .
= .
= ( ).
= .

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

(3) (3)

(6) (6) (6) (6)

(3) (3)
(6) (6)

(8) (8) (8) (8)

. ,

(8) (8)

(1)
(2)
(4)
(5)
(7)

(1)

(2)

(4) (4) (4)


(5) (5) (5)
(7) (7) (7)

(1)
(2)
(4)
(5)
(7)

(1)
(2)
(4)
(5)
(7)

, 4

109

:
: .

LR II

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

+
5
6

- * / ( )
4
1
2
7
8 9

5
5
5
5

4
4
4
4

. ,

10

11
12

3
3
13
14

15
8
8

9
9

, 4

110

:
: .

LR III
(275*8

$0
$0 (4

(27-5*8$
27-5*8$

$0 (4 5

-5*8$ (8)

$0 (4 3

-5*8$ (6)

$0 (4 2

-5*8$ (3)

$0 (4 10

-5*8$

$0 (4 10 -7

5*8$

$0 (4 10 -7 5

*8$ (8)

$0 (4 10 -7 3

*8$ (6)

$0 (4 10 -7 12

*8$

$0 (4 10 -7 12 *8

8$

$0 (4 10 -7 12 *8 5

$ (8)

$0 (4 10 -7 12 *8 13

$ (4)

$0 (4 10 -7 12

$ (2)

$0 (4 10

$
(Missing parenthesis)

. ,

, 4

111

:
: .

LR IV


,

, .


.
27*8

$0


27-*8$

$0 5

-*8$ (8)

$0 3

-*8$ (6)

$0 2

-*8$ (3)

$0 1

-*8$

$0 1 -7

. ,

*8$
(Missing operand)

, 4

112

:
: .

LR V

,
,
.



.


.

. ,

, 4

113

:
: .

LR V

,
.

,
,
.

.
:

. ,

, 4

114

:
: .

LR V

byacc:


, :
: error _

error byacc.
( )
byacc ,
,
,
error.
error,
.

,
.

, ,
.

. ,

, 4

115

:
: .

LR
V
:
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)

= + .
= - .
= .
= * .
= / .
= .
= ( ).
= .


byacc :
paragontas : ARITHMOS
{$$=$1;}
| ( ekfrasi ) {$$=$2;}
|
error
{$$=0;}
;

. ,

, 4

116

:
: .

LR IX
: ()
27*8

$0

27-*8$

$0 2

-*8$ (8)

$0 6

-*8$ (6)

$0 5

-*8$ (3)

$0 4

-*8$

$0 4 -9

*8$ -
(syntax error)

$0 4 -9 error1

*8$ (9)

$0 4 -9 6

*8$ (6)

$0 4 -9 14

*8$

$0 4 -9 14 *10

8$

$0 4 -9 14 *10 2

$ (8)

$0 4 -9 14 *10 15

$ (4)

$0 4 -9 14

$ (2)

$0 4

: LALR(1)
byacc

. ,

, 4

117

:
: .

LR X


(
error)
.

()
.





.

macro yyerrok,

.

. ,

, 4

118

:
: .

LR X


paragontas

: ARITHMOS
{$$=$1;}
| ( ekfrasi ){$$=$2;}
|
error
{
yyerrok;
$$=0;
}
;

27 8

syntax error

. ,

, 4

119

:
: .

LR X

yyerrok :
while_statement

WHILE expr DO statement DONE


{
$$=exec_do_while($2,$4);
}
| error DONE
{
yyerror(Bad WHILE syntax);
yyerrok;
$$=NULL;
}
;

: ,

.
macro yyclearin

. ,

, 4

120

:
: .

LR XI



.
;

byacc ,

,
( ).
,
( )

.

. ,

, 4

121

You might also like