西安邮电大学
西 安 邮 电 大 学
(计算机学院)
课内实验报告
实验名称: 词法分析器
专业名称: 计算机科学与技术
班 级: 学生姓名:
一. 实验目的及实验环境
实验目的:构造一个简单的词法分析器
实验环境:VC6.0 二. 实验内容
利用C语言构造一个简单的词法分析器,可以识别出程序中的关键字,并且输出;
三.方案设计
首先自定义一些关键字,并且给他们分别设置一个数字标识符;
建立一个数组,保存每次扫描的单词,并判断两个字符串是否相等,若相等则输入其关键字,若不相等,则认为为定义的一个变量;
对于一些运算操作符,则依次进行比较,我采用的是switch语句进行判断; 在这个程序中,需要对空格进行识别,识别时,扫描到空格,则指针继续向前移动,直到遇到下一个字符即可。 对于数字,则认为为变量的赋值;
1.正常测试数据(3组)及运行结果;
2.非正常测试数据(2组)及运行结果。
五.总结
1.实验过程中遇到的问题及解决办法;
在实验中,重要的问题是把字符分解出来,在分解的时候,应该临时保存在一个数组中,另外的话,需要识别空格,在碰到空格的时候,指针继续向前扫描,直至遇到下一个字符开始,根据字符串是否相等,来判断关键字;
六.附录:源代码(电子版)
#include #include
char prog[80],token[8],ch; int syn,p,m,n,sum;
char *rwtab[6]={
void scaner(void);
main() {
p=0;
printf(
scanf(
scaner(); switch(syn) {
case 11:
printf(
case -1:
printf(
default:
printf(
}while(syn!=0); }
void scaner(void) {
sum=0;
for(m=0;m
token[m++]= NULL;
ch=prog[p++]; m=0;
while((ch==' ')||(ch=='\n')) ch=prog[p++];
if(((ch='a'))||((ch='A'))) {
while(((ch='a'))||((ch='A'))||((ch>='0')&&(ch
token[m++]=ch; ch=prog[p++]; } p--; syn=10;
for(n=0;n
if(strcmp(token,rwtab[n])==0) {
syn=n+1; break; } }
else if((ch>='0')&&(ch
while((ch>='0')&&(ch
sum=sum*10+ch-'0'; ch=prog[p++]; } p--; syn=11; } else {
switch(ch) {
case '
token[m++]=ch; ch=prog[p++]; if(ch=='=') {
syn=22;
token[m++]=ch; } else {
syn=20; p--; } break;
case '>':
token[m++]=ch; ch=prog[p++]; if(ch=='=') {
syn=24;
token[m++]=ch; } else {
syn=23; p--; } break;
token[m++]=ch; ch=prog[p++]; if(ch=='+') {
syn=17;
token[m++]=ch; } else {
syn=13; p--; } break;
case '-':
token[m++]=ch; ch=prog[p++]; if(ch=='-') {
syn=29;
token[m++]=ch; } else {
syn=14; p--; } break;
case '!':
ch=prog[p++]; if(ch=='=') {
syn=21;
token[m++]=ch; } else {
syn=31; p--; } break;
token[m++]=ch; ch=prog[p++]; if(ch=='=') {
syn=25;
token[m++]=ch; } else {
syn=18; p--; } break;
case '*':
syn=15;
token[m++]=ch; break;
case '/':
syn=16;
token[m++]=ch; break;
case '(': syn=27;
token[m++]=ch; break;
case ')':
syn=28;
token[m++]=ch; break;
case '{': syn=5;
token[m++]=ch; break;
case '}': syn=6;
token[m++]=ch; break;
case ';':
syn=26;
token[m++]=ch; break;
case '\
token[m++]=ch; break;
case '#': syn=0;
token[m++]=ch; break;
case ':':
syn=17;
token[m++]=ch; break;
default: syn=-1; break; } }
token[m++]='\0'; }