实验1、 词法分析程序实验数组
专业 计算机科学与技术 姓名 刘东 学号 201506110164函数
1、 实验目的测试
2、 实验内容和要求spa
3、 实验方法、步骤及结果测试设计
可执行程序名:cifafenxi.exeblog
|
doip
{ci
scanf("%s\n",input);字符串
i=0;input
while(input[i] !='\0')
{
//printf("char=%c\n",input[i]);
if(input[i] == '+' || input[i] == '-' || input[i] == '*' || input[i] == '/' || input[i] == '=') //对字符串中的表达式作分词,并记录相应运算符
{
//printf("\nhello\n");
p=(NODE*)malloc(sizeof(NODE));
p->next=NULL;
p->string=(char*)malloc(sizeof(char)*2);
p->string[0]='\0';
strncpy(p->string,&input[i],1);
p->next=yunsuanfu->next;
yunsuanfu->next=p;
// printf("yunsuanfu is %c\n",input[i]);
}
else if(ispunct(input[i]) && input[i] != '~') //对字符串中出现界符的地方作分词,并记录相应界符
{
//ch=(char*)malloc(sizeof(NODE));
p=(NODE*)malloc(sizeof(NODE));
p->next=NULL;
p->string=(char*)malloc(sizeof(char)*2);
p->string[0]='\0';
strncpy(p->string,&input[i],1);
p->next=jiefu->next;
jiefu->next=p;
}
i++;
}
ch=strtok(input,delim);
do
{
if(input[0] =='~')
break;
q=head;
p=(NODE*)malloc(sizeof(NODE));
p->next=NULL;
p->string=(char*)malloc(sizeof(input));
p->string[0]='\0';
strcat(p->string,ch); //链接先后字符串,合成新的字符串
while(q->next !=NULL)
q=q->next;
p->next=q->next;
q->next=p;
}while(ch=strtok(NULL,delim));
}while(input[0] !='~');
if(strspn(p->string,biaowords)) //使用strspn()来对字符串中是否含有biaowords数组中的字符,如有则为标识符
{
q->string=p->string;
q->next=biaoshi->next;
biaoshi->next=q;
}
通常必须配运行结果截图,结果是否符合预期及其分析。
(截图需根据实际,截取有表明性的测试例子)
实验结果与预期基本吻合,可是在界符那里会出现除界符之外其余的字符,我认为出现这一缘由是由于在复制字符串的时候多了复制了几位,但修改后得出的结论并非这样。
4、 实验总结
本次实验中我学会了如何经过C来写链接多个任意长度的字符串并返回该字符串。本身动手写了一个小型的分词模块,感受对功能设计的手段丰富了。其实后来我知道了这个词法分析程序其实并不用作这么多,但我真的经过此次的实验尝试了不少之前没有想过的设计。
主要的设计问题有:
一、如何将各个字符串链接起来,使它变成一个新串。
二、如何区分标识符,界符和运算符
三、怎么输出结果
解决方法:
一、我使用动态数组来存储可变长度的字符串,每次输入一个字符窜后都会计算这个字符串的空间大小,并加上以前所有的空间大小来建立一个新的字符串,并使用strcmp()函数来复制先输入的字符串。
二、我使用strspn()函数来匹配字符串中哪些是标识符。此前我对整个字符串作了一个分词。
三、我是使用链表来记录每个类别(如标识符、运算符、界符等)他们里面分别有哪些字符串。