|
实验一、词法分析实验
商软二班 张智恒 201506110172
一、 实验目的
编制一个词法分析程序
二、 实验内容和要求
编写一个词法分析程序,使其能够识别对应的单词符号,并以(单词符号 种别码)的形式输出。
三、 实验方法、步骤及结果测试
1. 源程序名:压缩包文件(rar或zip)中源程序名 zzh.c
可执行程序名:zzh.exe
2. 主要程序段及其解释:
# include<stdio.h>
# include<stdlib.h>
# include<string.h>
int panduan(char tmp[])
{
char b[6][10] = {"begin", "if", "then", "while", "do", "end", };
int k = 0;
while(k < 6) // 临时变量tmp 与 字符串b[k] 进行比较
{
if(strcmp(tmp, b[k]) == 0)
{
printf("<%s, %d> ", tmp, k+1);
return 0;
}
k++;
}
printf("<%s, 10> ", tmp);
return 0;
}
void cifafenxi(char a[])
{
int i = 0, j = 0;
char tmp[10];
int flag = 0;
while(a[i] != ' ')
{
if(a[i] >= 'a' && a[i] <= 'z') // 判断标识符
{
tmp[j] = a[i];
j++;
while((a[i+1] >= 'a' && a[i+1] <= 'z') || (a[i+1] >= '0' && a[i+1] <= '9'))
{
i++;
tmp[j] = a[i];
j++;
}
tmp[j] = ' ';
j = panduan(tmp);
}
if(a[i] >= '0' && a[i] <= '9') // 判断数字
{
tmp[j] = a[i];
j++;
while(a[i+1] >= '0' && a[i+1] <= '9')
{
i++;
tmp[j] = a[i];
j++;
}
tmp[j] = ' ';
printf("<%s, 11> ", tmp);
j = 0;
}
switch(a[i]) // 判断符号
{
case '+':printf("<+, 13> ");break;
case '-':printf("<-, 14> ");break;
case '*':printf("<*, 15> ");break;
case '/':printf("</, 16> ");break;
case ':':
{
if(a[i+1] == '=')
printf("<:=, 18> ");
else
printf("<:, 17> ");
}break;
case '<':
{
if(a[i+1] == '=')
printf("<<=, 21> ");
else if(a[i+1] == '>')
printf("<<>, 22> ");
else
printf("<<, 20> ");
}break;
case '>':
{
if(a[i+1] == '=')
printf("<>=, 24> ");
else
printf("<>, 23> ");
}break;
case '=':printf("<=, 25> ");break;
case ';':printf("<;, 26> ");break;
case '(':printf("<(, 27> ");break;
case ')':printf("<), 28> ");break;
case '#':printf("<#, 0> ");break;
}
i++;
}
}
int main(void)
{
char a[300];
printf("input : ");
gets(a);
cifafenxi(a);
return 0;
}
3. 运行结果及分析
一般必须配运行结果截图,结果是否符合预期及其分析。
(截图需根据实际,截取有代表性的测试例子)
四、 实验总结
1.很有难度,在机房里憋了几个小时,还是搞不定,主要是在数字那一块数字方面该程序是没有负数的,很多地方其实也都不算完美通过与同学的交流,掌握了主要方法后发现其原理十分简单,把每一种类型都分开出来特殊处理就可以了
词法分析是编译的第一个阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,
初次做词法分析时无从下手,后经过看书查资料对其慢慢理解, 勉强是做出了一个不太好的成品 ,
对于编译程序的学习,我会更加用心的,毕竟我觉得确实有难度,但它确实很有用,比如编译程序
的结构要如何简洁清晰条理化,编译程序的效率等等的实际问题