汇编语言词法分析(新)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数学与信息工程学院《编译原理》
实验报告一
实验名称:词法分析
实验室:6202
班级:09计算机3班
姓名:沈春晖
学号:0929210062
词法分析器的设计
一、实验目的
通过完成词法分析程序,了解词法分析的过程。编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。二、实验环境
操作系统:window xp
编写环境:visual c++ 、c-free、turbo c
编写语言:c语言
分析语言:PL/0
三、实验内容
对PL/0语言进行词法分析,把输入的字符串形式的源程序分割成一个个单词符号,其词法描述如下:
(1)关键字:begin,call,const,do,end,if,odd,procedure,read,then,var,while,write
(2)标识符:用来表示各种名字,必须以字母开头小于10位字符组成(3)数字:以0-9组成小于14位的数字
(4)运算符:+,-,*,/,:=,<,<=,>,>=
(5)界符:,,.,;,#
表1 各种单词符号对应类型表
单词符号类型
+ plus
- minus
* times
/ slash
( lparen
) rparen
= eql
, comma
. perio
# neq
; semicolon
begin beginsym
call callsym
const constsym
do dosym
end endsym
if
ifsym odd
oddsym procedure
proceduresym read
readsym then
thensym var varsym while
whilesym write writesym
N N
Y
Y
开始
调用GETSYM 取单词 输入要分析的文件
文件是否存在
文件是否结束
结束
打印分析结果
图1 主流程图
Y N N N
N
N Y
Y
Y Y
GETSYM
滤空CH=空?
GETCH CH 是字母? K:=0 K<10?
K:=K+1
A[K]:=CH GETCH
CH 是字母或数字?
ID:=A ID 是否是
保留字? SYM:=IDENT 相应保留字类别送SYM
返回
CH 是数字?
拼数,将拼数后的值送NUM SYM:=SYM
把该字符转换成对应单词,或拼复合单词,将其类别送SYM 中
图2 GETSYM 流程图
N
Y
GETSYM 函数功能:
(1) 滤空格 空格在词法分析时是一种不可缺少的界符,而在语法分析
时则是无用的,所以必须过滤
(2) 识别保留字 主程序定义了一个以字符为元素的一维数组WORD ,
称保留字表。对字母开头的字母、数字字符串要查此表。若查着则识别为保留字,将对应的类别放在SYM 中。如IF 的对应值IFSYM ,THEN 的对应值为THENSYM 。若查不着,则认为是用户定义的标识符
(3) 识别保留字 对用户定义的标识符将IDENT 放在SYM 中,标识符本
身的值放在ID 中
(4) 拼数 当扫描到数字串时,将字符串形式的十进制数转换为二进制
数,然后把数的类别NUMBER 放在SYM 中,数值本身的值放在NUM 中
(5) 拼合复合词 对两个字符组成的算符,如:>=、:=、<=等单词,识别
后将类别送SYM 中
(6) 输出源程序 为边读入字符边输出(可输出在文件中)
N N
GETCH
缓冲区是否
还有字符?
源程序文件
是否结束?
打印出错信息 停止编译
读入一行源程序放入在
LINE 中并输出,置CC:=0 CC:=CC+1
CH:=LINE[CC]
返回
Y Y
图3 GETCH 流程图
四、实验结果
要分析的内容如下:
const a=35;
var c,d;
procedure p;
begin
var g;
g:=465494366466564444;
write(g);
end;
begin
read(c,d);
if c<=d then c:=a;
write(c,d);
call p;
end.
图4 实验结果图
五、实验小结(心得体会)
刚开始的时候运行中报错,原因是函数的调用顺序出现错误,后经调试改正了。通过本实验的完成,更了解了此法分析的基本任务是从字符串表示的原程序中识别出具有独立意义的单词符号,其基本意思是根据少苗到单词符号的第一个字符的种类,拼出相应的单词符号。
附录:源代码
#include
#include"string.h"
#define al 10 /*符号的最大长度*/
#define norw 13 /*关键字个数*/
#define namx 14 /*数字允许的最长位数*/
FILE *fin;
FILE *fout;
char fname[al],fwname[al],a[al+1]/*a[50]*/,id[al+1],sym[20];
static char sword[11]={'+','-','*','/','(',')','=',',','.','#',';'};
static char
ssym[11][al]={"plus","minus","times","slash","lparen","rparen","eql","comma","period","neq", "semicolon"};
static char
word[13][al]={"begin","call","const","do","end","if","odd","procedure","read","then","var"," while","write"};//保留关键字
static char
wsym[13][al]={"beginsym","callsym","constsym","dosym","endsym","ifsym","oddsym","procsym","r eadsym","thensym","varsym","whilesym","writesym"};//关键字类型
int cc,ll,cx,linecount,num;
char line[81];
char ch;
void main(){
int getsym();
printf("**********编译原理实验PL/0语言词法分析**********\n");
printf("请输入进行词法分析的文件名:");
scanf("%s",fname);
fin=fopen(fname,"r");
printf("请输入分析结果保存的文件名:");
scanf("%s",fwname);
fout=fopen(fwname,"w");
linecount=0;//记录文件的行数
cc=ll=0;
ch=' ';
if(fin){
printf("\n-----开始词法分析-----\n");
fprintf(fout,"-----开始词法分析-----\n");
printf("单词自身的值单词种别\n");
fprintf(fout,"单词自身的值单词种别\n");
while( getsym()!=-1 ){
printf("%-20s",a);
fprintf(fout,"%-20s",a);
printf("%s",sym);//输出单词种别
fprintf(fout,"%s",sym);