C语言词法分析器
46865356.doc 2008-06-12 周宏
1.加强对词法分析原理、方法和基本实现技术的理解;
2.灵活运用这学期所学的知识对词法分析,语法分析有进一步的理解; 3.强化对系统软件综合工程实现能力的训练;
用C语言(或 C++ )作为宿主语言完成:
C语言(win-TC , ANSI C或turbo C 2.0)词法分析器的
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
和实现。
1. 编写C语言词法分析器的源程序并调试通过;
2. 通过测试程序的验收;
3. 提交简明扼要的书面实验报告,内容包括:属性字设计;源程序主要流程;主要数据结构设计,
程序。
(1) main主程序图
处理每个字符 开始
1
46865356.doc 2008-06-12 周宏
Scan()函数,分析并
返回每个单词的属性
初始化
Run=1? 判断并输出每
个单词类型属
性。
初始化数组
Program[],words[]
提示输入程序字符串
输入并读取程序字符
是否结束
是
结束 (2) Scan()函数流程图
1
46865356.doc 2008-06-12 周宏 判断并标志为
运算符或标点
符号 初始化数组,标志符
判断并标志为判断并标志是其它类型 否为关键字
Return返回
sign数值
1
46865356.doc 2008-06-12 周宏
if (flag == 0)
#include
{ sign = 100; /*为关键字*/
#include }
}/* if 是关键字*/ int i,j,k,sign,number,flag,run,sum,autuor; /*handle digits*/ /*flag which is use to judge the string is keywords or not!*/ else if ((ch >= '0') && (ch <= '9')) char ch; { number = 0; char words[10] = {" "}; while ((ch >= '0' ) && (ch <= '9' )) char program[500]; { number = number*10+(ch-'0');
ch = program[i++]; int Scan(char program[]) } { char * keywords[39] = sign = 200; /*为数字*/
{ "auto","default","do", "extern","goto", i--;
"int","short","static","struct","switch", }
"typedef","void","break","case","char", /*opereation and edge handle*/
"const","continue","double","else", "enum", else switch (ch)
"float","for","if","long", "register", {
"return","signed","zhouhong","sizeof","union", case '=':{
"unsigned","volatile","while","main","printf", if (ch == '=')
"scanf","include","define","string" words[j++] = ch;
}; words[j] = '\0';
number = 0; ch = program[i++];
flag = 0; if (ch == '=')
j = 0; {words[j++] = ch;
ch = program[i++]; words[j] = '\0';
/* To handle the lettle space ands tab*/ sign= 401; /* = =
while ((ch == ' ') || (ch == '\t') || (ch == '\r')||(ch=='\n')) */
ch=program[i++]; }
else /* 跳过不理睬 */
/*handle letters*/ { i--; /*退回一个字符
if ((ch >= 'a') && (ch <= 'z' )) */
{ sign = 402; /* = */
while ((ch >= 'a') && (ch <= 'z' )) }
{ break;
words[j++]=ch; }
ch=program[i++]; case'>':{ if (ch == '>')
} words[j++] = ch;
i--; words[j] = '\0';
words[j++] = '\0'; ch = program[i++];
for (k = 0; k < 39; k++) if (ch == '=')
if (strcmp (words,keywords[k]) == 0) {words[j++] = ch;
{sign=k+1;flag=1; words[j] = '\0';
if(k==27) autuor=1; sign = 403; /* >=
break; */
} }
else if(ch=='>')
1
46865356.doc 2008-06-12 周宏
{ words[j++] =ch; case'+':{
words[j] ='\0'; if (ch == '+')
sign =419; /* >> words[j++] = ch; */ words[j] = '\0';
} ch = program[i++];
else if (ch == '=')
{ i--; { words[j++] = ch;
sign = 404; /* > words[j] = '\0'; */ sign= 409;
} }
break; else if (ch == '+') } { words[j++] = ch;
case'<': {if (ch == '<') words[j] = '\0';
words[j++] = ch; sign= 410;
words[j] = '\0'; }
ch = program[i++]; else
if (ch == '=') {i--;
{ words[j++] = ch; sign = 411;
words[j] = '\0'; }
sign = 405; break;
} }
else if(ch=='<') case'-': {if (ch == '-')
{ words[j++] = ch; words[j++] = ch;
words[j] = '\0'; words[j] = '\0';
sign = 420; ch = program[i++];
} if (ch == '=')
else { words[j++] = ch;
{ i--; words[j] = '\0';
sign = 406; sign= 412;
}break; }
} else if( ch == '-') case'!': { words[j++] = ch;
{if (ch == '!') words[j] = '\0';
words[j++] = ch; sign= 413;
words[j] = '\0'; }
ch = program[i++]; /* 负数的情况 */
if (ch == '=') else if((ch >= '0') && (ch <= '9'))
{words[j++] = ch; {while( (ch >= '0') && (ch <= '9') )
words[j] = '\0'; {words[j++] = ch;
sign= 407; ch = program[i++];
} }
else words[j] = '\0';
{i--; sign = 1000; /* 标志为1000 */
sign= 408; /* 负数 */
} break; i--;
} break;
1
46865356.doc 2008-06-12 周宏
} case';':{
else words[j] = ch;
{ i--; words[j+1] = '\0';
sign = 414; sign = 501;
}break; break; } } case'*':{ if (ch == '*') case'(':{
words[j++] = ch; words[j] = ch;
words[j] = '\0'; words[j+1] = '\0';
ch = program[i++]; sign = 502;
if (ch == '=') break;
{words[j++] = ch; }
words[j] = '\0'; case')':{
sign = 415; words[j] = ch;
} words[j+1] = '\0';
else sign = 503;
{ break;
i--; }
sign = 416; case'[':{
} words[j] = ch;
break; words[j+1] = '\0'; } sign = 504; case'/':{ if (ch == '/') break;
words[j++] = ch; }
words[j] = '\0'; case']':{
ch = program[i++]; words[j] = ch;
if (ch == '=') words[j+1] = '\0';
{ sign = 505;
words[j++] = ch; break;
words[j] = '\0'; }
sign = 417; case'{':{
} words[j] = ch;
else words[j+1] = '\0';
{ sign = 506;
i--; break;
sign = 418; }
} case'}':{
break; words[j] = ch; } words[j+1] = '\0'; case'^':{ sign = 507; if(ch=='^') break;
words[j++] = ch; }
words[j] = '\0'; case':':{
sign =421; words[j] = ch;
break; words[j+1] = '\0';
} sign = 508;
1
46865356.doc 2008-06-12 周宏
break; break; } } case'"':{ }
words[j] = ch; return sign;
words[j+1] = '\0'; }
sign = 509; void display()
break; {printf("Autuor: zhouhong\n"); } printf("calss: computer 0502\n"); case'%':{ printf("time: 2008-06-10\n");
if (ch == '%') printf("Email: zhouhong206521@126.com\n");
words[j++] = ch; printf("QQ: 454350734\n");
words[j] = '\0'; }
ch = program[i++];
if (ch == '=') int main()
{ {
words[j++] = ch; i=0; run=1;
words[j] = '\0'; while(run)
sign = 510; { int ent;
} int j;
else ent=autuor=sum=0;
{ for( j = 0; j < 500; j++)
i--; program[j] = ' ';
sign = 511; for( j = 0; j < 10; j++)
} words[j] = ' ';
break; /* 初始化 */ } printf("enter the program end with '@':\n"); case',':{ do words[j] = ch; { words[j+1] = '\0'; ch = getchar(); sign = 512; program[i++] = ch; break; }while(ch != '@'); } case'#':{ words[j] = ch; i = 0; words[j+1] = '\0'; do{sign = Scan(program); sign = 513; if (sign == 200) break; {printf("(number , %8d, %5d) } ",number,sign); case'@':{ sum++; ent=1; words[j] = '#'; } words[j+1] = '\0'; else if (sign == -1) sign = 0; { printf("(error , %5d) break; ",sign); } sum++; ent=1; default:{ }
else if(sign>=1&&sign<=38) sign = -1; /* 错误 */
1
46865356.doc 2008-06-12 周宏
{printf("(keyword , %8s, %5d) ",words,sign);
sum++; ent=1;
}
else if(sign>=401&&sign<=421)
{ printf("(operator, %8s, %5d) ",words,sign);
sum++; ent=1;
}
else if(sign>=501&&sign<=513)
{printf("(symbol , %8s, %5d) ",words,sign);
sum++; ent=1;
}
if(sum%2==0&&ent==1) puts("\r"),ent=0;
}while (sign != 0);
puts("\n");
if(autuor==1)display(), puts("\n");
printf("continue?(Y or N):");
getchar(); ch=getchar();
if(ch=='N'||ch=='n') run=0;
} return 0;
getchar();
}
1
46865356.doc 2008-06-12 周宏
(1) 当程序开始时会出现程序输入界面,如下面图(一)所示:
图(一)
(2) 接着输入C语言原程序,如下面图(二)所示:
图(二)
(3)按回车键后,程序就会运行并输出结果,如下面图(三)所示:
图(三)
(4)此程序另外还加入了一个身体标志,当程序输入的单词中包含“zhouhong” 的字符串是,运行程序后,会在正常输出的最后面出现
几行关于个人身份信息。如下面图(四)所示:
1
46865356.doc 2008-06-12 周宏
图(四)
(1)刚开始,这个程序是先看了网上的一个类似程序之后,在他的基础上面完善而得到了这个程序,
当然这个程序还有一些不足,如符号“&&“,”||”,”^”等不能识别,并且个别关键字也没有加入
进去,所以当遇到这些会以错误形式输出。
(2)看原程序时,总以为很简单,但真的当自已去做的的时候,发现原来程序的完善是无穷无尽的,
你只能做到更好,却做不到最好。
(3)在上理论课时,理性的觉得很难,当看到程序是如何识别一个一个关键字,一个一个字符的时
候,也觉得并不是那么难啊。
1