📄 词法分析1.cpp
字号:
#include<iostream.h>
#include<string.h>
void scaner(); //扫描字符串函数
int output(void); //定义output()函数
int IsLetter(char );
int IsDigit(char );
char prog[80],token[8]; //prog存放输入的字符串,token存放构成单词的字符串
char ch;
int syn,p,n,m,sum; //syn存放单词符号的种别码,sum存放整型单词
char *rwtab[10]={"int","if","then","while","do","for","else","break","case","switch"}; //关键字表
void main()
{
p=0;
int i=0;
cout<<"Please input your string and end with #:"<<endl;
cin.get(prog,80); //要求用户输入字符串
output();
cout<<" End!"<<endl<<" Thanks!"<<endl;
}
int output()
{
do
{
scaner(); //调用扫描子函数
switch(syn)
{
case 11:
cout<<"("<<"11,"<<sum<<")"<<endl;
break;
case -1:
cout<<"error"; break;
case 10:
cout<<"("<<syn<<",";
for(n=0;token[n]!='\0';n++)
cout<<token[n];
cout<<")"<<endl;
break;
case 1:
cout<<"(1"<<","<<"int"<<")"<<endl; break;
case 2:
cout<<"(2"<<","<<"if"<<")"<<endl; break;
case 3:
cout<<"(3"<<","<<"then"<<")"<<endl; break;
case 4:
cout<<"(4"<<","<<"while"<<")"<<endl; break;
case 5:
cout<<"(5"<<","<<"do"<<")"<<endl; break;
case 6:
cout<<"(6"<<","<<"for"<<")"<<endl; break;
default:cout<<"("<<syn<<",";
for(n=0;token[n]!='\0';n++)
cout<<token[n];
cout<<")"<<endl;
break;
}
}while(syn!=0);
return 0;
}
void scaner()
{
for(n=0;n<8;n++)
token[n]=NULL;
ch=prog[p++]; //读入ch
while(ch==' ') ch=prog[p++]; //空格跳过
if(IsLetter(ch))
{
int m=0;
while(IsDigit(ch)||IsLetter(ch))
{
token[m++]=ch;
ch=prog[p++];
}
token[m++]='\0';
p--;
syn=10;
for(n=0;n<6;n++)
{
if(strcmp(token,rwtab[n])==0) //二元数组判断关键字的种别码
{
if(n==0) syn=1;
else if(n==1) syn=2;
else if(n==2) syn=3;
else if(n==3) syn=4;
else if(n==4) syn=5;
else if(n==5) syn=6;
else if(n==6) syn=7;
else if(n==7) syn=8;
else if(n==8) syn=9;
else if(n==9) syn=12;
}
}
}
else
if(IsDigit(ch))
{
sum=0;
while(IsDigit(ch))
{
sum=sum*10+ch-'0'; //依次读入数字串,如1234
ch=prog[p++];
}
p--;syn=11;
}
else
switch(ch)
{
case '<':
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='>')
{
syn=21;
token[m++]=ch;
}
else if(ch=='=')
{
syn=22;
token[m++]=ch;
}
else
{
syn=20;p--;
}
break;
case '>': m=0; //对形如<=、>=的运算符进行判断及种别码的对应
token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=24;
token[m++]=ch;
}
else
{
syn=23;p--;
}
break;
case '!':
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=18;
token[m++]=ch;
}
break;
case '+': //对各运算符和界符进行判断及对应种别码
syn=13;token[0]=ch;break;
case '-':
syn=14;token[0]=ch;break;
case '*':
syn=15;token[0]=ch;break;
case '/':
syn=16;token[0]=ch;break;
case ':':
syn=17;token[0]=ch;break;
case ',':
syn=19;token[0]=ch;break;
case '=':
syn=25;token[0]=ch;break;
case ';':
syn=26;token[0]=ch;break;
case '(':
syn=27;token[0]=ch;break;
case ')':
syn=28;token[0]=ch;break;
case '{':
syn=29;token[0]=ch;break;
case '}':
syn=30;token[0]=ch;break;
case '#':
syn=0;token[0]=ch;break;
default:
syn=-1;break;
}
}
int IsLetter(char ch) //字母表
{
if(ch=='A'||ch=='B'||ch=='C'||ch=='D'||ch=='E'||ch=='F'||ch=='G'||ch=='H'||
ch=='I'||ch=='J'||ch=='K'||ch=='L'||ch=='M'||ch=='N'||ch=='O'||ch=='P'||
ch=='Q'||ch=='R'||ch=='S'||ch=='T'||ch=='U'||ch=='V'||ch=='W'||ch=='X'||
ch=='Y'||ch=='Z'||ch=='a'||ch=='b'||ch=='c'||ch=='d'||ch=='e'||ch=='f'||
ch=='g'||ch=='h'||ch=='i'||ch=='j'||ch=='k'||ch=='l'||ch=='m'||ch=='n'||ch=='o'||
ch=='p'||ch=='q'||ch=='r'||ch=='s'||ch=='t'||ch=='u'||ch=='v'||ch=='w'||
ch=='x'||ch=='y'||ch=='z')
return 1;
else return 0;
}
int IsDigit(char ch) //数字表
{
if(ch=='1'||ch=='2'||ch=='3'||ch=='4'||ch=='5'||ch=='6'||ch=='7'||ch=='8'||ch=='9'||ch=='0')
return 1;
else return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -