标签:
实验一、词法分析实验
一、 实验目的
编制一个词法分析程序
二、 实验内容和要求
输入:源程序字符串
输出:二元组(种别,单词本身)
三、 实验方法、步骤及结果测试
1. 源程序名:压缩包文件(rar或zip)中源程序名×××.c可执行程序名:×××.exe
2. 原理分析及流程图
把输入的字符用链表进行存储,利用自己构造的一个判断函数,读取字符链表中存储的字符并进行判断处理,如果符合条件则输出,并继续判断直到链表为空则退出。
3. 主要程序段及其解释:
typedef struct link //字符链表
{
char data; //存放字符
struct link *next; //指向下一个
}Link;
void specialchar(Link *charhead) //判断字符函数
{
Link *q,*p;
int i;
q=charhead->next;
while(q!=NULL)
{
switch(q->data)
{
case ‘b‘: //判断是否是标识符begin
special[0]=q->data; //把待判断的字符存入数组
q=q->next;
if(q->data==‘e‘) //如果符合则继续进入判断
{
special[1]=q->data; //把待判断的字符存入数组
q=q->next;
if(q->data==‘g‘)
{
special[2]=q->data;
q=q->next;
if(q->data==‘i‘)
{
special[3]=q->data;
q=q->next;
if(q->data==‘n‘)
{
special[4]=q->data; //把符合文法的字符全部存入到一个数组里
printf("<标识符> ");
for(i=0;i<5;i++) //用for循环把数组输出
printf("%c",special[i]);
printf("\n");
}
}
}
}
break;
…………….
一般必须配运行结果截图,结果是否符合预期及其分析。
(截图需根据实际,截取有代表性的测试例子)
四、 实验总结
程序能够把题目中给出的关键字begin、 if、 then、 while 、do、 end、 l(l|d)*、dd*,以及加减乘除,小括号,尖括号等于号 等判断出来。
本程序使用的是链表进行存储,原因是链表具有灵活性,能够根据用户的输入情况来申请空间,而且所需的空间灵活,不像数组那样要求申请固定的空间导致空间的浪费。同时本程序也使用大量的判断符,利用数组把待判断的字符进行存储,一旦发现符合我们的文法规则就把数组进行输出。然后重复使用该数组。
不足:进入判断后指针会指向下一个链表元素,当发现不符合这个单词的文法规则的时候就会退出switch循环,而退出switch循环时,会再一次指向下一个链表元素,因此产生,当不符合文法规则的时候,就会少判断到一个字符元素。
标签:
原文地址:http://www.cnblogs.com/veol/p/5955880.html