词法分析-实验报告
实验一词法分析实验
一、 实验目的
编制一个词法分析程序
二、 实验内容和要求
- 输入:源程序字符串
- 输出:二元组(种别,单词本身)
- 待分析语言的词法规则
三、 实验方法、步骤及结果测试
1. 源程序名:压缩包文件(rar或zip)中源程序名 Lexer.c
可执行程序名:Lexer.exe
2. 原理分析及流程图
程序主要是通过字符型二维数组将各种单词符号以字符串的形式储存到数组中,然后再通过对用户输入的字符串将里面的字符逐个判断。
程序中涉及对字符判断的函数主要有三个,分别是Number、Alphabet和Sign。Number主要是将获取到的字符进行判断是否为数字,如果是数字则进行输出操作。Alphabet主要是判断标识符以及关键字的,将用户输入的字符串的字母复制到另一个字符串,然后与单词表的单词比对如果是输出为关键字,否则输出为标识符。Sign的主要功能是分析一些运算符以及界符等。
Number函数流程图
Alphabet和Sign函数的实现过程与上述函数大致相同。
3. 主要程序段及其解释:
void Number()/*识别字符串的数字*/ { int i=temp; if(string[i]>='0'&&string[i]<='9')/*判断是否为数字*/ { while(string[i+1]>='0'&&string[i+1]<='9')/*如果是则对下一个字符进行判断;i作为计数器*/ i++; if(temp!=i) { printf("(11,\'"); while(temp<=i) { printf("%c",string[temp]); temp++; } printf("\')\n"); } else { printf("(11,\'%c\')\n",string[temp]); temp++; } } } void Alphabet()/*识别字符串的字母及关键字*/ { int i,j; if(string[temp]>='a'&&string[temp]<='z'||string[temp]=='_')/*判断是否为字母*/ { i=temp;/*记录开始位置*/ while(string[temp+1]>='a'&&string[temp+1]<='z'||string[temp+1]=='_'||string[temp+1]>='0'&&string[temp+1]<='9') temp++;/*如果符合规则对下一个字符进行判断;temp作为计数器*/ if(temp==i) { printf("(10,\'%c\')\n",string[i],string[i]); temp++; } else { j=0; while(i<=temp) { copy[j]=string[i]; i++; j++; } for(i=0;i<10;i++) if(strcmp(copy,word[i])==0)/*判断该字符串是否属于关键字*/ { printf("(%d,\'%s\')\n",i+1,word[i]); break; } temp++; if(strcmp(copy,word[i])!=0)printf("(10,\'%s\')\n",copy); } } } void Sign()/*识别界运算符*/ { int i,j; for(i=0;i<20;i++) copy[i]='\0'; if(string[temp]!='\0') copy[0]=string[temp]; else return; for(i=0;i<16;i++) { if(!strcmp(copy,word2[i]))/*先判断字符是否为表内的符号*/ { copy[1]=string[temp+1]; for(j=0;j<16;j++) if(!strcmp(copy,word2[j]))/*在第一个字符是的情况下判断两个字符是否为表内的符号*/ { printf("(%d,\'%s\')\n",j+13,word2[j]); temp+=2; return; } printf("(%d,\'%s\')\n",i+13,word2[i]); temp++; return; } } }
4. 运行结果及分析
四、 实验总结
写这个词法分析程序最主要的是写出将输入的字符串将其转化成单个字符与表中字符串对比判断的算法。
所以,我们从中便可看出难点究竟在哪,就是将字母、特殊符号、数字逐个区分在这,我使用了上面的三个函数来解决问题。
这个解决方法在上面有过介绍,就是在判断第一个为数字的情况下先不输出,判断下一个字符,依次类推,若不是数字则整个字符串输出。字母与特殊符号的解法过程参照与数字的解法。