词法分析实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

词法分析实验报告

姓名:张雨

学号:32一、实验目的

1.了解词法分析的原理、过程

2.为语法分析做基础

二、实验方法

1.建一个类号表(如下图所示)

单词符号及类号

2.根据类号表编写一个用于词法分析的扫描器,把扫描器做成一个过程。此扫描器用于识别单词(单词分为五类:基本字、标志符、常量、运算符、界符),

同时送出单词的类号。

3.编写取一个字符的过程,为扫描器所用。此过程先将程序的一行读入缓冲区,再从缓冲区读取字符。

4.此外还要写读非空字符及退字符的过程

5.在主程序中编写循环,反复调用扫描器,直到扫描完测试程序。

6.编写测试程序

7.运行程序(需输入测试文件的路径及文件名),在屏幕上即可看到结果,在每行程序后显示出这一行中每个单词的类号。

三、测试程序

1.词法分析源程序

文件名:cffx.pas

program Lexical;

var reserve:array[0..20] of string;

line:array[1..80] of char;

token,filename:string;

ch,ch1:char;

ii,jj,k,num,kind:integer;

f:text;

procedure b_reserve;

begin

reserve[0]:='and '; reserve[1]:='begin ';

reserve[2]:='const '; reserve[3]:='div ';

reserve[4]:='do '; reserve[5]:='else ';

reserve[6]:='end '; reserve[7]:='function '; reserve[8]:='if '; reserve[9]:='integer '; reserve[10]:='not '; reserve[11]:='or '; reserve[12]:='procedure '; reserve[13]:='program '; reserve[14]:='read '; reserve[15]:='real '; reserve[16]:='then '; reserve[17]:='type '; reserve[18]:='var '; reserve[19]:='while '; reserve[20]:='write ';

end;

procedure getchar;

begin

if ii=jj

then begin

if eof(f)

then begin

writeln('program incomplete!');

close(f);

exit;

end;

ii:=0;jj:=0;

while not eoln(f) do

begin

jj:=jj+1;

read(f,line[jj]);

write(line[jj]);

end;

write(' ');

readln(f);

write;

jj:=jj+1;

line[jj]:=' ';

end;

ii:=ii+1;

ch:=line[ii];

end;

procedure getnbc;

begin

getchar;

while ch=' ' do getchar;

if ch='{' then

begin

repeat;

getchar;

until ch='}';

getnbc;

end;

end;

procedure retract;

begin

ii:=ii-1;

end;

procedure scanner;

begin

token:=' ';

getnbc;

case ch of

'a'..'z':begin

k:=0;

repeat

if k<10 then

begin

k:=k+1;

token[k]:=ch;

token:=token

end;

getchar;

until not (ch in['a'..'z','0'..'9']);

retract;

if k<10 then

repeat

k:=k+1;

token[k]:=' ';

until k=10;

kind:=21;

for k:=0 to 20

do if token=reserve[k]

then kind:=k;

end;

'0'..'9':begin

k:=0;kind:=22;num:=0;

repeat

num:=10*num+(ord(ch)-ord('0'));

k:=k+1;

getchar;

until not (ch in ['0'..'9']);

retract;

end;

'+','-':begin

ch1:=ch;

retract;

retract;

getchar;

if (ch='=') or (ch='(')

then if ch1='+' then kind:=32

else kind:=33

else if ch1='+' then kind:=34

else kind:=35;

getchar;

end;

'*':kind:=36;

'/':kind:=37;

',':kind:=23;

'.':kind:=26;

';':kind:=24;

'(':kind:=27;

')':kind:=28;

'[':kind:=29;

']':kind:=30;

'=':kind:=38;

':':begin getnbc;

if ch='=' then kind:=44

else begin

retract;

kind:=25;

end;

end;

'#':kind:=47;

'{':kind:=45;

'}':kind:=46;

'>':begin getnbc;

if ch='=' then kind:=43

else begin

retract;

kind:=40;

end;

end;

'<':begin getnbc;

if ch='='

相关文档
最新文档