?? 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 + -