词法分析实验报告
实验一、词法分析实验
专业:商业软件三班 姓名:殷金秀 学号:201506110243
一、 实验目的
编制一个词法分析程序
二、 实验内容和要求
输入:源程序字符串
输出:二元组(单词种别码,单词符号本身)
三、 实验方法、步骤及结果测试
- 1. 源程序名:压缩包文件中源程序名
可执行程序名:
- 2. 原理分析及流程图
主要总体设计问题。(包括存储结构,主要算法,关键函数的实现等)
/*存储结构以及变量*/
char character[80];//存放所有输入的字符
char*rwtab[6]={"begin","if","then","while","do","end"};
char token[8];//单词自身字符串
char ch;//单个字符
int sym;//sym:单词种别码
int p,m=0,i,row,sum=0;//sum:整型常数 row:记录新读入的字符行的行号
/*主要算法*/
if/else选择语句实现不同字符的判断 for循环语句实现一个一个的读取字符
/*提示输入字符串并从键盘获取的字符存到character[]中*/
void main()
/*识别单词并将识别出来的单词用种别码标识*/
void scanner();
- 3. 主要程序段及其解释:
实现主要功能的程序段,重要的是程序的注释解释。
while(ch==' ')//忽略空格键
{
ch=character[p];
p++;
}
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//标识符或者变量名
{
m=0;
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
token[m++]=ch;
ch=character[p++];
}
token[m++]='\0';
p--;
sym=10;//置标识符的单词种别至sym
for(i=0;i<6;i++) //将识别出来的字符和已定义的标示符作比较,
if(strcmp(token,rwtab[i])==0)
{
sym=i+1;
break;
}
}
else if((ch>='0'&&ch<='9'))//检测数字
{
sum=0;
while((ch>='0'&&ch<='9'))
{
sum=sum*10+ch-'0';
ch=character[p++];
}
p--;
sym=11;//置常数的单词种别至sym
if(sum>32767)//
sym=-1;
}
else switch(ch)//其他字符
{
case'<':m=0;token[m++]=ch;// 检测小于等于的符号
ch=character[p++];
if(ch=='=')
{
sym=21;//置单词种别为21,即小于等于符号
token[m++]=ch;
}
else if(ch=='>')//检测小于大于的符号
{
sym=22;//置单词种别为22,即小于大于的符号
token[m++]=ch;
}
else
{
sym=23;// 置单词种别为23,即小于的符号
p--;
}
break;
case'>':m=0;token[m++]=ch; 检测大于等于的符号
ch=character[p++];
if(ch=='=')
{
sym=24; 置单词种别为24,即大于等于符号
token[m++]=ch;
}
else
{
sym=20; 置单词种别为20,即大于的符号
p--;
}
break;
case':':m=0;token[m++]=ch;
ch=character[p++];
if(ch=='=')//检测赋值符号
{
sym=18;// 置单词种别为18,即赋值符号
token[m++]=ch;
}
else
{
sym=17; 置单词种别为17,即冒号
p--;
}
case'*': sym=13;token[0]=ch;break; 置单词种别为13,即'*'
case'/':sym=14;token[0]=ch;break; 置单词种别为14,即'/'
case'+':sym=15;token[0]=ch;break; 置单词种别为15,即'+'
case'-':sym=16;token[0]=ch;break; 置单词种别为16,即'-'
case'=':sym=25;token[0]=ch;break; 置单词种别为25,即'='
case';':sym=26;token[0]=ch;break; 置单词种别为26,即';'
case'(':sym=27;token[0]=ch;break; 置单词种别为27,即'('
case')':sym=28;token[0]=ch;break; 置单词种别为28,即')'
case'#':sym=0;token[0]=ch;break; 置单词种别为0,即'#'
case'\n':sym=-2;break;
default:sym=-1;break;
- 4. 运行结果及分析
一般必须配运行结果截图,结果是否符合预期及其分析。
(截图需根据实际,截取有代表性的测试例子)
单词符号 |
种别码 |
单词符号 |
种别码 |
begin |
1 |
: |
17 |
if |
2 |
:= |
18 |
then |
3 |
< |
20 |
while |
4 |
<= |
21 |
do |
5 |
<> |
22 |
end |
6 |
> |
23 |
Letter(letter|digit) |
10 |
>= |
24 |
digit digit |
11 |
= |
25 |
+ |
13 |
; |
26 |
- |
14 |
( |
27 |
* |
15 |
) |
28 |
/ |
16 |
# |
0 |
结果符合预期
单词与单词的种别码都符合
四、 实验总结
心得体会,实验过程的难点问题及其解决的方法。
刚开始接触词法分析有点畏难的心理,但是当你慢慢的去敲程序,一点一点接近目标的时候,就会有点成就感,
实验过程中当然会遇到困难,比喻忘记一些学过的知识,此时我就会查找书上的内容,实验过程的难点就是识别单词并置单词的种别码为sym 遇到自己不会的就会上网查找资料。