www.pudn.com > eva.rar > 1.cpp
/*程序实现C语言词法分析器的设计*/
/*06000921 吴珊珊 9班
/*用到的几个函数
GetNextWord() 从字符串中得到一个单词
GetC() 从当前流中取一个字符
Pushback() 退回字符
SearchKey() 查找保留字表
/*用到的变量
cch 放当前字符
flag 标志有无退回字符(1:有 0:无)
bchar 放退回字符
/*C语言中的保留字(32个)
auto break case char const
continue default do double else
enum extern float for goto
if int long register return
short signed sizeof static struct
switch typedef union unsigned void
volatile while
/*
运算符(43个)
( ) [ ] { } -> . ! ~ ++ -- - *
& / % + << >> < <= > >= == != ^ |
&& || ?: = += -= *= %= >>= <<= &= ^= != |=
,
*/
#include
#include
#include
#include
int flag=0;
char cch;
char bchar;
char str[100];
FILE *fp;
void Pushback(char c)
{
bchar=c;
flag=1;
}
char GetC( )
{
if(flag==1)
{
flag=0;
return bchar;
}
char t;
t=getc(fp);
if(t=='\n'||t=='\t'||t=='\r') t=' ';
return t;
}
int SearchKey( )
{
char StrToken[32][10]={"auto","break","case","char","const",
"continue","default","do","double","else","enum","extern",
"float","for","goto","if","int","long","register","return",
"short","signed","sizeof","static","struct","switch",
"typedef","union","unsigned","void","volatile","while"};
for(int i=0;i<32;i++)
{
if(strcmp(StrToken[i],str)==0)
return i;
}
return 0;
}
void GetNextWord( )
{
cch=GetC();
while(cch==' ')
{
cch=GetC( );
}
int k=0;
str[0]=cch;
if((cch>='a'&&cch<='z')||(cch>='A'&&cch<='Z'))
{
str[++k]=cch;
cch=GetC( );
while((cch>='a'&&cch<='z')||(cch>='A'&&cch<='Z')||
(cch>='0'&&cch<='9'))
{
str[k++]=cch;
cch=GetC( );
}
str[k]='\0';
Pushback(cch);
if(SearchKey( )==0)
cout<<"200"<='0')
{
while(cch<='9'&&cch>='0')
cch=GetC( );
if(cch=='E'||cch=='D')
cch=GetC( );
if(cch=='+'||cch=='-')
{
cch=GetC( );
if(cch<='9'&&cch>='0')
cch=GetC( );
while(cch<='9'&&cch>='0')
cch=GetC( );
Pushback(cch);
cout<<"400";
}
else if(cch<='9'&&cch>='0')
{
while(cch<='9'&&cch>='0')
cch=GetC( );
Pushback(cch);
cout<<"400";
}
else if(cch=='.')
{
while(cch<='9'&&cch>='0')
cch=GetC( );
if(cch=='E'||cch=='D')
cch=GetC( );
if(cch=='+'||cch=='-')
{
cch=GetC( );
if(cch<='9'&&cch>='0')
cch=GetC( );
while(cch<='9'&&cch>='0')
cch=GetC( );
Pushback(cch);
cout<<"400";
}
else if(cch<='9'&&cch>='0')
{
while(cch<='9'&&cch>='0')
cch=GetC( );
Pushback(cch);
cout<<"400";
}
else Pushback(cch);
cout<<"400";
}
}
else
{
switch(cch)
{
case '+':{cch=GetC( );
switch(cch)
{case '+':cout<<"1"<<"++";break;
case '-':cout<<"2"<<"+=";break;
default:Pushback(cch);
cout<<"3"<<"+";break;
}
};break;
case '-':{cch=GetC( );
switch(cch)
{case '-':cout<<"4"<<"--";break;
case '=':cout<<"5"<<"-=";break;
case '>':cout<<"6"<<"->";break;
default:Pushback(cch);
cout<<"7"<<"-";
};break;
}
case '*':{cch=GetC( );
if(cch=='=') cout<<"8"<<"*=";
else {
Pushback(cch);
cout<<"9"<<"*";
}
};break;
case '/':{cch=GetC( );
if(cch=='=') cout<<"10"<<"/=";
else {
Pushback(cch);
cout<<"11"<<"/";
}
};break;
case '<':{cch=GetC( );
switch(cch)
{
case'=':cout<<"12"<<"<=";break;
case'<':cch=GetC( );
if(cch=='=')cout<<"13"<<"<<=";
else {
Pushback(cch);
cout<<"14"<<"<<";
};
default:Pushback(cch);
cout<<"15"<<"<";
}
};break;
case '>':{cch=GetC( );
switch(cch)
{
case'=':cout<<"16"<<">=";break;
case'>':cch=GetC( );
if(cch=='=')cout<<"17"<<">>=";
else {
Pushback(cch);
cout<<"18"<<">>";break;}
default:Pushback(cch);
cout<<"19"<<">";
}
};break;
case '=':{cch=GetC( );
if(cch=='=') cout<<"20"<<"==";
else {
Pushback(cch);
cout<<"21"<<"=";
}
};break;
case '%':{cch=GetC( );
if(cch=='=') cout<<"22"<<"%=";
else {
Pushback(cch);
cout<<"23"<<"%";
}
};break;
case '!':{cch=GetC( );
if(cch=='=') cout<<"24"<<"!=";
else {
Pushback(cch);
cout<<"25"<<"!";
}
};break;
case '&':{cch=GetC( );
switch(cch)
{
case '&':cout<<"26"<<"&&";break;
case '=':cout<<"27"<<"&=";break;
default:Pushback(cch);
cout<<"28"<<"&";
}
};break;
case '^':cch=GetC( );
if(cch=='=')cout<<"29"<<"^=";
else{Pushback(cch);
cout<<"30"<<"^";
};break;
case '|':cch=GetC( );
switch(cch)
{
case'|':cout<<"31"<<"||";break;
case'=':cout<<"32"<<"|=";break;
default:Pushback(cch);
cout<<"33"<<"|";
};break;
case '(':cout<<"34"<<"(";break;
case ')':cout<<"35"<<")";break;
case '[':cout<<"36"<<"[";break;
case ']':cout<<"37"<<"]";break;
case '{':cout<<"38"<<"{";break;
case '}':cout<<"39"<<"}";break;
case '~':cout<<"40"<<"~";break;
case '.':cout<<"41"<<".";break;
case ';':cout<<"42"<<";";break;
case ',':cout<<"43"<<",";break;
case '?':{cch=GetC( );
if(cch==':')cout<<"44"<<"?:";
else cerr<<"error!"<