2024年5月25日发(作者:)

编译原理

词法分析

一、实验目的

设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。

二、实验要求

2.1 待分析的简单的词法

(1)关键字:

begin if then while do end

所有的关键字都是小写。

(2)运算符和界符

: = + - * / < <= <> > >= = ; ( ) #

(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:

ID = letter (letter | digit)*

NUM = digit digit*

(4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符

和关键字,词法分析阶段通常被忽略。

2.2 各种单词符号对应的种别码:

表2.1 各种单词符号对应的种别码

单词符号

bgin

If

Then

wile

do

end

lettet(letter|digit)*

dight dight*

+

*

/

种别码

1

2

3

4

5

6

10

11

13

14

15

16

=

(

)

#

单词符号

:=

<

<>

<=

>

>=

种别码

17

18

20

21

22

23

24

25

26

27

28

0

2.3 词法分析程序的功能:

输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。

其中:syn为单词种别码;

token为存放的单词自身字符串;

sum为整型常数。

例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如

下序列:

(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……

三、词法分析程序的C语言程序源代码:

#include

#include

char prog[80],token[8],ch;

int syn,p,m,n,sum;

char *rwtab[6]={"begin","if","then","while","do","end"};

scaner();

void scanner_example (FILE *fp);

main()

{

FILE *fp;

fp=fopen("D:","r");//打开文件

scanner_example (fp);

scaner();

}

void scanner_example (FILE *fp)

{

do

{

ch=fgetc (fp);

prog[p++]=ch;

}while (ch!='#');

p=0;

do{

scaner();

switch(syn)

{case 11:printf("( %-10d%5d )n",sum,syn);

break;

case -1:printf("you have input a wrong stringn");

default: printf("( %-10s%5d )n",token,syn);

break;

}

}while(syn!=0);

}