📄 haha.cpp
字号:
#include<ctype.h>
#include<stdlib.h>
#include<iomanip>
#include<string>
#include<iostream.h>
struct danci
{
int id; //单词种别
char name[10]; //单词属性值
};
int n=0;
danci word[20];
void error()
{
cout<<"词法错误,标志符不能以数字开头"<<endl;
exit(0);
}
int lex(char * buf)//词法分析
{
int i=0,j=0;
int n=0;
char Temp_name[10];
while(buf[i]!='\0')
{
if(buf[i]==' '||buf[i]=='\n')
i++;
else if(isalpha(buf[i])||buf[i]=='_')//标志符判断
{
Temp_name[j]=buf[i];
i++;
while(isalnum(buf[i]))
{
j++;
Temp_name[j]=buf[i];
i++;
}
memcpy(word[n].name,Temp_name,j+1);
word[n].name[j+1]='\0';
if(strcmp(word[n].name,"and")==0)
word[n].id=1;
else if(strcmp(word[n].name,"or")==0)
word[n].id=2;
else if(strcmp(word[n].name,"not")==0)
word[n].id=3;
else if(strcmp(word[n].name,"begin")==0)
word[n].id=4;
else if(strcmp(word[n].name,"if")==0)
word[n].id=5;
else if(strcmp(word[n].name,"then")==0)
word[n].id=6;
else if(strcmp(word[n].name,"while")==0)
word[n].id=7;
else if(strcmp(word[n].name,"do")==0)
word[n].id=8;
else if(strcmp(word[n].name,"end")==0)
word[n].id=9;
else
word[n].id=0;
n++;
j=0;
}
else if(isdigit(buf[i]))//数字判断
{
while(isdigit(buf[i]))
{
Temp_name[j]=buf[i];
i++;
j++;
word[n].id=26;
}
if(isdigit(buf[0]))
error();
memcpy(word[n].name,Temp_name,j+1);
word[n].name[j]='\0';
n++;
j=0;
}
else//运算符号判断
{
switch(buf[i])
{
case '>':if(buf[i+1]=='=')
{
i++;
word[n].id=10;
strcpy(word[n].name,">=");
}
else
{
word[n].id=11;
strcpy(word[n].name,">");
}
n++;break;
case '<':if(buf[i+1]=='=')
{
i++;
word[n].id=12;
strcpy(word[n].name,"<=");
}
else
{
word[n].id=13;
strcpy(word[n].name,"<");
}
n++;break;
case '=': word[n].id=14;strcpy(word[n].name,"=");n++;break;
case '!': if(buf[i+1]=='=')
{
i++;
word[n].id=15;strcpy(word[n].name,"!=");
}
else
{
word[n].id=16;strcpy(word[n].name,"!");
}
break;
case '(': word[n].id=17;strcpy(word[n].name,"(");n++;break;
case ')': word[n].id=18;strcpy(word[n].name,")");n++;break;
case '+': word[n].id=19;strcpy(word[n].name,"+");n++;break;
case '-': if(buf[i+1]=='>')
{
i++;
word[n].id=20;strcpy(word[n].name,"->");
n++;
}
else
{
word[n].id=21;
strcpy(word[n].name,"-");
}
n++;
break;
case '*': word[n].id=22;strcpy(word[n].name,"*");n++;break;
case '/': word[n].id=23;strcpy(word[n].name,"/");n++;break;
case ';': word[n].id=24;strcpy(word[n].name,";");n++;break;
case ':': word[n].id=25;strcpy(word[n].name,":");n++;break;
}
i++;
}
}
return n;
}
void main()
{
char buffer[30];
int i=0;
int length;
char *inword;
cout<<"输入表达式,以#结束 :"<<endl;
cin>>buffer[i];
while(buffer[i]!='#')
{
i++;
cin.get(buffer[i]);
}
buffer[i]='\0';
length=i+1;
inword=new char[length];
memcpy(inword,buffer,length);
length=lex(inword);
cout<<"词法分析结果如下:"<<endl;
cout<<'('<<"属性"<<' '<<"值"<<')';
for( i=0;i<length;i++)
{ cout<<'('<<word[i].id<<' '<<word[i].name<<')'; cout<<' ';}
cout<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -