//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
//定义关键字
char*Key[36]={"main","printf","scanf","else","if","auto","double","int","struct","break","long","switch","case","enum","register","typedef","char","extern","return","union","const","float","short","unsigned","continue","for","signed","void","default","goto","sizeof","volatile","do","while","static"};
int syn; /*存放单词字符的种别码*/
char Word[20],ch; // 存储识别出的单词流
int IsAlpha(char c) { //判断是否为字母
if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))
{
return 1;
syn=71;
}
else return 0;
}
int IsNum(char c){ //判断是否为数字
if(c>='0'&&c<='9')
{return 1;
syn=70;
}
else return 0;
}
int IsKey(char *Word){ //识别关键字函数
int m,i;
for(i=0;i<35;i++){
if((m=strcmp(Word,Key[i]))==0)
{ syn=i+1;
if(i==0)
return 2;
return 1;
}
}
return 0;
}
void scanner(FILE *fp){ //扫描函数
char Word[20]={'\0'};
char ch;
int i,c;
ch=fgetc(fp); //获取字符,指针fp并自动指向下一个字符
if(IsAlpha(ch)){ //判断该字符是否是字母
Word[0]=ch;
ch=fgetc(fp);
i=1;
while(IsNum(ch)||IsAlpha(ch)){ //判断该字符是否是字母或数字
Word[i]=ch;
i++;
ch=fgetc(fp);
}
Word[i]='\0'; //'\0' 代表字符结束(空格)
fseek(fp,-1,1); //回退一个字符
c=IsKey(Word); //判断是否是关键字
if(c==0){syn=36;
printf("(字符%s是:$普通标识符,\t\t种别码是:%d)\n\n",Word,syn);}//不是关键字
else if(c==2) {syn=360;printf("(%s$主函数\t,\t\t种别码是:%d)\n\n",Word,syn);}
else {syn=361; printf("(字符%s是:$关键字\t,\t\t种别码是:%d)\n\n",Word,syn); } //输出关键字
}
else //开始判断的字符不是字母
if(IsNum(ch)){ //判断是否是数字
Word[0]=ch;
ch=fgetc(fp);
i=1;
while(IsNum(ch)){
Word[i]=ch;
i++;
ch=fgetc(fp);
}
Word[i]='\0';
fseek(fp,-1,1); //回退
syn=73;
printf("(字符%s是$无符号实数\t\t,\t\t种别码是:%d)\n\n",Word,syn);
}
else //开始判断的字符不是字母也不是数字
{
Word[0]=ch;
switch(ch){
case'[':syn=57;break;
case'\\':syn=74;break;
case']':syn=58;break;
case'(':syn=59;break;
case')':syn=60;break;
case'{':syn=61;break;
case'}':syn=62;break;
case',':syn=63;break;
case'"':syn=64;break;
case';':syn=69;printf("(字符%s是$界符\t\t,\t\t种别码是:%d)\n\n",Word,syn); break;
case'+':ch=fgetc(fp);
Word[1]=ch;
if(ch=='='){syn=40;
printf("(字符%s是$运算符\t\t,\t\t种别码是:%d)\n\n",Word,syn);//运算符"+="
}
else if(ch=='+'){syn=41;
printf("(字符%s是$运算符\t\t,\t\t种别码是:%d)\n\n",Word,syn); //判断结果为"++"
}
else {
fseek(fp,-1,1);syn=42;
printf("(字符%s是$运算符\t\t,\t\t种别码是:%d)\n\n",Word,syn); //判断结果为"+"
}
break;
case'-':ch=fgetc(fp);
Word[1]=ch;
if(ch=='='){
printf("(字符%s是$运算符\t\t,\t\t种别码是:%d)\n\n",Word,syn); }
else if(ch=='-'){syn=44;
printf("(字符%s是$运算符\t\t,\t\t种别码是:%d)\n\n",Word,syn); //判断结果为"--"
}
else {
fseek(fp,-1,1);syn=43;
printf("(字符%s是$运算符\t\t,\t\t种别码是:%d)\n\n",Word,syn); //判断结果为"-"
}
break;
case'*':syn=45;break;
case'/':syn=46;break;
case'!':syn=47;break;
case'?':syn=37;break;
case':':syn=38;break;
case'.':syn=39;break;
case'#':syn=65;break;
case'=':ch=fgetc(fp);
if(ch=='='){syn=48;
printf("(字符%s是\$运算符\t\t,t\t种别码是:%d)\n\n",Word,syn);
}
else {
fseek(fp,-1,1);syn=49;
printf("(字符%s是$运算符\t\t,\t\t种别码是:%d)\n\n",Word,syn);
}
break;
}
}
}
int main()
{
return 0;
}
// 词法分析结果:
//
//
// ■〓〓〓〓〓〓〓〓下面是数字的涵义:〓〓〓〓〓〓〓〓〓■
//
// ■ 1.数字1到35代表关键字 ■
//
// ■ 2.数字36代表普通标识符 ■
//
// ■ 3.数字37到65代表算符 ■
//
// ■ 4.数字69代表界符 ■
//
// ■ 5.数字70,71和73分别代表数字和字母无符号数字 ■
//
// ■〓〓〓〓〓〓〓〓〓〓〓〓〓●〓〓〓〓〓〓〓〓〓〓〓 ■
//
//
//请输入源文件名(包括路径和后缀名):E:\Canalysis\test.cpp
//
//
//******************* 词法分析结果如下 *******************
//
//(字符include是:$普通标识符, 种别码是:36)
//
//
//(字符stdio是:$普通标识符, 种别码是:36)
//
//
//(字符h是:$普通标识符, 种别码是:36)
//
//
//(字符void是:$关键字 , 种别码是:361)
//
//
//(main$主函数 , 种别码是:360)
//
//
//(字符int是:$关键字 , 种别码是:361)
//
//
//(字符m是:$普通标识符, 种别码是:36)
//
//
//(字符10是$无符号实数 , 种别码是:73)
//
//
//(字符10是$无符号实数 , 种别码是:73)
//
//
//(字符=是$运算符 , 种别码是:49)
//
//
//(字符0是$无符号实数 , 种别码是:73)
//
//
//(字符1是$无符号实数 , 种别码是:73)
//(字符;是$界符 , 种别码是:69)
//
//
//(字符int是:$关键字 , 种别码是:361)
//
//
//(字符i是:$普通标识符, 种别码是:36)
//
//
//(字符j是:$普通标识符, 种别码是:36)
//
//
//(字符n是:$普通标识符, 种别码是:36)
//
//
//(字符;是$界符 , 种别码是:69)
//
//
//(字符printf是:$关键字 , 种别码是:361)
//
//
//(字符please是:$普通标识符, 种别码是:36)
//
//
//(字符enter是:$普通标识符, 种别码是:36)
//
//
//(字符the是:$普通标识符, 种别码是:36)
//
//
//(字符trangle是:$普通标识符, 种别码是:36)
//
//
//无法识别字符!
//
//
//无法识别字符!
//
//
//(字符;是$界符 , 种别码是:69)
//
//
//(字符scanf是:$关键字 , 种别码是:361)
//
//
//字符%d是$类型标识符
//---------------------------------------------------------------------------