词法分析实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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='='