简单C语言编译器之SLR分析【待完善】

程序

Main

语句块

语句串

语句

赋值语句

条件语句

ID

表达式

if

条件

关系运算符

因子

NUM|

P

M

B

C

L

F

I

D

X

Y

O

S

G

R

N

 

1.待分析的C语言的子集文法

(1) <程序>→main()<语句块>P#M()B

(2) <语句块>→<语句串>B#{C}

(3) <语句串>→ε|<语句><语句串>C#ε|L

(4) <语句> →<赋值语句>|<条件语句>L#F|I

(5) <赋值语句> →ID=<表达式>F#D=X

(6) <条件语句>→if (<条件>) <语句块>I#Y(O)B

(7) <条件>→<表达式><关系运算符><表达式>O#XSX

(8) <表达式>→<>|<表达式>+<>|<表达式>-<>X#G|X+G|X-G

(9) <>→<因子>|<>*<因子>|<>/<因子>G#R|G*R|G/R

(10) <因子>→ID|NUM|(<表达式>)R#D|N|(X)

(11) <关系运算符>→< | <= | > | >= | == | !=S#< | <= | > | >= | == | !=

注:该文法省略了变量说明部分,即标志符可以不经定义而直接使用。

2待分析的C语言的子集词法

a.关键字

main   if   while

注:关键字必须小写

b.运算符和界符

=  +  -  *  /  <  <=  >  >=  ==  !=  ;  {  }  (  )

c.标志符ID和常数NUM

通过以下正规式定义其他标记:

ID→letter(letter|digit)*

NUM→digit digit*

letter→a|…|z|A|…|Z

digit→0|…|9

d.空格由空白、制表符和换行符组成

空格一般用来分隔IDNUM、专用符号和关键字,词法分析阶段常常被忽略。

e.各种单词符号对应的种别码

单词符号

种别码

单词符号

种别码

main

1

)

27

if

2

{

28

ID

10

}

29

NUM

20

;

30

=

21

31

+

22

32

-

23

>=

33

*

24

<=

34

/

25

!=

35

(

26

==

36

赋值语句:

0F’->F

1F->D=X

2D->d

3X->G

4X->X+G

5X->X-G

6G->R

7G->G*R

8G->G/R

9R->D

10R->N

11R->(X)

12N->n

状态

ACTION

GOTO

 

+

-

*

/

=

(

)

d

n

#

F

D

X

G

R

N

0

 

 

 

 

 

 

 

S2

 

 

1

3

 

 

 

 

1

 

 

 

 

 

 

 

 

 

acc

 

 

 

 

 

 

2

r2

r2

r2

r2

r2

 

 

 

 

r2

 

 

 

 

 

 

3

 

 

 

 

S4

 

 

 

 

 

 

 

 

 

 

 

4

 

 

 

 

 

S11

 

S2

S10

 

 

8

5

6

7

9

5

S12

S13

 

 

 

 

 

 

 

r1

 

 

 

 

 

 

6

r3

r3

S14

S15

 

 

r3

 

 

r3

 

 

 

 

 

 

7

r6

r6

r6

r6

 

 

r6

 

 

r6

 

 

 

 

 

 

8

r9

r9

r9

r9

 

 

r9

 

 

r9

 

 

 

 

 

 

9

r10

r10

r10

r10

 

 

r10

 

 

r10

 

 

 

 

 

 

10

r12

r12

r12

r12

 

 

r12

 

 

r12

 

 

 

 

 

 

11

 

 

 

 

 

S11

 

S2

S10

 

 

8

16

6

7

9

12

 

 

 

 

 

S11

 

S2

S10

 

 

8

 

17

7

9

13

 

 

 

 

 

S11

 

S2

S10

 

 

 

 

18

7

9

14

 

 

 

 

 

S11

 

S2

S10

 

 

8

 

 

19

9

15

 

 

 

 

 

S11

 

S2

S10

 

 

8

 

 

20

9

16

S12

S13

 

 

 

 

S21

 

 

 

 

 

 

 

 

 

17

r4

r4

S14

S15

 

 

r4

 

 

r4

 

 

 

 

 

 

18

r5

r5

S14

S15

 

 

r5

 

 

r5

 

 

 

 

 

 

19

r7

r7

r7

r7

 

 

r7

 

 

r7

 

 

 

 

 

 

20

r8

r8

r8

r8

 

 

r8

 

 

r8

 

 

 

 

 

 

21

r11

r11

r11

r11

 

 

r11

 

 

r11

 

 

 

 

 

 

 

你可能感兴趣的:(简单C语言编译器之SLR分析【待完善】)